2012-12-20 5 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日10時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(新しいLineFormatter( "[%datetime%]%チャネル%。%レベル名%:%メッセージ%%コンテキスト%\ n")); $ log-> pushHandler($ handler); $ log-> addInfo( "Start command"、array( 'username' => 'Joe'、 'Age' => '28')); ' – nevvermind

+0

チャームのように動作します。ありがとう:) –

4

私はこれが古い質問ですけど、私は走りましたそれにも私のソリューションを共有したいと思います。

ログラインの末尾にある括弧は、Monologのがjson_encode()のデータを%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);