【问题标题】:Migrating from log4j1 to log4j2从 log4j1 迁移到 log4j2
【发布时间】:2026-02-13 12:55:01
【问题描述】:

我正在从 log4j1 迁移到 log4j2,但正如许多人所说,getAllAppenders 方法不再存在。

我有两段代码要替换,但我没有找到一个漂亮的方法:

    try {
        // termination
        @SuppressWarnings("unchecked")
        Enumeration<Appender> appenders = Logger.getRootLogger().getAllAppenders();
        if(appenders != null) {
            while (appenders.hasMoreElements()) {
                Appender appender = appenders.nextElement();
                if (appender instanceof AsyncAppender) {
                    appender.close();
                }
            }
        }
    } catch(Exception e) {
        //forget exception
    }

第二个是:

    Logger rootLogger = Logger.getRootLogger();
    FileAppender fileAppender = (FileAppender) ((AsyncAppender) rootLogger.getAppender("ASYNC")).getAppender("file");
    mailService.sendAlertForFXTraderSupport(env, user, new File(fileAppender.getFile()),executionFolder);

我的 log4j2:

    <?xml version="1.0" encoding="UTF-8"?>

<Appenders>
    <Console name="stdout" target="SYSTEM_OUT">
        <PatternLayout pattern="%-d{yyyy MMM dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n" />
    </Console>

    <RollingFile name="file"
        fileName="C:/temp/tetrafx-gui-dev-${tetrafx.location}.log"
        filePattern="C:/temp/$${date:yyyy-MM-dd}/tetrafx-gui-dev-%d{yyyy-MM-dd}-%i.log.gz">
        <PatternLayout pattern="%-d{yyyy MMM dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n" />
        <Policies>
            <TimeBasedTriggeringPolicy interval="1" />
        </Policies>
    </RollingFile>

    <Async name="ASYNC" bufferSize="1000">
        <AppenderRef ref="stdout" />
        <AppenderRef ref="file" />
    </Async>
</Appenders>
<Loggers>
    <Root level="all">
        <AppenderRef ref="ASYNC" />
    </Root>
</Loggers>

您对此有什么建议吗?

谢谢

【问题讨论】:

    标签: java logging configuration log4j log4j2


    【解决方案1】:

    第一个,关闭 Appenders,在 Log4j 2 中不再需要您的应用程序执行。Log4j 2 有一个关闭挂钩,负责所有必要的清理工作。

    对于第二个问题,您可以通过以下方式获取文件附加程序和文件名:

    LoggerContext context = (org.apache.logging.log4j.core.LoggerContext) LogManager.getContext(false);
    Configuration config = context.getConfiguration();
    RollingFileAppender rfa = (RollingFileAppender) config.getAppender("file");
    String fileName = rfa.getManager().getFileName();
    

    【讨论】:

      最近更新 更多