Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.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/8/logging/2.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 如何确定未记录日志的原因?_Java_Logging_Log4j_Log4j2_Apache Commons Logging - Fatal编程技术网

Java 如何确定未记录日志的原因?

Java 如何确定未记录日志的原因?,java,logging,log4j,log4j2,apache-commons-logging,Java,Logging,Log4j,Log4j2,Apache Commons Logging,我正在寻找某种清单,它将帮助我解决以下问题: 我有一个在Tomcat8上运行的Web应用程序。我使用log4j2v2.1和apachecommons日志v1.2。我的应用程序在几天内记录良好,然后突然停止记录。没有记录任何异常。没什么 我无法理解为什么会发生这种情况,以及根本原因是什么。我也不知道如何找到根本原因 顺便说一句,系统有足够的可用磁盘空间~500GB,tomcat日志(如localhost_访问日志)和其他日志继续不间断地记录 编辑:根据请求,发布log4j2配置- <?xml

我正在寻找某种清单,它将帮助我解决以下问题:

我有一个在Tomcat8上运行的Web应用程序。我使用log4j2v2.1和apachecommons日志v1.2。我的应用程序在几天内记录良好,然后突然停止记录。没有记录任何异常。没什么

我无法理解为什么会发生这种情况,以及根本原因是什么。我也不知道如何找到根本原因

顺便说一句,系统有足够的可用磁盘空间~500GB,tomcat日志(如localhost_访问日志)和其他日志继续不间断地记录

编辑:根据请求,发布log4j2配置-

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%p [%t] %c{1}.%M(%L) | %m%n"/>
        </Console>

        <RollingFile name="RollingFile" fileName="../logs/app.log"
                                 filePattern="../app/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
            <PatternLayout>
                <Pattern>%d{ISO8601} [REQ_ID|%X{REQUEST_UUID}] %p [%t] %c{1}.%M(%L) | %m%n</Pattern>
            </PatternLayout>
            <Policies>
                <OnStartupTriggeringPolicy/>
                <TimeBasedTriggeringPolicy interval="6" modulate="true"/>
                <SizeBasedTriggeringPolicy size="5 MB"/>
            </Policies>
        </RollingFile>
    </Appenders>

    <Loggers>
        <Logger ... />
        ...
        <Root level="debug">
            <AppenderRef ref="RollingFile"/>
        </Root>
    </Loggers>
</Configuration>

%d{ISO8601}[REQ_ID |%X{REQUEST_UUID}]%p[%t]%c{1}。%M(%L)|%M%n
...

通常的罪魁祸首是该文件被日志旋转工具重命名。如果在几天后发生这种情况,则会将日志旋转工具配置为在文件达到一定大小时将其移开。然后这些工具通常会压缩日志文件

发生的情况是:

  • Java进程打开日志文件。操作系统分配一个文件描述符
  • 一段时间后,日志旋转工具将重命名该文件。因为Java写入文件描述符,所以它不会注意或关心重命名(文件描述符保持不变)
  • 然后该工具压缩文件。为此,将创建一个新文件(压缩文件)
  • 压缩日志时,该工具将删除原始日志文件
  • Java继续写入文件描述符。由于描述符不再连接到目录项,因此无法看到它

  • 解决方案:在Java日志记录工具中配置日志旋转,或将其配置为与外部日志旋转工具一起工作。

    日志旋转是在log4j2.xml文件中的log4j2配置中配置的。还有别的办法吗?@Rishabh,你100%确定没有人在操作系统级别配置日志旋转器吗?在这种情况下,您需要使用远程调试选项启动应用程序。然后,当它停止工作时,您可以使用远程调试器连接到它。我猜你在某个地方遇到了死锁。是的,我确信在操作系统级别没有任何日志循环,因为我自己已经配置了它。将按建议调试“死锁”。请发布完整的log4j配置文件。