Java 正在查找要应用于我的日志的log4j appender
我在log4j2.xml文件中配置了appenderJava 正在查找要应用于我的日志的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
<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();
}