如何记录对象?

sim*_*imo 30 laravel laravel-5.2

我可以看到Log facade非常有用.在laravel文档中:

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

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

$user= User::find($user_id);
Run Code Online (Sandbox Code Playgroud)

那么,是否可以记录$user对象?

Rob*_*eca 67

这将有效,尽管记录整个模型会很快增加您的日志.

Log::info(print_r($user, true));
Run Code Online (Sandbox Code Playgroud)

真正的的print_r()方法的第二个参数返回信息而不是打印它,这允许登录门面打印它像一个字符串.

  • 但请记住,您可能需要使用 `\Log::` 来使用正确的命名空间 (2认同)
  • 在某些情况下,这会导致“分配的内存大小耗尽”异常。(例如本机异常类) (2认同)

use*_*966 16

您可以通过 print_r 或 json_encode 进行记录。json_encode 更具可读性。

例如:

use Illuminate\Support\Facades\Log;

Log::info(json_encode($user)); 
Run Code Online (Sandbox Code Playgroud)


vko*_*vic 11

我最近开始使用 Laravel,所以这肯定适用于 5.3 和 5.4,但不确定是否适用于早期版本。

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

Log::debug((array) $object);
Run Code Online (Sandbox Code Playgroud)

您可能想知道这怎么可能,调试方法的第一个参数(以及 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;
}
Run Code Online (Sandbox Code Playgroud)

另外为了澄清一些事情,您可以查看: https://github.com/laravel/framework/blob/5.4/src/Illuminate/Log/Writer.php#L199,您会看到 formateMessage 方法每次都会格式化消息。


jan*_*nej 7

在 Laravel 8 及更高版本中,无需在日志语句中使用print_r()Nor 。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}}} 

Run Code Online (Sandbox Code Playgroud)


Gia*_*mPy 4

不。

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

<?php 

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

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

或者:

<?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()]);
Run Code Online (Sandbox Code Playgroud)

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