2016-09-21 120 views
1

我需要laravel日誌的格式更改爲JSON格式是這樣的:如何改變laravel日誌格式?

{ 
    "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":[ 

    ] 
} 
+0

[This one](http://laravel.io/forum/02-09-2014-laraverl-custom-logs)? –

+0

@SulthanAllaudeen no。我需要更改日誌的標準輸出。 –

回答

3

引導/ 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 <[email protected]> 
*/ 
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; 
    } 

} 
+0

大多數情況下,您的解決方案都非常有幫助,但是我從JSON序列化中發現了一些令人頭疼的問題,並且無法正常運行。 –