2016-09-15 34 views
2

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> 
+0

「Log.create(Log.class)」を一度呼び出すのはなぜですか? – Thomas

+0

それは何か変わるでしょうか?その背後には本当に理由はありません。私はすぐにテスト目的のためにこのメソッドを一緒に打ちました。 –

+0

私は確信していませんが、 'Log'インスタンスを作り直すとバッファをクリアするかもしれません。それ以外にも、通常slf4jやコモンズロギングなどのlog4jのラッパーを使用しているため、ロガーを作成するためにファクトリを使用しますが、AFAIK log4jはまったく同じ理由で同様の機能を提供します。そのインスタンス。 – Thomas

答えて

1

は最後のOSGi(この場合は春分のフレームワーク)である私の特定の問題の源を発見しました。私のアプリケーションはosgi.logfileシステムプロパティを使って、ログを保存する場所を指しています。

残念なことに、Equinoxはそのプロパティを作成するだけでなく、起動時に別の場所に変更します。 Log4j2については、このシステムプロパティを取得するために${sys:osgi.logfile}を使用しましたが、いくつかの特定のプラグインが非常に早く開始したため、Log4j2はまだこれらのプラグイン(詳細にはLoggerContext)に対して間違った(別名古い)

この場合に役立つものは、まだ古い場所が残っていたLoggerContextの単純なLoggerContext.reconfigure()でした。

関連する問題