laravel 如何记录对象?

jaxagkaj  于 2023-11-20  发布在  其他
关注(0)|答案(6)|浏览(112)

我可以看到Log facade非常有用。在laravel的文档中:
日志记录器提供RFC 5424中定义的八个日志记录级别:紧急,警报,关键,错误,警告,通知,信息和调试。
但是,如何记录模型的示例?例如:

$user= User::find($user_id);

字符串
那么是否可以记录$user对象呢?

s6fujrry

s6fujrry1#

这是可行的,尽管记录整个模型会使日志增长得相当快。

Log::info(print_r($user, true));

字符串
print_r()方法的第二个参数中的true返回信息而不是打印信息,这允许Log facade将其打印为字符串。

kkih6yb8

kkih6yb82#

您可以通过print_r或json_encode记录日志。json_encode更具可读性。
举例来说:

use Illuminate\Support\Facades\Log;

Log::info(json_encode($user));

字符串

jtw3ybtb

jtw3ybtb3#

我最近开始使用Laravel,所以这在5.3和5.4中肯定有效,不确定是否适用于早期版本。
我能想到的最快的方法(适用于较小的对象)是将对象转换为数组:

Log::debug((array) $object);

字符串
你可能想知道这怎么可能,debug方法的第一个参数(以及error,notice和Log类中的其他日志记录方法)接受string作为第一个参数,我们正在传递数组。
所以,答案就在log writer类中。有一个方法每次都被调用来支持格式化消息,它看起来像这样:

/**
 * Format the parameters for the logger.
 *
 * @param  mixed  $message
 * @return mixed
 */
protected function formatMessage($message)
{
    if (is_array($message)) {
        return var_export($message, true);
    } elseif ($message instanceof Jsonable) {
        return $message->toJson();
    } elseif ($message instanceof Arrayable) {
        return var_export($message->toArray(), true);
    }

    return $message;
}


为了进一步说明问题,您可以查看:https://github.com/laravel/framework/blob/5.4/src/Illuminate/Log/Writer.php#L199,您将看到formateMessage方法每次都会格式化消息。

cgfeq70w

cgfeq70w4#

在Laravel 8及更高版本中,不需要在日志语句中使用print_r()json_encode()
使用第二个参数传递数组。例如:

Log::info('My message', ['user' => $user]);

// The Output will be

[2021-08-17 09:23:13] local.INFO: test {"user":{"App\\Models\\User":{"name":"Rosalia Mraz Jr.","email":"[email protected]","email_verified_at":"2021-08-17T07:23:13.604361Z","updated_at":"2021-08-17T07:23:13.000000Z","created_at":"2021-08-17T07:23:13.000000Z","id":29,"tax_rate":25}}}

字符串

wyyhbhjk

wyyhbhjk5#

没有

第一个参数必须是字符串(或字符串对象表示)。如果您希望传递任何其他类型的(原始)数据或对象,您可以始终对它们进行JSON编码,并将它们推送到上下文设置中,如下所示:

<?php 

$user = User::find($user_id);

\Log::error("Something happened to User {$user_id}.", ['object' => $user->toJson()]);

字符串
或者:

<?php

// User.php
[...]

class User 
{
    [...]

    public function __toString()
    {
        return "{$this->id}";
    }
}

// [...]
$user = User::find($user_id);

\Log::error("Something happened to User {$user}.", ['object' => $user->toJson()]);


您可以找到有关方法签名here的更多信息。

pxy2qtax

pxy2qtax6#

在某些情况下,这会导致“分配的内存大小耗尽”异常。(例如,本地异常类)-Gokigoooks
有同样的问题。

Log::info(print_r($request->user()->with('groups'), true ) );

字符串
添加->get()

Log::info(print_r($request->user()->with('groups')->get(), true ) );

相关问题