【问题标题】:How to Log object?如何记录对象?
【发布时间】:2017-06-18 02:41:27
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: laravel laravel-5.2


    【解决方案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】:

      这会起作用,尽管记录整个模型会很快增加您的日志。

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

      print_r() 方法的第二个参数中的 true 是返回信息而不是打印它,这使得 Log 门面可以像字符串一样打印它。

      【讨论】:

      • 适用于 Laravel 5.7
      • 但请记住,您可能需要使用 \Log:: 才能使用正确的命名空间
      • 这在某些情况下会导致“分配的内存大小耗尽”异常。 (例如原生异常类)
      • 非常好。适用于 Laravel 6。
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        这在某些情况下会导致“分配的内存大小耗尽”异常。 (例如原生异常类)——Gokigooooks

        遇到同样的问题。

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

        添加-&gt;get()

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

        【讨论】:

          【解决方案5】:

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

          例如:

          use Illuminate\Support\Facades\Log;
          
          Log::info(json_encode($user)); 
          

          【讨论】:

            【解决方案6】:

            至少在 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}}} 
            
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2014-03-22
              • 2019-04-06
              • 1970-01-01
              • 1970-01-01
              • 2011-07-09
              • 2016-09-16
              • 2014-11-21
              相关资源
              最近更新 更多