Как добавить данные для всех записей журнала в Laravel?

StackOverflow https://stackoverflow.com//questions/23037393

  •  21-12-2019
  •  | 
  •  

Вопрос

Я хотел бы добавить некоторые данные для всех записей журнала в моем приложении Laravel.

Я думаю, что это будет полезно знать имя пользователя текущего пользователя и / или IP-адреса клиента.

В настоящее время я добавляю его вручную, делая:

Log::info('Pre-paid activation.', array('username' => Auth::user()->username));
.

Но я хотел бы знать, как сделать добавить слушатель или что-то, чтобы сделать ALL LOG ROCKE, имейте имя пользователя (если есть).

Это было полезно?

Решение

Поскольку Laravel выходит из коробки с monolog , это довольно быстро. Он может быть легко достигнут путем редактирования app/start/global.php и добавьте следующее после линии, которая начинается с: Log::useFiles:

Log::useFiles(storage_path().'/logs/laravel.log');
$monolog = Log::getMonolog();
$monolog->pushProcessor(function ($record) {
    $record['extra']['user'] = Auth::user() ? Auth::user()->username : 'anonymous';
    $record['extra']['ip'] = Request::getClientIp();
    return $record;
});
.

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

[2014-04-12 23:07:35] local.info: Предварительная оплаченная активация. [] {«Пользователь»: «Аноним», «IP»: «:: 1»}

Больше информации о монологе процессоров: https://github.com/seldaek/monolog/blob/master/doc/01-usage.md#using-processors


EXTRACE: Харкодированный генеракодицетагCode заключается в том, чтобы сказать монолоту, чтобы добавить данные в качестве дополнительной информации (избыточности, чтобы сказать). В практике это следует избегать переопределения любых контекстных данных, добавленных в оригинальном вызове журнала.

Другие советы

в Laravel 5 Вы можете сделать это, настраивая монолог.Сначала создайте класс, который настраивает монолог, поэтому он добавляет пользовательскую информацию в записи журнала:

namespace App\Logging;

use App\Models\User;
use Illuminate\Foundation\Application;
use Illuminate\Http\Request;
use Illuminate\Log\Logger;

class AddUserInformation
{
    protected $request;

    public function __construct(Request $request = null)
    {
        $this->request = $request;
    }

    public function __invoke(Logger $logger)
    {
        if ($this->request) {
            foreach ($logger->getHandlers() as $handler) {
                $handler->pushProcessor([$this, 'processLogRecord']);
            }
        }
    }

    public function processLogRecord(array $record): array
    {
        $record['extra'] += [
            'user' => $this->request->user()->username ?? 'guest',
            'ip' => $this->request->getClientIp()
        ];

        return $record;
    }
}
. Затем соедините класс к регистратеру Laravel, добавив его в настройку канала в файле config/logging.php:

// ...
'channels' => [
    'single' => [
        'driver' => 'single',
        'tap' => [\App\Logging\AddUserInformation::class],
        'path' => storage_path('logs/laravel.log'),
        'level' => env('LOG_LEVEL', 'debug'),
    ],
    // ...
]
.

Документация о настройке монолога

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top