2012-12-20 42 views
17
// in my PHP code 
$log = new Logger('LaurentCommand'); 
$log->pushHandler(new StreamHandler('./app/logs/LaurentCommand.log')); 
$log->addInfo("Start command",array('username' => 'Joe', 'Age' => '28')); 

結果在日誌文件LaurentCommand.log:如何不在獨白日誌行中顯示最後一個括號?

[2012年12月20日十時28分11秒] LaurentCommand.INFO:開始命令{ 「用戶名」: 「喬」, 「年齡」: 「28」} []

爲什麼這個括號最後?

回答

42

這就是額外的數據。 LineFormatter的默認格式爲"[%datetime%] %channel%.%level_name%: %message% %context% %extra%\n"。用戶名/年齡是上下文,並且通常爲空的額外結果導致此空數組[]

如果您使用處理器將數據附加到日誌記錄,通常會將其寫入額外的密鑰以避免與上下文信息發生衝突。如果確實是您的問題,您可以更改默認格式並省略%extra%

編輯:獨白1.11的LineFormatter有,讓你刪除這些構造一個$ ignoreEmptyContextAndExtra參數,所以你可以使用這個:

// the last "true" here tells it to remove empty []'s 
$formatter = new LineFormatter(null, null, false, true); 
$handler->setFormatter($formatter); 
+5

Seldaek意味着'$日誌=新記錄儀( 'LaurentCommand'); $ handler = new StreamHandler('./ app/logs/LaurentCommand.log'); $ handler-> setFormatter(new LineFormatter(「[%datetime%]%channel%。%level_name%:%message%%context%\ n」)); $ log-> pushHandler($ handler); $ log-> addInfo(「Start command」,array('username'=>'Joe','Age'=>'28'));' – nevvermind

+0

就像一個魅力。謝謝 :) –

4

我知道這是一個老問題,但我跑也將其納入,我想分享我的解決方案。

對數行末尾的方括號是由於Monolog的LineFormatter嘗試%extra%中的數據所致。括號是空數組的JSON表示。

要關閉這些括號,我最終必須用我自己的類繼承Monolog\Formatter\LineFormatter的子類並覆蓋它的convertToString($data)函數,以便在沒有數據存在的情況下返回空字符串。這是我的新的子類:

namespace My\Fancy\Monolog; 
use Monolog\Formatter\LineFormatter; 

class LineFormatter extends LineFormatter { 

    protected function convertToString($data) 
    { 
     if (null === $data || is_scalar($data)) { 
      return (string) $data; 
     } 

     // BEGIN CUSTOM CODE - This section added to prevent empty 
     // brackets from appearing at the end of log lines: 
     if ((is_array($data) && !$data) 
      || is_object($data) && !get_object_vars($data)) { 
      return ''; 
     } 
     // END CUSTOM CODE 

     $data = $this->normalize($data); 
     if (version_compare(PHP_VERSION, '5.4.0', '>=')) { 
      return $this->toJson($data); 
     } 

     return str_replace('\\/', '/', json_encode($data)); 
    } 
} 

您可以通過注射它的一個實例到你的獨白處理程序類,像這樣使用這個類:

$handler = new Monolog\Handler\StreamHandler('/path/to/my/logfile', 'debug'); 
$handler->setFormatter(new My\Fancy\Monolog\LineFormatter()); 
$monolog->pushHandler($handler); 

享受!

4

老問題,但拋出的另一個簡單的選擇:

$slackHandler = new \Monolog\Handler\SlackWebhookHandler(...); 
$slackHandler->getFormatter()->ignoreEmptyContextAndExtra(true); 
相關問題