2016-04-17 9 views
0

私は非常に多くのクラスを持つjava jaxrs Webサーバーを持っています。各クラスは異なるログフレームワークを使用します。それらのほとんどはslf4jを使い、いくつかはorg.apache.commons.loggingを使います。また、log4jをログに使用した私のプログラムでは、hadoop 1.2.0を使用しています。リクエストごとに1つのファイルに異なるログフレームワークを記録する

リクエストごとに異なるログファイル(リクエストごとに実行されるスレッド)とサーバー用の別のログファイルを作成したいとします。 私はこの目的のためにMDCとsiftingappenderを使用しましたが、スレッドログに書かれたslf4jログファイルのみでした。 hadoopログは別のログファイルに書き込まれ、apache.commons.loggingログはサーバーログファイルに書き込まれます。 各リクエストのログを1つのファイルに保存するにはどうすればよいですか。

お願いクラス数が多いため、すべてのログファイルをlog4jに変更したくないと考えてください。また、jarファイルなので、hadoopログフレームワークも変更できません。

誰かが私を助けることができますか? (私の英語が良くない場合はお詫びします)

+0

あなたにはどのようなプロジェクトがありますか?それはwebappですか? –

+0

これは安らかなWebサーバーです。 – faez

答えて

0

slf4jを使用するすべてのログフレームワークを統合するソリューションが見つかりました。私はlog4j-over-slf4j.jarとjcl-over-slf4j.jarを私のライブラリに追加しました。したがって、log4jとorg.apache.commons.loggingはthisに従ったロギングのためにslf4j構成を使用します。

しかし、それはsifficeintではないと私はまだ問題があった! Hadoopジョブのログは要求スレッドのログファイルに書き込まれませんでした。実際、私の新たな問題は、「HadoopジョブはMDCログ値が固有のものではありません!私はそれをJoranConfigurator.doConfigure()で新しい設定ファイルとして設定すると、新しいリクエストごとに新しいlogback.xmlを作成して解決します。

それは

<appender name="FILE" class="ch.qos.logback.classic.sift.SiftingAppender"> 

    <!-- This is MDC value --> 
    <!-- We will assign a value to 'logFileName' via Java code --> 
    <discriminator> 
     <key>logFileName</key> 
     <defaultValue>server</defaultValue> 
    </discriminator> 

    <sift> 

     <!-- A standard RollingFileAppender, the log file is based on 'logFileName' at runtime --> 
     <appender name="FILE-${logFileName}" 
     class="ch.qos.logback.core.FileAppender"> 
     <file>${USER_HOME}/${logFileName}.log</file> 

     <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> 
      <Pattern> 
       %d{ISO8601} %level %X{logName} : %logger{30} - %msg%n 
      </Pattern> 
     </encoder> 

     </appender> 

    </sift> 
</appender> 

<root level="info"> 
    <appender-ref ref="FILE" /> 
</root> 

このファイル私のプログラムのコピー私のlogback.xmlだったと私がしたいことをStringにLOGFILENAMEのデフォルト値を変更します。次に、このコードで新しいファイルを構成として設定します。

// assume SLF4J is bound to logback in the current environment 
    LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); 

    try { 
     JoranConfigurator configurator = new JoranConfigurator(); 
     configurator.setContext(context); 
     // Call context.reset() to clear any previous configuration, e.g. default 
     // configuration. For multi-step configuration, omit calling context.reset(). 
     context.reset(); 
     configurator.doConfigure(newPath+"/logback.xml"); 
    } catch (JoranException je) { 
     // StatusPrinter will handle this 
    } 
    StatusPrinter.printInCaseOfErrorsOrWarnings(context); 
関連する問題