Php Laravel Tap格式化程序:我在哪里实际格式化消息?
在我的laravel应用程序中,需要将需要发送到slack的消息格式化。因此,我在Php Laravel Tap格式化程序:我在哪里实际格式化消息?,php,logging,laravel-5.6,formatter,Php,Logging,Laravel 5.6,Formatter,在我的laravel应用程序中,需要将需要发送到slack的消息格式化。因此,我在config/logging.php中设置了一个空闲日志通道: 'slack' => [ 'driver' => 'slack', 'url' => /*Censored Hook URL*/, 'username' => 'MyApp', 'emoji' => ':gear:', 'level' =&g
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(...);
}
}
}
namespace App\Logging;
use Monolog\Formatter\LineFormatter;
class SlackLogFormatter
{
/**
* Customize the given logger instance.
*
* @param \Illuminate\Log\Logger $logger
* @return void
*/
public function __invoke($logger)
{
foreach ($logger->getHandlers() as $handler) {
if ($handler instanceof SlackWebhookHandler) {
$format=""; // Look on the Monolog's Line formatter documentation
$formatter= new LineFormatter($format,"Y-m-d H:i:s");
$handler->pushProcessor(function ($record) {
//Append extra info of formatting here
});
$handler->setFormatter($formatter);
}
}
}
}
并将其指定为“点击我的日志”:
'slack' => [
'driver' => 'slack',
'tap' => [App\Logging\SlackLogFormatter::class]
'url' => /*Censored Hook URL*/,
'username' => 'MyApp',
'emoji' => ':gear:',
'level' => 'debug',
],
但是在我的格式化程序中,我在哪里处理日志条目本身呢?我的意思是:
$handler->setFormatter
似乎不是\illumb\Log\Logger
类的方法slack的格式化程序应如下所示:
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(...);
}
}
}
namespace App\Logging;
use Monolog\Formatter\LineFormatter;
class SlackLogFormatter
{
/**
* Customize the given logger instance.
*
* @param \Illuminate\Log\Logger $logger
* @return void
*/
public function __invoke($logger)
{
foreach ($logger->getHandlers() as $handler) {
if ($handler instanceof SlackWebhookHandler) {
$format=""; // Look on the Monolog's Line formatter documentation
$formatter= new LineFormatter($format,"Y-m-d H:i:s");
$handler->pushProcessor(function ($record) {
//Append extra info of formatting here
});
$handler->setFormatter($formatter);
}
}
}
}
并将slack配置为不发送附件,以使格式化程序正常工作:
'slack' => [
'driver' => 'slack',
'tap' => [App\Logging\SlackLogFormatter::class]
'url' => /*Censored Hook URL*/,
'username' => 'MyApp',
'emoji' => ':gear:',
'level' => 'debug',
'attachment' => FALSE,
],
setFormatter
方法采用新的Monolog格式化程序,如所示:
此外,pushProcessor
允许您在邮件上填充额外字段,例如在日志邮件上显示表情符号:
public function __invoke($logger)
{
foreach ($logger->getHandlers() as $handler) {
if ($handler instanceof SlackWebhookHandler) {
$format="%emoji% %message%";
$formatter= new LineFormatter($format,"Y-m-d H:i:s");
$handler->pushProcessor(function ($record) {
$record['emoji']=":poop:";
});
$handler->setFormatter($formatter);
}
}
}
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;
}
}
有趣的是,当我保留pushProcessor部分时,我遇到了完全相同的问题:`Monolog\Handler\AbstractProcessingHandler::processRecord()的返回值必须是数组类型,null返回`Mine在Laravel 5.7版本及更早版本上进行了测试。