Как регистрировать объект?

Я вижу, что фасад Log очень полезен. В документах laravel:

Регистратор предоставляет восемь уровней регистрации, определенных в RFC 5424: аварийный, предупреждающий, критический, ошибка, предупреждение, уведомление, информация и отладка.

Но как я могу зарегистрировать экземпляр модели? например, например:

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

тогда можно ли зарегистрировать объект $user?

Ответ 1

Это будет работать, хотя регистрация всей модели будет довольно быстро увеличивать ваш журнал.

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

true во втором параметре метода print_r() возвращает информацию вместо ее печати, что позволяет фасаду журнала печатать его как строку.

Ответ 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()]);

Подробнее о методах подписи здесь.

Ответ 3

Недавно я начал использовать Laravel, поэтому это, безусловно, работает в 5.3 и 5.4, не уверен в более ранних версиях.

Самый быстрый способ, который я могу придумать (подходит для меньших объектов), - это бросить объект в массив:

Log::debug((array) $object);

Возможно, вам интересно, как этот возможный первый параметр метода отладки (а также ошибки, уведомления и другие методы ведения журнала в классе журнала) принимает строку как первый параметр, и мы передаем массив.

Итак, ответ лежит глубоко в классе журнала записи. Существует метод, который каждый раз вызывается для поддержки форматирования сообщений, и он выглядит так:

/**
 * 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 ) );

Добавить ->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);