简体   繁体   English

在向同一文件创建两个追加程序时,Log4J RollingFileAppender不会滚动文件

[英]Log4J RollingFileAppender doesn't roll files when creating two appenders to the same file

Although I've read multiple other questions and answers regarding this issue, I didn't find the answer and would appreciate any help. 尽管我已经阅读了有关此问题的其他多个问题和解答,但我没有找到答案,希望能对您有所帮助。

public static void rerouteAppenderToFile(File file, Logger... log) {
    for (Logger logger : log) {
        rerouteAppenderToFile(file, logger);
    }
}

public static void rerouteAppenderToFile(File file, Logger log) {
    log.setAdditivity(false);
    log.setLevel(Level.DEBUG);
    RollingFileAppender fa = new RollingFileAppender();
    fa.setName("RollingFileAppender_" + log.getName());
    fa.setMaxBackupIndex(3);
    fa.setMaxFileSize("20MB");
    File folder = file.getParentFile();
    folder.mkdirs();
    if (folder.exists() && folder.isDirectory()) {
        fa.setFile(file.getAbsolutePath());
        fa.setLayout(new PatternLayout(LOGGER_PATTERN));
        fa.setThreshold(Level.DEBUG);
        fa.setAppend(true);
        fa.activateOptions();
        log.addAppender(fa);
    }
}

What I'm trying to achieve here is being able to append multiple loggers (2 or more) to the same file using a RollingFileAppender. 我在这里想要实现的是能够使用RollingFileAppender将多个记录器(2个或更多)附加到同一文件。 For some reason the files aren't rolled and the logs keep getting larger 由于某些原因,文件未滚动并且日志不断增大

The problem is that you create multiple RollingFileAppender s that write to the same file. 问题是您创建了多个RollingFileAppender ,它们写入同一文件。

So even if one RollingFileAppender tries to roll over to a new file it cannot do so, since the file is locked by the other RollingFileAppender s. 因此,即使一个RollingFileAppender尝试将其移到新文件上也不能这样做,因为该文件已被另一个RollingFileAppender锁定。

What you could do is to create only one RollingFileAppender instance and reroute the loggers to this single instance. 您可以做的只是创建一个RollingFileAppender实例,然后将记录器重新路由到该单个实例。

The following code gives the idea, but it won't work if you call rerouteAppenderToFile() several times for a single file. 以下代码给出了这个想法,但是如果您为单个文件多次调用rerouteAppenderToFile() ,它将无法正常工作。

public static void rerouteAppenderToFile(File file, Logger... log) {
    RollingFileAppender fa = createAppender(file);
    for (Logger logger : log) {
        rerouteAppenderToFile(f, logger);
    }
}

public static Appender createAppender(File file) {
    RollingFileAppender fa = new RollingFileAppender();
    fa.setName("RollingFileAppender_" + log.getName());
    fa.setMaxBackupIndex(3);
    fa.setMaxFileSize("20MB");
    File folder = file.getParentFile();
    folder.mkdirs();
    fa.setFile(file.getAbsolutePath());
    fa.setLayout(new PatternLayout(LOGGER_PATTERN));
    fa.setThreshold(Level.DEBUG);
    fa.setAppend(true);
    fa.activateOptions();
    return fa;
}

public static void rerouteAppenderToFile(Appender fa, Logger log) {
    log.setAdditivity(false);
    log.setLevel(Level.DEBUG);
    log.addAppender(fa);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM