OSGi環境でLog4j2を使用しようとしています。私はそれまでのところ動作するようにしましたが、コンソールとファイルからログを調べているうちに、一部が欠落していることがわかりました。特に静的メソッドから呼び出されたログです。 下の例のLog
クラスは、私の同僚がcreateメソッドを使用してロギング機能をより簡単に呼び出せるようにする便利なクラスです(ちょうどString
の例では、残念なことです)。これは、Log4j2ロガーからそれぞれのメソッドを呼び出すLogger
を内部的に持つLogクラスのインスタンスを作成するだけです。Log4j2を使用した静的メソッドからのログ
私のプロジェクトで単純なエラーがありますか、Log4j2 ではなく、は静的メソッドからファイルにログできますか?
は、ここではもう少し明確にするためのコードの例です:私は非静的メソッドから呼び出すコードをだ
Log log = Log.testLog();
log.info("non static log");
を。 そして、ここではtestLog()
-methodです:
public static Log testLog() {
Log.create(Log.class).info("static log");
return Log.create(Log.class);
}
結果: 両方#info()
呼び出しがコンソールアペンダに書き込むが、のみ「非静的ログ」のメッセージがファイルに書き込まれます。ここで
は私のlog4j2.xml
です:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<Console name="Console">
<PatternLayout pattern="!ENTRY %logger{1.} %level %d{DEFAULT} [%t]%n!MESSAGE %msg%n%n"/>
</Console>
<RollingFile name="RollingFile" fileName="${sys:osgi.logfile}.log4j.log"
filePattern="${sys:osgi.logfile}.log4j_bak_%i.log">
<PatternLayout>
<pattern>!ENTRY %logger{1.} %level %d{DEFAULT} [%t]\n!MESSAGE %msg%n%n</pattern>
</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="1 MB"/>
</Policies>
<DefaultRolloverStrategy max="10"
fileIndex="min"/>
</RollingFile>
</Appenders>
<Loggers>
<Root level="TRACE" additivity="false">
<AppenderRef ref="RollingFile"/>
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
「Log.create(Log.class)」を一度呼び出すのはなぜですか? – Thomas
それは何か変わるでしょうか?その背後には本当に理由はありません。私はすぐにテスト目的のためにこのメソッドを一緒に打ちました。 –
私は確信していませんが、 'Log'インスタンスを作り直すとバッファをクリアするかもしれません。それ以外にも、通常slf4jやコモンズロギングなどのlog4jのラッパーを使用しているため、ロガーを作成するためにファクトリを使用しますが、AFAIK log4jはまったく同じ理由で同様の機能を提供します。そのインスタンス。 – Thomas