如何记录对象?

时间:2017-02-01 11:10:46

标签: laravel laravel-5.2

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

  

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

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

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

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

5 个答案:

答案 0 :(得分:50)

虽然记录整个模型会很快增长您的日志,但这将有效。

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

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

答案 1 :(得分:1)

第一个参数必须是字符串(或字符串对象表示)。如果您希望传递任何其他类型的(原始)数据或对象,您可以随时对它们进行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的更多信息。

答案 2 :(得分:1)

我最近开始使用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方法每次都格式化消息。

答案 3 :(得分:0)

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

有同样的问题。

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

添加->get()

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

答案 4 :(得分:0)

您可以通过print_r或json_encode登录。 json_encode更具可读性。

例如:

use Illuminate\Support\Facades\Log;

Log::info(json_encode($user);