我在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中将日志内容写入文件的组件是否通过文件名或诸如索引节点号或文件处理程序之类的文件来跟踪文件。由于原始活动日志文件并未删除,而是以新名称移动。
我知道logrotate中的copytruncate
选项,该选项创建活动日志文件的副本,然后截断活动日志文件,但我不想使用此选项,因为这可能导致丢失以下日志事件在计算机上运行的代理将日志推送到诸如Elasticsearch和CloudWatch之类的系统。由于截断可能在代理处理所有日志条目之前发生。
即使下面的原始文件被移动后,如何使日志记录组件始终将日志写入名为application.log
的文件中?
日志记录框架打开文件进行写入,并保持OutputStream处于打开状态,直到应用程序结束或文件被翻转或类似为止。在Unix系统上,您可以移动文件,重命名文件或删除文件,但应用程序将继续对其进行写入。该应用程序无法知道该文件是从外部操作的。
如果使用的是Log4j 2,则应使用RollingFileAppender并使用DeleteAction删除旧文件。