2014-09-09 1 views
5

저는 log4j2를 사용하고 동시에 다른 프로세스 (예 : 다른 JVM)에서 동일한 코드의 인스턴스를 여러 개 실행하고 있습니다. 나는 모든 프로세스를 같은 파일에 인터리브 (interleaved)하고 싶습니다. 어떻게 log4j2.xml을 통해 PID를 출력 할 수 있습니까? 그래서 다른 프로세스가 로그에서 구별 될 수 있습니까?log4j2 : PID 포함

+0

여러 JVM에서 동일한 파일로 로그 할 수 있다면 놀랄 것입니다. 입증 된 것이 틀림 없습니다. 크로니클 로거 (Chronicle Logger)는이를 수행하지만 구현하기는 쉽지 않습니다. –

+0

@PeterLawrey - 지금 당장이 작업을 수행하면 즉시 사용할 수 있습니다. 로그 라인은 파일에서 인터리브됩니다. – SRobertJames

+0

Java 프로그램이 PID를 가져 오는 방법을 묻는 것이므로 생성 한 로그 mss에 포함 할 수 있습니다. 또는 log4j를 구성하여 로그 메시지에 PID를 삽입하는 방법을 묻고 있습니까? – Raedwald

답변

6

아마도 MDC이 도움이 될 수 있습니다. 이 시도 :

자바 :

import java.lang.management.ManagementFactory; 

import org.apache.logging.log4j.LogManager; 
import org.apache.logging.log4j.Logger; 
import org.apache.logging.log4j.ThreadContext; 

public class TestPID { 

    private static final Logger LOG = LogManager.getLogger(TestPID.class); 

    static { 
     // Get the process id 
     String pid = ManagementFactory.getRuntimeMXBean().getName().replaceAll("@.*", ""); 

     // MDC 
     ThreadContext.put("pid", pid); 
    } 

    public static void main(String[] args) { 
     LOG.info("Testing..."); 
    } 

} 

XML :

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration> 
    <Appenders> 
    <Console name="Console" target="SYSTEM_OUT"> 
     <PatternLayout pattern="%d %5X{pid} %-5p %c#%M - %m%n" /> 
    </Console> 
    </Appenders> 
    <Loggers> 
    <Root level="info"> 
     <AppenderRef ref="Console" /> 
    </Root> 
    </Loggers> 
</Configuration> 

출력 :

2014-09-10 00:13:49,281 7164 INFO TestPID#main - Testing... 
         ↑↑↑↑ 
        That's the PID 

당신은 참조 할 수 있습니다 :

1

가 정확히이 일을 버전 2.9 이후 log4j2 코어의 플러그인 ProcessIdPatternConverter있다 .

패턴 레이아웃에 % pid 또는 % processId으로 설정하면 기록됩니다.