简体   繁体   中英

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. 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.

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.

What you could do is to create only one RollingFileAppender instance and reroute the loggers to this single instance.

The following code gives the idea, but it won't work if you call rerouteAppenderToFile() several times for a single file.

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);
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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