如何将数据添加到Laravel中的所有日志记录?

时间:2014-04-12 23:33:01

标签: laravel laravel-4 monolog

我想在Laravel应用程序中的所有日志记录中添加一些数据。

我认为了解当前用户的用户名和/或客户端IP地址会很有帮助。

目前我手动添加:

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

但我想知道如何添加一个监听器或其他东西使所有 log recorder具有用户名(如果有的话)。

3 个答案:

答案 0 :(得分:8)

由于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:预付费激活。 [] {“user”:“anonymous”,“ip”:“:: 1”}

有关Monolog处理器的更多信息:https://github.com/Seldaek/monolog/blob/master/doc/01-usage.md#using-processors


额外:硬编码extra是告诉Monolog将数据添加为额外信息(多余的信息)。在实践中,这是为了避免覆盖原始日志调用中添加的任何上下文数据。

答案 1 :(得分:0)

在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;
    }
}

然后通过将类添加到config/logging.php文件中的通道设置中,将类连接到Laravel记录器:

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

A documentation about customising Monolog

答案 2 :(得分:0)

对于那些正在寻找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%'));
        }
    }
}