如何识别未记录日志的原因?

时间:2015-11-02 13:06:05

标签: java logging log4j log4j2 apache-commons-logging

我正在寻找某种清单,这将有助于我解决以下问题:

我在 Tomcat 8 上运行了一个webapp。我使用 Log4J2 v2.1 Apache Commons Logging v1.2 。我的应用程序记录好几天,然后突然停止记录。没有记录任何异常。没事!

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

BTW,系统有足够的可用磁盘空间~500GB,tomcat日志,如localhost_access日志和其他日志继续不间断地记录。

编辑:根据要求,发布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>

1 个答案:

答案 0 :(得分:0)

这里通常的罪魁祸首是文件由日志轮换工具重命名。如果在几天后发生,则日志轮换工具配置为在文件达到特定大小时将文件移开。然后,这些工具会压缩日志文件。

会发生什么:

  1. Java进程打开日志文件。 OS分配文件描述符。
  2. 一段时间后,日志轮换工具会重命名该文件。由于Java写入文件描述符,因此它没有注意到或关心重命名(文件描述符保持不变)。
  3. 然后该工具压缩文件。为此,创建一个新文件(压缩文件)。
  4. 压缩日志时,该工具会删除原始日志文件。
  5. Java继续写入文件描述符。由于描述符不再连接到目录条目,因此您无法看到它。
  6. 解决方案:在Java日志记录工具中配置日志轮换,或将其配置为与外部日志轮换工具一起使用。