Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java日志记录-MDC.put延迟?_Java_Logging_Slf4j_Mdc - Fatal编程技术网

Java日志记录-MDC.put延迟?

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

我正在尝试设置一些日志记录。规范要求每个ip有单独的日志。让我们暂时忘掉大量的文件。在我的logback.xml中,我有:

<?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)

我不想说,它成功了。这是我的出发点,但由于任何我想不起来的想法,现在我改变了它。非常感谢!