私はlog4j2.xml
の<Pattern/>
要素の値を設定可能にしたいと考えています。 、 - (彼らは「彼らはスタックトレースしている場合でも、複数行にまたがるしてはならないのエントリをログに記録」という制約を持っている)我々のコードのLog4j2:環境変数に基づいてパターンを変更
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout>
<Pattern>%d %p %c{1.} [%t] %m%xEx{filters(${filters})}%n</Pattern>
</PatternLayout>
</Console>
あるユーザーが別のパターンを望んでいる:
は名目上、私たちは、このパターンを持っています
<Pattern>%replace{%d %p %c{1.} [%t] %m%xEx{filters(${filters})}}{(\n|\r)+}{, }%n</Pattern>
それぞれのユーザーは独自の環境を独自に指定できるため、パターンを選択できるようになりました。
<Pattern/>
の要素にはspecify the pattern using Environment Variablesの可能性があります。たとえば:$${env:USER:-default}
:
<Pattern>%d %p %c{1.} [%t] $${env:USER} %m%n</Pattern>
私もそうのような、it is possible to specify a default/fallback valueことを知っています。私は公称パターンをデフォルトにしたいし、別注環境を指定せずに作業するので、これは良いことです。
だから、私はこのパターンを試してみました:
<Pattern>$${env:LOG_SYSOUT_PATTERN:-%d %p %c{1.} [%t] %m%xEx{filters(${filters})}%n}</Pattern>
私の理解では、ユーザがLOG_SYSOUT_PATTERN
でパターンを指定することができますが、それ以外は通常のパターンにフォールバックするというものでした。
私は私のログエントリは次のように見えるように予想:
2016-09-27 10:47:32,073 INFO c.b.b.a.Engine [main] Sleeping AuditEngine for 1000 ms
しかし、失敗しているようです。私は実際に私のパターンを取得することはこれです:私はlog4j2の文字列補間の限界を超えて、説明しているユースケースは
${env:LOG_SYSOUT_PATTERN:-2016-09-27 10:47:29,642 INFO c.b.b.a.Engine [main] Sleeping AuditEngine for 1000 ms
}
ですか?
明らかに、別のlog4j2.xml
ファイルを指すために環境変数を使用することは可能ですが、1人のユーザーのために2つのファイルの保守と展開を必要としないソリューションが望ましいと思います。
Log4j 2.5とSLF4J 1.7.16を使用します。
、それを試してみてください。私の質問で説明したように、フォールバック値を持つマクロ展開の構文は '$$ {env:USER:-default}'であることはすでに知っていますが、大括弧の代わりにフォールバックを移動することをお勧めします。それは間違いなく有効です。実際、あなたのパターンを実行しようとしました。 ':-'をリテラルとして解釈します。不思議なことに、未定義マクロはまったく展開されず、代わりに文字通りに印刷されます: '$ {env:LOG_SYSOUT_PATTERN}: - 2016-09-27 14:45:59,425 INFO cbbaEngine [main] Sleeping AuditEngine for 1000 ms – Birchlabs