2016-09-27 19 views
1

私は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を使用します。

答えて

0

あなたはパターン でエラーが発生しているが、私はこの主張が間違っていると思う

<Pattern>$${env:LOG_SYSOUT_PATTERN}:-%d %p %c{1.} [%t] %m%xEx{filters(${filters})}%n</Pattern>

+0

、それを試してみてください。私の質問で説明したように、フォールバック値を持つマクロ展開の構文は '$$ {env:USER:-default}'であることはすでに知っていますが、大括弧の代わりにフォールバックを移動することをお勧めします。それは間違いなく有効です。実際、あなたのパターンを実行しようとしました。 ':-'をリテラルとして解釈します。不思議なことに、未定義マクロはまったく展開されず、代わりに文字通りに印刷されます: '$ {env:LOG_SYSOUT_PATTERN}: - 2016-09-27 14:45:59,425 INFO cbbaEngine [main] Sleeping AuditEngine for 1000 ms – Birchlabs

関連する問題