2016-06-08 1 views
0

나는 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 개의 파일을 만듭니다. 내 코드에서 동시성 문제 일 수 있다고 생각합니다.

누구든지 나를 도와 줄 수 있습니까?

답변

0

현재 코드는 다음 스레드가 생성되기 전에 각 스레드가 생성되고 시작 및 완료 될 가능성이 있으므로 스레드 객체가 재사용 될 수 있습니다. 나는 당신이 할 코드를 변경 제안 :

Thread[] threads = new Thread[6]; 

for (int i= 0; i < 6; i++) {   
    threads[i] = new Thread(new MyService(i)); 
} 
for (int i= 0; i < 6; i++){   
    threads[i].start(); 
} 

또한, 당신은 스레드 컨텍스트에 "KEY"하지만 "threadName"를 제거하는 추가됩니다. 그것은 문제를 일으킬 것입니다. 위의 예에서도 실제로 로거 호출이 없습니다. 나는 정보가 아니라 logger.info 여야한다고 가정하고 있습니다.