Php 在Laravel中,我可以为日志外观设置默认上下文吗

Php 在Laravel中,我可以为日志外观设置默认上下文吗,php,laravel,Php,Laravel,我经常使用Log::facade,并且有一个名为LogHelper的助手类,它为我提供了一个静态方法LogHelper::context(),其中包括跟踪请求所需的许多键值。但是每次使用都必须键入它,这使得错误修剪和填充效率不高 我正在寻找一种默认情况下注入值的方法,并允许我在需要时覆盖它们 现在我就是这么用的 Log::debug('Request Started',LogHelper::context()); 我想要的是默认情况下注入上下文 Log::debug('Request star

我经常使用
Log::
facade,并且有一个名为
LogHelper
的助手类,它为我提供了一个静态方法
LogHelper::context()
,其中包括跟踪请求所需的许多键值。但是每次使用都必须键入它,这使得错误修剪和填充效率不高

我正在寻找一种默认情况下注入值的方法,并允许我在需要时覆盖它们

现在我就是这么用的

Log::debug('Request Started',LogHelper::context());
我想要的是默认情况下注入上下文

Log::debug('Request start');
如果需要,还可以选择覆盖:

Log::debug('请求已启动',['more'=>'context']+LogHelper::context());

另外,
LogHelper::context()
返回一个简单的
key=>value
数组,其中包含一些调试请求所需的人员,它不直接在消息中使用这些值的原因是因为我以结构化数据的形式登录到graylog,这样我就可以按任何键进行过滤。

有一种方法,但它并不漂亮。您可以创建自定义的monolog logger驱动程序。有关该过程的描述,请参阅

下面是一个可能的实现:

class ContextEnrichingLogger extends \Monolog\Handler\AbstractHandler {
 
    
    private $logger;

    public function __construct($level = Monolog\Logger::DEBUG, bool $bubble = true, $underlyingLogger = 'single') {
       $this->logger = Log::driver($underlyingLogger);
    }

    public function handle(array $record) {
        $record['context'] += LogHelper::context();
        return $this->logger->handle($record);
    }  

}

然后在
config/logging.php
中将其注册为自定义记录器:

return [ 
    'default' => 'enriched',
    //...
    'channels' => [
       // ...
       'enriched' => [
            'driver' => 'monolog',
            'handler' => ContextEnrichingLogger::class,
            'level' => env('APP_LOG_LEVEL', 'debug'),
            "with" => [
                "underlyingLogger" => env('LOG_CHANNEL', 'single')
            ]
        ]

   ]
];
     
我还没有测试这个特定的记录器,但这就是我定义其他自定义记录器的方式


请注意,这可能也可以通过自定义格式化程序实现,尽管我认为这可能是同样的问题。

有一种方法,但它并不漂亮。您可以创建自定义的monolog logger驱动程序。有关该过程的描述,请参阅

下面是一个可能的实现:

class ContextEnrichingLogger extends \Monolog\Handler\AbstractHandler {
 
    
    private $logger;

    public function __construct($level = Monolog\Logger::DEBUG, bool $bubble = true, $underlyingLogger = 'single') {
       $this->logger = Log::driver($underlyingLogger);
    }

    public function handle(array $record) {
        $record['context'] += LogHelper::context();
        return $this->logger->handle($record);
    }  

}

然后在
config/logging.php
中将其注册为自定义记录器:

return [ 
    'default' => 'enriched',
    //...
    'channels' => [
       // ...
       'enriched' => [
            'driver' => 'monolog',
            'handler' => ContextEnrichingLogger::class,
            'level' => env('APP_LOG_LEVEL', 'debug'),
            "with" => [
                "underlyingLogger" => env('LOG_CHANNEL', 'single')
            ]
        ]

   ]
];
     
我还没有测试这个特定的记录器,但这就是我定义其他自定义记录器的方式

注意,这可能也可以通过自定义格式化程序实现,尽管我认为这可能是同样的问题