1

我们正在迁移到 log4j2。我在任何地方都找不到如何重写部分代码。

LoggerContext context = (org.apache.logging.log4j.core.LoggerContext) LogManager.getContext(false);
Configuration config = context.getConfiguration();
RollingFileAppender fileAppender = config.getAppender("file");

(...)

fileAppender.setFile(newFileName); //this part
fileAppender.activateOptions(); //and this part

有谁知道它应该如何正确编写?任何帮助将不胜感激,如果这是一个愚蠢的问题,我很抱歉。

编辑:我的类(使用 log4j v.1)实现 LoggerFactory 也有问题。我在这里找到:log4j migration to log4j2我应该使用“其他机制”。我不确定是否应该在这里使用 LoggerContextFactory 或其他东西:

class MyNameLoggerFactory implements LoggerFactory {
    (...)
    void init() {
       //sets quiet mode
       //init DOMConfigutator
       //configure using log4j config xml
    }

    Appender getFileAppender(File file) {
        //returns a FileAppender
    }

    @Override
    public MyNameLoggerFactory makeNewLoggerInstance(String name) {
        return new MyNameLoggerFactory (name);
    }
}

此处加载的 XML 配置具有诸如 EmailSender、ConsoleAppender 和 RollingFileAppender 之类的附加程序(我认为我也需要转换 xml)。如果我理解这个如何指定 Log4J 2.x 配置位置?正确地,我将在这里(在我的 init 方法中)使用带有 null ClassLoader 的初始化方法,而不是 DOMConfigurator?

这确实是一个老项目,多年来由许多不同的人编写,一团糟。感谢您的任何帮助。

4

1 回答 1

1

你可以试试这个方法。

Layout<? extends Serializable> old_layout = fileAppender.getLayout();
fileAppender.stop();

//delete old appender
((org.apache.logging.log4j.core.Logger)logger).removeAppender(fileAppender);

RollingFileAppender appender = RollingFileAppender.newBuilder().withFileName(newFileName).withAppend(true).withLocking(false)
        .setName(fileAppender.getName()).setIgnoreExceptions(true).withFilePattern(newFileName.concat(".%d")).withPolicy(fileAppender.getTriggeringPolicy())
        .withStrategy(DefaultRolloverStrategy.newBuilder().withMax(String.valueOf(5)).build())
        .setLayout(old_layout).setConfiguration(config).build();
appender.start();

((org.apache.logging.log4j.core.Logger)logger).addAppender(appender);
于 2022-01-31T18:31:50.460 回答