扩展 Laravel 日志前缀以包含自定义环境变量

Adr*_*nch 1 laravel monolog laravel-5.7

对于 Laravel 5.7 应用程序,我想向默认日志前缀添加一些额外的信息。

\n\n

日志条目当前如下所示:

\n\n
[2020-05-13 13:07:42] production.INFO: Information here...\n
Run Code Online (Sandbox Code Playgroud)\n\n

我想扩展前缀以使其:

\n\n
[2020-05-13 13:07:42] PREFIX.production.INFO: Information here...\n
Run Code Online (Sandbox Code Playgroud)\n\n

来自PREFIX环境变量LOG_PREFIX:

\n\n
LOG_CHANNEL=daily\nLOG_PREFIX=PREFIX\n
Run Code Online (Sandbox Code Playgroud)\n\n

我不介意在自定义格式化程序中使用正则表达式将 production.INFO 更改为 PREFIX.production.INFO 。

\n\n

我已向日志通道添加了一个水龙头:

\n\n
\'daily\' => [\n    \'driver\' => \'daily\',\n    \'path\' => storage_path(\'logs/laravel.log\'),\n    \'level\' => \'debug\',\n    \'days\' => 7,\n    \'tap\' => [App\\Logging\\CustomizeFormatter::class],\n]\n
Run Code Online (Sandbox Code Playgroud)\n\n

我在 CustomizeFormatter 类的调用方法中遇到了困难:

\n\n
class CustomizeFormatter\n{\n    /**\n     * Customize the given logger instance.\n     *\n     * @param  \\Illuminate\\Log\\Logger  $logger\n     * @return void\n     */\n    public function __invoke($logger)\n    {\n        // What to add here?\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

那里可以用什么来做我需要的事情?

\n\n

这是错误的道路吗?

\n\n

谢谢。

\n\n

使用此处找到的答案/sf/answers/2400232761/我可以使用以下命令在消息末尾添加前缀作为额外信息:

\n\n
public function __invoke($logger)\n{\n    foreach ($logger->getHandlers() as $handler) {\n      $handler->pushProcessor(function ($record) {\n          $record[\'extra\'][\'prefix\'] = env(\'LOG_PREFIX\');\n          return $record;\n      });\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

查看 $record,我没有看到完整的日志文本,只有自定义部分:

\n\n
array:7 [\xe2\x96\xbc\n  "message" => "Information here..."\n  "context" => []\n  "level" => 200\n  "level_name" => "INFO"\n  "channel" => "production"\n  "datetime" => DateTime @1589377784 {#953 \xe2\x96\xb6}\n  "extra" => []\n]\n
Run Code Online (Sandbox Code Playgroud)\n

Rem*_*mul 5

将其添加到 extras 不会按照您想要的方式显示它,这是默认的行格式:

[%datetime%] %channel%.%level_name%: %message% %context% %extra%
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,额外的内容在最后,所以它会产生这样的结果:

[2020-05-13 16:50:20] development.INFO: [] {"prefix":"MyPrefix"}
Run Code Online (Sandbox Code Playgroud)

您可以这样做:

<?php

namespace App\Logging;

use Illuminate\Log\Logger;
use Illuminate\Support\Arr;
use Monolog\Formatter\LineFormatter;

class CustomizeFormatter
{
    /**
     * Customize the given logger instance.
     *
     * @param  Logger  $logger
     *
     * @return void
     */
    public function __invoke($logger)
    {
        foreach ($logger->getHandlers() as $handler) {
            $handler->pushProcessor(function ($record) {
                return Arr::add($record, 'prefix', env('LOG_PREFIX'));
            });
            $handler->setFormatter(tap(new LineFormatter(
                "[%datetime%] %prefix%.%channel%.%level_name%: %message% %context% %extra%\n",
                'Y-m-d H:i:s',
                true,
                true
            ), function ($formatter) {
                $formatter->includeStacktraces();
            }));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这将产生以下结果:

[2020-05-13 16:52:24] MyPrefix.development.INFO: []  
Run Code Online (Sandbox Code Playgroud)

我们在这里所做的是添加一个新处理器并向其添加密钥prefix。然后我们可以在行格式化程序上使用这个键,并能够决定我们想要在哪里显示它%prefix%