首页 > 解决方案 > 在java中写入日志文件是通过文件名还是其他东西(如inode、文件句柄等)来跟踪的?

问题描述

我在我的 java web 应用程序中使用logback以及用于日志记录。log4j2到目前为止,我已经在 logback 和 log4j2 中设置了日志轮换(和清除),但现在我打算logrotate在基础设施级别使用,因为有很多服务(也有其他语言),而且维护一种常见的方式相对容易处理日志文件。

在进行 POC 时,我设置了 java 应用程序以将日志写入文件application.log,并使用大小标准(1 MB)设置 logrotate。正如预期的那样,当文件大小达到 1 MB 时,日志文件通过将其移动到另一个名为application.log.1. 此时,我预计 java 应用程序会继续将新日志写入application.log文件。但是,日志不断写入旋转文件,即application.log.1.

这让我想知道 logback/log4j2 中将日志内容写入文件的组件是否通过文件名或其他信息(如 inode 编号或文件处理程序)跟踪文件。因为原来的活动日志文件没有被删除,只是用一个新的名字移动了。

我知道copytruncatelogrotate 中的选项创建活动日志文件的副本,然后截断活动日志文件,但我不想使用它,因为这会导致在机器上运行的代理丢失日志事件它将日志推送到 Elasticsearch 和 CloudWatch 等系统。由于截断可能发生在代理处理完所有日志条目之前。

application.log即使在下面的原始文件被移动之后,如何让日志记录组件始终将日志写入一个名为的文件?

标签: javalogginglog4j2logbacklogrotate

解决方案


日志框架打开文件进行写入,并让 OutputStream 保持打开状态,直到应用程序结束或文件翻转或类似情况。在 Unix 系统上,您可以移动文件、重命名或删除文件,但应用程序将继续写入。应用程序无法知道该文件已被外部操纵。

如果您使用的是 Log4j 2,则应使用 RollingFileAppender 并使用 DeleteAction 删除旧文件。


推荐阅读