java - Log4j FileAppender 重新创建已删除的文件

标签 java log4j fileappender

我正在使用 Log4j 作为我正在处理的项目中的日志记录框架。我有以下情况: Log4j 配置为将日志写入日志文件。在某些时候,此日志文件被复制到另一个目的地并被删除。日志记录框架继续工作,但日志不会写入日志文件,因为它已被删除。有没有办法告诉 Log4j 重新创建文件并继续将日志写入日志文件。

最好的问候, 拉希德

最佳答案

我查看了 log4j 的源代码。初始化 FileAppender/RollingFileAppender 时,将创建一个指向文件的 FileOutputStream 实例。创建一个新的 FileDescriptor 对象来表示此文件连接。这就是原因,其他解决方案(例如通过 Cron 监视文件和通过覆盖在附加方法中创建文件)对我不起作用,因为新文件描述符已分配给新文件。 Log4j Writer 仍然指向旧的 FileDescriptor。

解决方案是检查文件是否存在,如果不存在,则调用 FileAppender 类中存在的 activeOptions 方法。

package org.apache.log4j;

import java.io.File;
import org.apache.log4j.spi.LoggingEvent;

public class ModifiedRollingFileAppender extends RollingFileAppender {

    @Override 
    public void append(LoggingEvent event) {
        checkLogFileExist();
        super.append(event);
    }

    private void checkLogFileExist(){
        File logFile = new File(super.fileName);
        if (!logFile.exists()) {
            this.activateOptions();
        }
    }
}

最后将其添加到 log4j.properties 文件中:

log4j.rootLogger=DEBUG, A1
log4j.appender.A1=org.apache.log4j.ModifiedRollingFileAppender
log4j.appender.A1.File=/path/to/file
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss,SSS} %p %c{1}: %m%n

//Skip the below lines for FileAppender
log4j.appender.A1.MaxFileSize=10MB
log4j.appender.A1.MaxBackupIndex=2

注意:我已经针对 log4j 1.2.17 测试了这个

关于java - Log4j FileAppender 重新创建已删除的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12106258/

相关文章:

java - 套接字通信中客户端输入之间的时间

java - 带压缩的日志旋转

logging - 出于测试目的触发 Log4j 翻转 (RollingFileAppender)

java - 如何解决 Log4J No Such Property 警告/错误?

Java lambda 表达式 : How to concatenate key and set of values from a hashmap?

java - 许多线程正在等待条件并且服务器负载超过100

c# - Log4net 有时会创建两个日志,一个为空

java - Log4j 和 Logback FileAppender maxFileSize 和 maxBackupIndex

java - 在 log4j 中将 ConsoleAppender 替换为 FileAppender

java - 退出 JSF 流