THreadLocal_MDC
ThreadLocal-MDC
-
应用
-
log4j.properties
log4j.rootLogger=info, stdout, R log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout # Pattern to output the caller's file name and line number. log4j.appender.stdout.layout.ConversionPattern=%5p [%t] [%X{TRACE_ID}] (%F:%L) - %m%n log4j.appender.R=org.apache.log4j.RollingFileAppender log4j.appender.R.File=example.log log4j.appender.R.MaxFileSize=100KB # Keep one backup file log4j.appender.R.MaxBackupIndex=1 log4j.appender.R.layout=org.apache.log4j.PatternLayout log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
-
单方法调用
@Slf4j public class MDCDemo { private static final String TRACE_ID = "TRACE_ID"; @Test public void testMdc1() { MDC.put(TRACE_ID, UUID.randomUUID().toString()); log.info("log in main method"); } }
输出日志:
INFO [main] [f6bbd26d-2620-4167-887c-993dbc529221] (MDCDemo.java:22) - log in main method
可以看到,我们配置的
TRACE_ID
已经输出来了 -
方法嵌套
@Slf4j public class MDCDemo { private static final String TRACE_ID = "TRACE_ID"; @Test public void testMdc2() { MDC.put(TRACE_ID, UUID.randomUUID().toString()); log.info("log in main method"); nestMethod(); } private void nestMethod() { log.info("log in nest method"); } }
输出日志:
INFO [main] [33cc07fc-8fdd-4f0c-9a6c-fd60cadf1f66] (MDCDemo.java:28) - log in main method
INFO [main] [33cc07fc-8fdd-4f0c-9a6c-fd60cadf1f66] (MDCDemo.java:33) - log in nest method可以看到,主方法和嵌套方法里的
TRACE_ID
是一样的 -
多线程调用
@Slf4j public class MDCDemo { private static final String TRACE_ID = "TRACE_ID"; @Test public void testMdc3() throws IOException { new Thread(() -> { MDC.put(TRACE_ID, UUID.randomUUID().toString()); log.info("log in thread1 start"); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } log.info("log in thread1 end"); }).start(); new Thread(() -> { MDC.put(TRACE_ID, UUID.randomUUID().toString()); log.info("log in thread2 start"); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } log.info("log in thread2 end"); }).start(); System.in.read(); } }
输出日志:
INFO [Thread-0] [77011a2b-d5ec-4846-8a0b-0177be25464c] (MDCDemo.java:40) - log in thread1 start
INFO [Thread-1] [ceace569-f862-41b6-97b6-0ed9561df5c3] (MDCDemo.java:51) - log in thread2 start
INFO [Thread-0] [77011a2b-d5ec-4846-8a0b-0177be25464c] (MDCDemo.java:46) - log in thread1 end
INFO [Thread-1] [ceace569-f862-41b6-97b6-0ed9561df5c3] (MDCDemo.java:57) - log in thread2 end可以看到,
thread1
和thread2
各自的TRACE_ID
互不影响
-