【问题标题】:Log4j2 Rolled Files that are deleted are still open and disk space not freed已删除的 Log4j2 滚动文件仍处于打开状态且未释放磁盘空间
【发布时间】:2015-03-07 11:55:40
【问题描述】:

我最近在我的 tomcat6 服务器上从 log4j 迁移到 log4j2。问题是我被删除的滚动文件永远保持打开状态,因此磁盘空间没有被释放。 我使用此命令“sudo /usr/sbin/lsof | grep deleted”来检查打开的已删除文件。我似乎不明白如何在不重新启动 tomcat 服务器的情况下关闭这些文件。其中一些日志正在被 cron 作业删除。而其中很多是通过 logrotate 删除的。

...

 <Appenders>
    <RollingRandomAccessFile name="requestAppender" fileName="${sys:catalina.home}/webapps/miscLogs/request.log"
                filePattern="${sys:catalina.home}/webapps/miscLogs/request.log.%i">
            <PatternLayout>
                <Pattern>
                    "%d{dd MMM yyyy HH:mm:ss } %-5p %c %x -%m%n"
                </Pattern>
            </PatternLayout>
            <Policies>
                <SizeBasedTriggeringPolicy size="3400MB"/>
            </Policies>
            <DefaultRolloverStrategy max="3"/>
</RollingRandomAccessFile>
</Appenders>
<Loggers>
<logger additivity="false" name="requestLogger" level="debug">
            <AppenderRef ref="requestAppender"/>
        </logger>
</Loggers>

...

问题在于已经滚动的文件。在这种情况下,问题出在 request.log.3 上。它被 cron 删除(没有 logrotate),但它仍然没有放弃磁盘空间,并且由运行整个程序的 tomcat 服务器保持打开状态。

lsof 的输出如下..

java 6393 root 160u REG 8,1 3565160049 5525509 /opt/tomcat/webapps/miscLogs/request.log.1(已删除)

这里的java进程是tomcat 6服务器,它仍然保持文件打开。

【问题讨论】:

  • “滚动文件被删除”是什么意思? Log4j 目前没有用于翻转文件的删除功能。我检查了源,但 log4j 正在关闭流(RollingFileManager 第 171 行)...
  • 请提供更多细节。如何删除日志文件?通过 cron?对数旋转?请显示确切的命令。另请提供您的 log4j2.xml 配置。你在使用 RandomAccessFileAppender 吗?
  • 其中一些日志正在被 cron 作业删除。而其中很多正在通过 logrotate 被删除。
  • RandomAccessFileAppender 和 logrotate 存在一个已知问题:issues.apache.org/jira/browse/LOG4J2-354;更好地使用 RollingRandomAccessFileAppender....
  • 即使我手动删除了一个翻转的文件,磁盘空间仍然没有被释放,它被显示为一个打开的已删除文件。

标签: tomcat tomcat6 log4j2


【解决方案1】:

RandomAccessFileAppender 和 logrotate 存在一个已知问题:http://issues.apache.org/jira/browse/LOG4J2-354; Log4j 团队建议改用 RollingRandomAccessFileAppender。

【讨论】:

  • 嘿,仍然打开的文件似乎仍然存在问题。我正在共享 xml 配置。
  • 你关掉 logrotate 了吗?
  • 是的,我最终做到了。现在轮换仅由 log4j 完成。但是一些滚动日志正在被 cron 作业删除。这些已删除日志的子集仍由 tomcat 服务器保持打开状态。
【解决方案2】:
DefaultRollOverStrategy:
      max: 3
      Delete:
        basePath: "${sys:logDir}/archive"
        IfLastModified:
          age: "5d"

【讨论】:

  • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-09
  • 2019-01-15
  • 1970-01-01
相关资源
最近更新 更多