나는 log4j 2를 사용하고 있으며 ThreadContext Map에 저장된 특정 키의 값에 따라 다른 로그 파일을 작성해야합니다. 각 스레드는 키를 특정 값으로 설정합니다 (반복 될 수 있음). 이것은 log4j2.xmlLog4j 2 개의 다른 로그 각 스레드에 대한 파일
<Configuration status="warn">
<Appenders>
<Routing name="Routing">
<Routes pattern="$${ctx:KEY}">
<Route>
<RollingFile name="Rolling-${ctx:KEY}" fileName="logs/${ctx:KEY}.log"
filePattern="logs/${date:yyyy-MM}/${ctx:KEY}-%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout>
<pattern>%d{ISO8601} [%t] %p %c{3} - %m%n</pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="6"
modulate="true" />
<SizeBasedTriggeringPolicy size="10 MB" />
</Policies>
</RollingFile>
</Route>
</Routes>
</Routing>
<Async name="Async">
<AppenderRef ref="Routing" />
</Async>
</Appenders>
<Loggers>
<Root level="info" additivity="false">
<AppenderRef ref="Async" />
</Root>
</Loggers>
</Configuration>
이 메인 클래스입니다 :
public class TestClass {
public static void main (String[] args){
/**FILTER OPERATION*/
CorrelationBag corr = new CorrelationBag();
corr.setID("AD65MASDAD654DF5SDF235SFD651SDFSDF321DSF");
corr.setUsername("Username");
for (int i= 0; i<6; i++){
(new Thread(new MyService(i))).start();
}
}
}
그리고 이것은 마지막으로 스레드 구현입니다 :
public class MyService extends ServiceBase implements Runnable {
int counter;
public MyService(){}
public MyService (int counter){
this.counter = counter;
}
@Override
public void run() {
ThreadContext.put("KEY", Thread.currentThread().getID());
String param1 = "param1";
String param2 = "param2";
String param3 = "param3";
String param4 = "param4";
String param5 = "param5";
info("WITH MARKER AND HEADERS,{},{}{},{},{}",param1,param2,param3,param4,param5);
ThreadContext.remove("threadName");
}
}
이 코드와 Log4j는 단지 1 로그를 작성 하나의 스레드 ID와 관련된 파일.
디버그 모드에서 코드를 실행하면 모든 명령을 단계별로 실행합니다 ... log4j는 내가 원하는대로 6 개의 파일을 만듭니다. 내 코드에서 동시성 문제 일 수 있다고 생각합니다.
누구든지 나를 도와 줄 수 있습니까?