Java 正在查找要应用于我的日志的log4j appender

Java 正在查找要应用于我的日志的log4j appender,java,log4j,Java,Log4j,我在log4j2.xml文件中配置了appender <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="${PATTERN}" /> </Console> <Routing name="ConferenceLog"> <Routes pattern="${ctx:l

我在log4j2.xml文件中配置了appender

<Appenders>
    <Console name="Console" target="SYSTEM_OUT">
        <PatternLayout pattern="${PATTERN}" />
    </Console>
    <Routing name="ConferenceLog">
        <Routes pattern="${ctx:logFileName}">
            <Route>
                <RollingFile name="Rolling-${ctx:logFileName}"
                    fileName="${LOG_DIR}/${ctx:logFileName}.log" 
                    filePattern="${LOG_DIR}/${ctx:logFileName}.%i.log.gz">
                    <PatternLayout pattern="${PATTERN}" />
                    <SizeBasedTriggeringPolicy size="20971520" />
                </RollingFile>
            </Route>
            <Route ref="Console" key="${ctx:logFileName}" />
        </Routes>
    </Routing>
</Appenders>
<Loggers>
    <Logger name="conference.logger" level="DEBUG" additivity="false">
        <AppenderRef ref="ConferenceLog" />
    </Logger>
</Loggers>
但是我的
conferenceLoggerAppender
始终为空。我的逻辑有什么问题?我试图改变我们目前使用conference.logger的做法

Log conferenceLogger = LogFactory.getLog("conference.logger");
然而,这会创建这样的条目

2017-03-30 18:30:11.576[taskScheduler-24]调试会议记录程序

正如我需要它使用类名一样,它来自于我们所有其他的日志

2017-03-30 18:30:11.576[taskScheduler-24]调试com.foo.bar

我们可以看到appender在那里(rootLogger中) 以下是答案

仅供参考:已将记录器重命名为conferenceLogger

private void conferenceLogger(Long meetingId, String className, Log log, Level level, String message, Throwable error) {
    addConferenceLogAppender(className);
    ThreadContext.put(LOG_FILE_NAME, String.valueOf(meetingId));
    logger(log, level, message, error);
    ThreadContext.remove(LOG_FILE_NAME);
    removeConferenceLogAppender(className);

}

static void removeConferenceLogAppender(String package_name) {
    LoggerContext context = (LoggerContext) LogManager.getContext(false);
    Configuration configuration = context.getConfiguration();
    Appender appender = configuration.getAppender("ConferenceLog");
    LoggerConfig loggerConfig = configuration.getLoggerConfig(package_name);
    loggerConfig.removeAppender(appender.getName());
    context.updateLoggers();
}

static void addConferenceLogAppender(String package_name) {
    LoggerContext context = (LoggerContext) LogManager.getContext(false);
    Configuration configuration = context.getConfiguration();
    Appender appender = configuration.getAppender("ConferenceLog");
    LoggerConfig loggerConfig = configuration.getLoggerConfig(package_name);
    loggerConfig.addAppender(appender, loggerConfig.getLevel(), null);
    context.updateLoggers();
}
private void conferenceLogger(Long meetingId, String className, Log log, Level level, String message, Throwable error) {
    addConferenceLogAppender(className);
    ThreadContext.put(LOG_FILE_NAME, String.valueOf(meetingId));
    logger(log, level, message, error);
    ThreadContext.remove(LOG_FILE_NAME);
    removeConferenceLogAppender(className);

}

static void removeConferenceLogAppender(String package_name) {
    LoggerContext context = (LoggerContext) LogManager.getContext(false);
    Configuration configuration = context.getConfiguration();
    Appender appender = configuration.getAppender("ConferenceLog");
    LoggerConfig loggerConfig = configuration.getLoggerConfig(package_name);
    loggerConfig.removeAppender(appender.getName());
    context.updateLoggers();
}

static void addConferenceLogAppender(String package_name) {
    LoggerContext context = (LoggerContext) LogManager.getContext(false);
    Configuration configuration = context.getConfiguration();
    Appender appender = configuration.getAppender("ConferenceLog");
    LoggerConfig loggerConfig = configuration.getLoggerConfig(package_name);
    loggerConfig.addAppender(appender, loggerConfig.getLevel(), null);
    context.updateLoggers();
}