Laravel 如何记录对象?

Laravel 如何记录对象?,laravel,laravel-5.2,Laravel,Laravel 5.2,我可以看出Log facade非常有用。 在laravel的文件中: 记录器提供RFC 5424中定义的八个日志记录级别: 紧急、警报、严重、错误、警告、通知、信息和调试 但是,如何记录模型的实例?例如: $user= User::find($user_id); use Illuminate\Support\Facades\Log; Log::info(json_encode($user)); 那么,是否可以记录$user对象?否。 第一个参数必须是字符串(或字符串对象表示形式)。如果希

我可以看出Log facade非常有用。 在laravel的文件中:

记录器提供RFC 5424中定义的八个日志记录级别: 紧急、警报、严重、错误、警告、通知、信息和调试

但是,如何记录模型的实例?例如:

$user= User::find($user_id);
use Illuminate\Support\Facades\Log;

Log::info(json_encode($user)); 
那么,是否可以记录
$user
对象?

否。

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

<?php 

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

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

这将起作用,尽管记录整个模型会使日志增长得相当快

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

print_r()方法的第二个参数中的true返回信息,而不是打印信息,这允许日志facade像字符串一样打印信息。

我最近开始使用Laravel,因此这在5.3和5.4中肯定有效,不一定适用于早期版本

我能想到的最快的方法(适合较小的对象)是将对象投射到数组:

Log::debug((array) $object);
你可能想知道这是怎么回事,调试方法的第一个参数(以及日志类中的error、notice和其他日志记录方法)接受字符串作为第一个参数,我们正在传递数组

因此,答案在LogWriter类中有很深的含义。有一个方法每次都被调用以支持格式化消息,它如下所示:

/**
 * 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;
}
此外,为了进一步澄清问题,您可以查看: 您将看到formateMessage方法每次都对消息进行格式化。

这在某些情况下会导致“分配的内存大小耗尽”异常。(例如本机异常类)–Gokigoooks

我也有同样的问题

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


您可以通过打印或json编码进行日志记录。json_编码更具可读性

例如:

$user= User::find($user_id);
use Illuminate\Support\Facades\Log;

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

与Laravel 5.7配合良好,但请记住,您可能需要使用
\Log::
来使用正确的名称空间。在某些情况下,这会导致“已分配内存大小已耗尽”异常。(例如本机异常类)非常好。与Laravel 6合作。