java - 在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 编号或文件处理程序)跟踪文件。因为原来的活动日志文件没有被删除,只是用一个新的名字移动了。
我知道copytruncate
logrotate 中的选项创建活动日志文件的副本,然后截断活动日志文件,但我不想使用它,因为这会导致在机器上运行的代理丢失日志事件它将日志推送到 Elasticsearch 和 CloudWatch 等系统。由于截断可能发生在代理处理完所有日志条目之前。
application.log
即使在下面的原始文件被移动之后,如何让日志记录组件始终将日志写入一个名为的文件?
解决方案
日志框架打开文件进行写入,并让 OutputStream 保持打开状态,直到应用程序结束或文件翻转或类似情况。在 Unix 系统上,您可以移动文件、重命名或删除文件,但应用程序将继续写入。应用程序无法知道该文件已被外部操纵。
如果您使用的是 Log4j 2,则应使用 RollingFileAppender 并使用 DeleteAction 删除旧文件。
推荐阅读
- antlr4 - Xcode 警告:_startToken(startToken) 将在 _deleteConfigs(deleteConfigs) 之后初始化
- javascript - 如何在 gatsby 项目中包含自定义 javascript 文件?
- java - 是否可以使用 ByteBuddy 更改注释的值?
- javascript - 使用 babel-polyfill 后,classList.replace() 不是 IE11 中的方法或属性
- vba - 如何使用硬编码的月份和当前年份进行查询
- json - 使用 .values() 序列化模型,但也包括 ManyToMany 相关字段
- php - 无法使用 ContainerAware 命令功能调试 Symfony
- java - RecyclerView Adapter 不会膨胀正确的布局
- sql - 在 SQL Server 中运行过程的 IF 条件
- c - 试图用 sigaction 调用处理程序捕获 SIGINT 但仍然杀死进程