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);
あなたにはどのようなプロジェクトがありますか?それはwebappですか? –
これは安らかなWebサーバーです。 – faez