官方文档 https://laravel.com/docs/6.x/logging#creating-monolog-handler-channels
首先 新建一个 文件:
App\Logging\CustomizeFormatter.php
如官方文档所示,可以在 __invoke 方法里定制你的 logger,例如你想要 json 格式的日志的话:
foreach ($logger->getHandlers() as $handler) {
$handler->setFormatter(new JsonFormatter());
}
更多设置:
<?php
namespace App\Logging;
use Illuminate\Http\Request;
use Illuminate\Log\Logger;
use Monolog\Formatter\JsonFormatter;
use Monolog\Logger as Monologger;
use Monolog\Processor\IntrospectionProcessor;
use Monolog\Processor\MemoryUsageProcessor;
use Monolog\Processor\ProcessIdProcessor;
use Monolog\Processor\WebProcessor;
class CustomizeFormatter
{
protected $request;
public function __construct(Request $request = null)
{
$this->request = $request;
}
/**
* Customize the given logger instance.
*
* @param \Illuminate\Log\Logger $logger
* @return void
*/
public function __invoke(Logger $logger)
{
if ($this->request) {
foreach ($logger->getHandlers() as $handler) {
$handler->setFormatter(new JsonFormatter());
$handler->pushProcessor(new IntrospectionProcessor($handler->getLevel(), [], 4));
$handler->pushProcessor(new MemoryUsageProcessor());
$handler->pushProcessor(new WebProcessor());
$handler->pushProcessor(new ProcessIdProcessor);
$handler->pushProcessor([$this, 'headerProcessor']);
}
}
}
public function headerProcessor(array $record): array
{
$record['extra'] += [
'user_id' => $this->request->header('X-User-Id', 'guest'),
'roles' => $this->request->header('X-Roles', 'NULL'),
];
return $record;
}
}
输出的日志样本如下:
{ "message": "Undefind method: \"asdasdad\"", "context": {}, "level": 400, "level_name": "ERROR", "channel": "local", "datetime": "2020-05-11T17:05:07.231673+08:00", "extra": { "user_id": "guest", "roles": "NULL", "process_id": 13, "url": "/data/v1/download?action=asdasdad&token=1", "ip": "172.25.0.1", "http_method": "GET", "server": "_", "referrer": null, "memory_usage": "2 MB", "file": "/var/www/html/app/Http/Controllers/DownloadController.php", "line": 69, "class": "App\\Http\\Controllers\\DownloadController", "function": "init" } }