php - Laravel Tap Formatter:我在哪里实际格式化消息?
问题描述
在我的 laravel 应用程序中,需要格式化一条我需要发送到 slack 的消息。因此,我将松弛日志通道设置为config/logging.php
:
'slack' => [
'driver' => 'slack',
'url' => /*Censored Hook URL*/,
'username' => 'MyApp',
'emoji' => ':gear:',
'level' => 'debug',
],
同样如文档中所见,我可以做一个独白格式化程序,因此我做了以下事情:
namespace App\Logging;
class SlackLogFormatter
{
/**
* Customize the given logger instance.
*
* @param \Illuminate\Log\Logger $logger
* @return void
*/
public function __invoke($logger)
{
foreach ($logger->getHandlers() as $handler) {
$handler->setFormatter(...);
}
}
}
并将其指定为点击我的日志:
'slack' => [
'driver' => 'slack',
'tap' => [App\Logging\SlackLogFormatter::class]
'url' => /*Censored Hook URL*/,
'username' => 'MyApp',
'emoji' => ':gear:',
'level' => 'debug',
],
但是在我的格式化程序中,我在哪里处理日志条目本身?我是说:
$handler->setFormatter
似乎不是类的方法\Illuminate\Log\Logger
。当我需要提供自定义格式时,我找不到需要重写的方法。我的意思是我有调用方法,然后呢?
解决方案
Dimitrios 几乎是正确的(或者这可能适用于旧版本)但正如 Xavier 所说,如果您准确复制该代码,您将收到错误
Return value of Monolog\Handler\AbstractProcessingHandler::processRecord() must be of the type array, null returned
你会想要做这样的事情,而不是:
<?php
namespace App\Logging;
use Monolog\Formatter\LineFormatter;
use Monolog\Handler\SlackWebhookHandler;
use Request;
class CustomiseFormatter
{
protected $request;
public function __construct(Request $request = null)
{
$this->request = $request;
}
public function __invoke($logger)
{
foreach ($logger->getHandlers() as $handler) {
if ($handler instanceof SlackWebhookHandler) {
$handler->setFormatter(new LineFormatter(
'[%datetime%] %channel%.%level_name%: %message% %context% %extra%'
));
$handler->pushProcessor([$this, 'processLogRecord']);
}
}
}
public function processLogRecord(array $record): array
{
$record['extra'] += [
'url' => env("APP_URL"),
];
return $record;
}
}
同样,与extra
修改方式一样,您可以更改任何其他值。
推荐阅读
- c++ - std::thread 不会让我的 CPU 负载超过 20%?
- objective-c - iOS decodeBase64ToImage returning nil on valid base 64 encoded image
- audio - AVAudioEngine crash on connect node
- java - Convert date from GMT timezone to local time zone -- using ISO_OFFSET_DATE_TIME
- javascript - 如何将选定的索引数据分配给我的工具提示数据?
- swift - Swift 4.2 Setter Getter, All paths through this function will call itself
- sql-server - 在 sql server db 上引入延迟以测试 API 中的超时
- uuid - Longest Version 4 GUID
- sql - MS Access:查询以列出一系列文件夹中的文件数
- laravel - PHPUNIT 测试 - 预期状态 200 但收到 500