当重命名现有文件时,如何强制Log4j写入新文件

时间:2016-10-02 10:53:33

标签: log4j

我的Java应用程序使用Log4j 1.2.17并在Debian系统下运行。我使用Linux logrolling引擎定期重命名日志文件。但是,Log4j继续写入重命名的文件但不创建要写入的新文件。 (也许它保留了文件描述符)。 我的问题如下:如何将log4j扩展为添加这样的新功能 - 在重命名现有文件时写入新文件。

谢谢,

西蒙

1 个答案:

答案 0 :(得分:0)

我找到了替代解决方案。我准备了定期检查原始日志文件存在的线程(例如每1分钟)。一旦缺席,线程就会重新配置appender,以便它创建并使用最初定义的文件进行日志记录。 我使用以下方法进行上述操作。

    protected void checkLogFile(){
        Enumeration<?> e = Logger.getRootLogger().getAllAppenders();
        while (e.hasMoreElements()) {
            Appender appender = (Appender) e.nextElement();
            if (FileAppender.class.isInstance(appender)) {
                FileAppender fa = (FileAppender) appender;
                String fileName = fa.getFile();
                File logFile = new File(fileName).getAbsoluteFile();
                logger.debug("check logFile = " + logFile);
                if (!logFile.exists()) {
                    logger.debug("logFile is not exist. create a new log file: " + fileName);
                    fa.setFile(fileName);
                    fa.activateOptions();
                }
            }
        }
    }

请注意原始日志文件是通过相对路径在log4j配置中定义的(例如'../ log / proc.log')