Java日志记录-MDC.put延迟?
我正在尝试设置一些日志记录。规范要求每个ip有单独的日志。让我们暂时忘掉大量的文件。在我的logback.xml中,我有:Java日志记录-MDC.put延迟?,java,logging,slf4j,mdc,Java,Logging,Slf4j,Mdc,我正在尝试设置一些日志记录。规范要求每个ip有单独的日志。让我们暂时忘掉大量的文件。在我的logback.xml中,我有: <?xml version="1.0" encoding="UTF-8"?> <configuration> <property name="LOG_MAIN_FOLDER" value="./log/sifting" /> <appe
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="LOG_MAIN_FOLDER" value="./log/sifting" />
<appender name="FILE-THREAD" class="ch.qos.logback.classic.sift.SiftingAppender">
<!-- This is MDC value -->
<!-- We will assign a value to 'logFileName' via Java code -->
<discriminator>
<key>logFileName</key>
<defaultValue>head0</defaultValue>
</discriminator>
<sift>
<!-- A standard RollingFileAppender, the log file is based on 'logFileName' at runtime -->
<appender name="FILE-${logFileName}" class="ch.qos.logback.core.rolling.RollingFileAppender">
- <file>${LOG_MAIN_FOLDER}/${logFileName}.log</file>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>
%d{yyyy-MM-dd HH:mm:ss} %mdc [%thread] %level %logger{35} - %msg%n
</Pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<FileNamePattern>${LOG_MAIN_FOLDER}/${logFileName}.%i.log.zip</FileNamePattern>
<MinIndex>1</MinIndex>
<MaxIndex>10</MaxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>
</sift>
</appender>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>
%-5level %logger{36} - %msg%n
</Pattern>
</layout>
</appender>
<logger name="poc.log.SiftingLog" level="debug" additivity="false">
<appender-ref ref="FILE-THREAD" />
<appender-ref ref="STDOUT" />
</logger>
<root level="error">
<appender-ref ref="STDOUT" />
</root>
</configuration>
日志文件名
人头0
-${LOG\u MAIN\u FOLDER}/${logFileName}.LOG
%d{yyyy-MM-dd HH:MM:ss}%mdc[%thread]%级别%logger{35}-%msg%n
${LOG\u MAIN\u FOLDER}/${logFileName}。%i.LOG.zip
1.
10
10MB
%-5级别%logger{36}-%msg%n
这是我的代码:
private void runTest() {
for (int threadNo = 0; threadNo < 100; threadNo++) {
new Thread(() -> {
StringJoiner ip = new StringJoiner(".");
for (int i = 0; i < 4; i++) ip.add(new Random().nextInt(256) + "");
Logger logger = LoggerFactory.getLogger(SiftingLog.class);
MDC.put("logFileName", getPathName(ip.toString()));
logger.info(MDC.getCopyOfContextMap().get("logFileName"));
logger.debug("hello " + ip.toString());
try {Thread.sleep(200);} catch (InterruptedException e) {}
logger.debug("working " + ip.toString());
try {Thread.sleep(200);} catch (InterruptedException e) {}
logger.debug("bye " + ip.toString());
//remember remove this
MDC.remove("logFileName");
}).start();
}
}
私有void runTest(){
对于(int-threadNo=0;threadNo<100;threadNo++){
新线程(()->{
细木工ip=新细木工(“.”);
对于(inti=0;i<4;i++)ip.add(newrandom().nextInt(256)+”);
Logger Logger=LoggerFactory.getLogger(SiftingLog.class);
put(“logFileName”,getPathName(ip.toString());
info(MDC.getCopyOfContextMap().get(“logFileName”);
debug(“hello”+ip.toString());
试试{Thread.sleep(200);}catch(InterruptedException e){}
logger.debug(“正在工作”+ip.toString());
试试{Thread.sleep(200);}catch(InterruptedException e){}
debug(“bye”+ip.toString());
//记得把这个拿走吗
MDC.remove(“logFileName”);
}).start();
}
}
我希望所有日志都放在ip命名的文件中。但是,正在创建head0日志文件,所有线程都将“hello”的前两行(.info和.debug)放在默认日志文件中。在休眠一段时间后,接下来的两行调试代码被正确放置
如何刷新MDC.put命令?我选择了slf4j和SiftingLogger,因为它最容易找到相关的教程/信息。如果有其他库或工具更适合此任务,请告诉我。将logger设置为常量,而不是在每个线程中初始化它,看看这是否有帮助
private static final Logger Logger=LoggerFactory.getLogger(SiftingLog.class)代码>我不想说,它成功了。这是我的出发点,但由于任何我想不起来的想法,现在我改变了它。非常感谢!