gpt4 book ai didi

java - 在java中写入日志文件是通过文件名还是其他东西(如 inode 、文件句柄等)来跟踪的?

转载 作者:行者123 更新时间:2023-12-01 16:20:56 25 4
gpt4 key购买 nike

我在 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 编号或文件处理程序)来跟踪文件。由于原始 Activity 日志文件并未被删除,只是以新名称移动。

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

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

最佳答案

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

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

关于java - 在java中写入日志文件是通过文件名还是其他东西(如 inode 、文件句柄等)来跟踪的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62283468/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com