【发布时间】: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....
-
即使我手动删除了一个翻转的文件,磁盘空间仍然没有被释放,它被显示为一个打开的已删除文件。