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

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

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

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

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

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


person Rubens Mariuzzo    schedule 12.04.2014    source источник


Ответы (3)


Поскольку 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;
});

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

[2014-04-12 23:07:35] local.INFO: Предоплаченная активация. [] {"пользователь":"анонимный","ip":::1"}

Дополнительная информация о процессорах Monolog: https://github.com/Seldaek/monolog/blob/master/doc/01-usage.md#using-processors


Дополнительно. Жестко запрограммированный extra указывает Monolog добавлять данные в качестве дополнительной информации (излишне говорить). На практике это делается для того, чтобы избежать переопределения любых данных контекста, добавленных в исходный вызов журнала.

person Rubens Mariuzzo    schedule 12.04.2014
comment
Для Laravel 5 просто создайте LogServiceProvider, добавьте его в свой config/app.php и добавьте тот же код $monolog в метод boot(). - person timetofly; 04.05.2017
comment
@Davidos, для Laravel 5.6+, см. здесь: stackoverflow.com/questions/52032203/ - person Andy White; 28.08.2018

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

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'),
    ],
    // ...
]

Документация по настройке Monolog

person Finesse    schedule 04.11.2018

Для тех, кто ищет laravel 7.x, это объясняется здесь, в официальном документе https://laravel.com/docs/7.x/logging#customizing-monolog-for-channels

отредактируйте config\logging.php и добавьте его в канал, на который вы хотите войти:

use Illuminate\Support\Facades\App;
...
'stack' => [
...
   'tap' => [App\Logging\CustomizeFormatter::class],
],

затем создайте файл App\Logging\CustomizeFormatter.php

<?php

namespace App\Logging;

use Monolog\Formatter\LineFormatter;

class CustomizeFormatter
{
    public function __invoke($logger)
    {
        foreach ($logger->getHandlers() as $handler) {
            $handler->setFormatter(new LineFormatter('custom logging - %level_name% %message% %context% %extra%'));
        }
    }
}
person 8ctopus    schedule 28.04.2020