如何修改laravel日志格式


How to change laravel logs format?

我需要将laravel日志的格式更改为json格式,如下所示:

{
   "time":"2015-10-06 15:45:36",
   "host":"192.000.000",
   "protocol”:”http, tcp",
   "remote-addrress": "192.000.001",
   "user":"user-logged",
   "level": "warning",
   "message":"exception",
}  

如何做到这一点?

我尝试把下一个代码在bootstrap/app.php,但我不知道如何改变json格式/对象。

$app->configureMonologUsing(function ($monolog) use ($app) {
    // Stream handlers
    $logPath = $app->storagePath().'/logs/test.log';
    $logLevel = 'Monolog'Logger::DEBUG;
    $logStreamHandler = new 'Monolog'Handler'StreamHandler($logPath, $logLevel);
    $formatter = new 'Monolog'Formatter'JsonFormatter();
    $logStreamHandler->setFormatter($formatter);
    $monolog->pushHandler($logStreamHandler);
});

这是结果:

{
   "message":"info",
   "context":[
   ],
   "level":200,
   "level_name":"INFO",
   "channel":"local",
   "datetime":{
      "date":"2016-09-22 10:33:38.318064",
      "timezone_type":3,
      "timezone":"UTC"
   },
   "extra":[
   ]
}

引导/app.php

$app->configureMonologUsing(function ($monolog) use ($app) {
    // Stream handlers
    $logPath = $app->storagePath() . '/logs/laravel.log';
    $logLevel = 'Monolog'Logger::DEBUG;
    $logStreamHandler = new 'Monolog'Handler'StreamHandler($logPath, $logLevel);
    // Formatting
    $formatter = new 'App'Components'Log'Formatter'JsonFormatter();
    $logStreamHandler->setFormatter($formatter);
    $monolog->pushHandler($logStreamHandler);
});

软件/组件/日志/格式化程序/JsonFormatter.php

<?php
namespace App'Components'Log'Formatter;
use Monolog'Formatter'JsonFormatter as BaseJsonFormatter;
/**
 * Class JsonFormatter
 *
 * @package App'Components'Log'Formatter
 * @author Miguel Borges <miguelborges@miguelborges.com>
 */
class JsonFormatter extends BaseJsonFormatter
{
    const APPLICATION = 'My application';
    /**
     * {@inheritdoc}
     */
    public function format(array $record)
    {
        $record = [
            'time' => $record['datetime']->format('Y-m-d H:i:s'),
            'application' => self::APPLICATION,
            'host' => request()->server('SERVER_ADDR'),
            'remote-addrress' => request()->server('REMOTE_ADDR'),
            'level' => $record['level_name'],
            'message' => $record['message']
        ];
        if (!empty($record['extra'])) {
            $record['payload']['extra'] = $record['extra'];
        }
        if (!empty($record['context'])) {
            $record['payload']['context'] = $record['context'];
        }
        $json = $this->toJson($this->normalize($record), true) . ($this->appendNewline ? "'n" : '');
        return $json;
    }
}

您可以在config/logging.php文件中指定您使用的日志通道中的日志格式化程序。

    'channels' => [
        'single' => [
            'driver' => 'single',
            'path' => storage_path('logs/laravel.log'),
            'level' => env('LOG_LEVEL', 'debug'),
            // THIS IS THE LINE YOU SHOULD ADD
            'formatter' => Monolog'Formatter'JsonFormatter::class,
        ],
        // Other channels
    ],