【发布时间】:2017-06-18 02:41:27
【问题描述】:
我可以看到 Log 外观非常有用。 在 laravel 的文档中:
记录器提供 RFC 5424 中定义的八个记录级别: 紧急、警报、严重、错误、警告、通知、信息和调试。
但是,我将如何记录模型的实例?比如:
$user= User::find($user_id);
那么,是否可以记录$user 对象?
【问题讨论】:
标签: laravel laravel-5.2
我可以看到 Log 外观非常有用。 在 laravel 的文档中:
记录器提供 RFC 5424 中定义的八个记录级别: 紧急、警报、严重、错误、警告、通知、信息和调试。
但是,我将如何记录模型的实例?比如:
$user= User::find($user_id);
那么,是否可以记录$user 对象?
【问题讨论】:
标签: laravel laravel-5.2
没有。
第一个参数必须是字符串(或字符串对象表示)。如果您希望传递任何其他类型的(原始)数据或对象,您始终可以对它们进行 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 的更多信息。
【讨论】:
这会起作用,尽管记录整个模型会很快增加您的日志。
Log::info(print_r($user, true));
print_r() 方法的第二个参数中的 true 是返回信息而不是打印它,这使得 Log 门面可以像字符串一样打印它。
【讨论】:
\Log:: 才能使用正确的命名空间
我最近开始使用 Laravel,所以这肯定适用于 5.3 和 5.4,但不确定是否适用于早期版本。
我能想到的最快方法(适合较小的对象)是将对象转换为数组:
Log::debug((array) $object);
你可能想知道这怎么可能,调试方法的第一个参数(以及 Log 类中的错误、通知和其他日志记录方法)接受字符串作为第一个参数,我们正在传递数组。
因此,答案在日志编写器类的深处。有一个方法每次都会被调用来支持格式化消息,它看起来像这样:
/**
* 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方法每次都在格式化消息。
【讨论】:
这在某些情况下会导致“分配的内存大小耗尽”异常。 (例如原生异常类)——Gokigooooks
遇到同样的问题。
Log::info(print_r($request->user()->with('groups'), true ) );
添加->get()
Log::info(print_r($request->user()->with('groups')->get(), true ) );
【讨论】:
您可以通过 print_r 或 json_encode 进行记录。 json_encode 更具可读性。
例如:
use Illuminate\Support\Facades\Log;
Log::info(json_encode($user));
【讨论】:
至少在 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":"mmcglynn@example.net","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}}}
【讨论】: