23
// 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:コマンドを開始します{"username": "Joe"、 "Age": "28"} []

なぜ最後にこのブラケットがあるのですか?

4

4 に答える 4

54

それが余分なデータです。LineFormatterのデフォルトのフォーマットはです"[%datetime%] %channel%.%level_name%: %message% %context% %extra%\n"。ユーザー名/年齢はコンテキストであり、通常は空である余分なものは、この空の配列になり[]ます。

プロセッサを使用してデータをログレコードに添付する場合、コンテキスト情報との競合を回避するために、通常、プロセッサはデータを追加のキーに書き込みます。それが本当に問題である場合は、デフォルトの形式を変更して、を省略することができます%extra%

編集:Monolog 1.11の時点で、LineFormatterのコンストラクターには$ ignoreEmptyContextAndExtraパラメーターがあり、これらを削除できるため、次のように使用できます。

// the last "true" here tells it to remove empty []'s
$formatter = new LineFormatter(null, null, false, true);
$handler->setFormatter($formatter);
于 2012-12-20T11:31:23.773 に答える
9

古い質問ですが、別の簡単なオプションを捨てます:

$slackHandler = new \Monolog\Handler\SlackWebhookHandler(...);
$slackHandler->getFormatter()->ignoreEmptyContextAndExtra(true);
于 2017-02-04T12:09:53.113 に答える
5

これは古い質問ですが、私もそれに遭遇したので、解決策を共有したいと思います。

ログ行の最後の括弧は、MonologがのデータをどのようLineFormatterに試行するかによるものです。角かっこは、空の配列のJSON表現です。json_encode()%extra%

これらの角かっこをオフにするには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));
    }
}

このクラスは、次のように、そのインスタンスをMonologハンドラークラスに挿入することで使用できます。

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

楽しみ!

于 2013-11-12T18:34:55.740 に答える
2

symfony 4ソリューション:

  1. ロガーを作成します。

    use Monolog\Formatter\LineFormatter;
    
    class Formatter extends LineFormatter
    {
        public function __construct(
            $format = null,
            $dateFormat = null,
            $allowInlineLineBreaks = false,
            $ignoreEmptyContextAndExtra = false
        ) {
            parent::__construct($format, $dateFormat, $allowInlineLineBreaks, true);
        }
    }
    
  2. フォーマッタをservices.yml:で定義します

    log.custom.formatter:
      class: App\Formatter
    
  3. 必要な環境に合わせてフォーマッタを定義monolog.ymlします。

    handlers:
      main:
        type: stream
        path: "%kernel.logs_dir%/%kernel.environment%.log"
        level: debug
        channels: ["!event"]
        formatter: log.custom.formatter
    
于 2019-09-03T10:56:22.433 に答える