// 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"} []
なぜ最後にこのブラケットがあるのですか?
それが余分なデータです。 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);
古い質問ですが、別の簡単なオプションを捨てます:
$slackHandler = new \Monolog\Handler\SlackWebhookHandler(...);
$slackHandler->getFormatter()->ignoreEmptyContextAndExtra(true);
これは古い質問ですが、私もそれに遭遇したので、解決策を共有したいと思います。
ログ行の最後の括弧は、MonologのLineFormatter
が_%extra%
_のデータをjson_encode()
しようとする方法によるものです。角かっこは、空の配列の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));
}
}
_
このクラスは、次のように、インスタンスをMonologハンドラークラスに挿入することで使用できます。
_$handler = new Monolog\Handler\StreamHandler('/path/to/my/logfile', 'debug');
$handler->setFormatter(new My\Fancy\Monolog\LineFormatter());
$monolog->pushHandler($handler);
_
楽しい!
Symfony 4ソリューション:
ロガーを作成する:
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);
}
}
フォーマッターをservices.yml
で定義します。
log.custom.formatter:
class: App\Formatter
必要な環境に合わせてmonolog.yml
でフォーマッターを定義します。
handlers:
main:
type: stream
path: "%kernel.logs_dir%/%kernel.environment%.log"
level: debug
channels: ["!event"]
formatter: log.custom.formatter