それぞれに固有の名前を持つ複数のスレッドを呼び出す Java アプリケーションを実行しています。ここで、それぞれに複数のログ ファイルを作成したいのですが、ログ ファイルの名前はスレッド名と同じにする必要があります。これは log4j2 を使用して可能ですか。log4j2 構成ファイルの作成を手伝ってください。
前もって感謝します。
それぞれに固有の名前を持つ複数のスレッドを呼び出す Java アプリケーションを実行しています。ここで、それぞれに複数のログ ファイルを作成したいのですが、ログ ファイルの名前はスレッド名と同じにする必要があります。これは log4j2 を使用して可能ですか。log4j2 構成ファイルの作成を手伝ってください。
前もって感謝します。
RoutingAppender が進むべき道であることに同意します。最初に、'ctx' が ThreadContext を使用する ${ctx:threadName} 検索と組み合わせてルーティング アペンダーを使用しました。コードに次のような行を追加する必要があることがわかりました。
ThreadContext.put("threadName", Thread.currentThread().getName());
そのコードは機能しますが、コードの設計では拡張できません。コード ベースに新しい行を追加する場合java.lang.Runnable
は、その行も含める必要があります。
むしろ、解決策は「org.apache.logging.log4j.core.lookup.StrLookup」を実装し、次のように登録すること@Plugin
ですPluginManager
。
クラス:ThreadLookup
package my.logging.package
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.lookup.StrLookup;
@Plugin(name = "thread", category = StrLookup.CATEGORY)
public class ThreadLookup implements StrLookup {
@Override
public String lookup(String key) {
return Thread.currentThread().getName();
}
@Override
public String lookup(LogEvent event, String key) {
return event.getThreadName() == null ? Thread.currentThread().getName()
: event.getThreadName();
}
}
構成: log4j2.xml (packages
の属性 をにConfiguration
登録)@Plugin
PluginManager
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" packages="my.logging.package">
<Appenders>
<Routing name="Routing">
<Routes pattern="$${thread:threadName}">
<Route>
<RollingFile name="logFile-${thread:threadName}"
fileName="logs/concurrent-${thread:threadName}.log" filePattern="logs/concurrent-${thread:threadName}-%d{MM-dd-yyyy}-%i.log">
<PatternLayout pattern="%d %-5p [%t] %C{2} - %m%n" />
<Policies>
<SizeBasedTriggeringPolicy size="50 MB" />
</Policies>
<DefaultRolloverStrategy max="100" />
</RollingFile>
</Route>
</Routes>
</Routing>
<Async name="async" bufferSize="1000" includeLocation="true">
<AppenderRef ref="Routing" />
</Async>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="async" />
</Root>
</Loggers>