저는 log4j2를 사용하고 동시에 다른 프로세스 (예 : 다른 JVM)에서 동일한 코드의 인스턴스를 여러 개 실행하고 있습니다. 나는 모든 프로세스를 같은 파일에 인터리브 (interleaved)하고 싶습니다. 어떻게 log4j2.xml을 통해 PID를 출력 할 수 있습니까? 그래서 다른 프로세스가 로그에서 구별 될 수 있습니까?log4j2 : PID 포함
5
A
답변
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으로 설정하면 기록됩니다.
여러 JVM에서 동일한 파일로 로그 할 수 있다면 놀랄 것입니다. 입증 된 것이 틀림 없습니다. 크로니클 로거 (Chronicle Logger)는이를 수행하지만 구현하기는 쉽지 않습니다. –
@PeterLawrey - 지금 당장이 작업을 수행하면 즉시 사용할 수 있습니다. 로그 라인은 파일에서 인터리브됩니다. – SRobertJames
Java 프로그램이 PID를 가져 오는 방법을 묻는 것이므로 생성 한 로그 mss에 포함 할 수 있습니다. 또는 log4j를 구성하여 로그 메시지에 PID를 삽입하는 방법을 묻고 있습니까? – Raedwald