每个服务都有一个log4j appender
,还有一个执行加载这些appender的方法。 appender按预期处理。
在重新加载同一个appender之前是否需要卸载任何/所有appender?如果是这样,我如何卸载这些appender,BasicConfigurator.unConfigure
?
我的示例Appender Loader(注意:UserName
和serviceName
是通过servlet filter
加载的):
protected void configLogger(String serviceName, Integer serviceCode) {
MyConfig config = (MyConfig) getServletContext().getAttribute(CONFIG);
String path = "/" + System.getProperty("jboss.server.home.dir")
+ "/log/services/" + serviceName + ".log";
PatternLayout pl = new PatternLayout(
"%-5p | %d{yyyyMMdd HH:mm:ss,SSS} | %X{userName} | %X{serviceCode} | %L | %m | %n");
DailyRollingFileAppender fileAppender = null;
org.apache.log4j.Level level = org.apache.log4j.Level.INFO;
if (config.isTesting()){
level = org.apache.log4j.Level.DEBUG;
}
try {
fileAppender = new DailyRollingFileAppender(pl, path, "//.yyyyMMdd");
fileAppender.addFilter(new MyLoggerFilter(serviceName, level));
fileAppender.setAppend(true);
BasicConfigurator.configure(fileAppender);
} catch (IOException e) {
e.printStackTrace();
}
}
我的log4j类过滤器:
public class MyLoggerFilter extends Filter {
String serviceCode = "";
Level level;
public FielcoLoggerFilter(String serviceCode, Level level) {
super();
this.serviceCode = serviceCode;
this.level = level;
}
@Override
public int decide(LoggingEvent loggingEvent) {
org.apache.log4j.Level level = loggingEvent.getLevel();
if (level.isGreaterOrEqual(this.level)
&& serviceCode.equals(loggingEvent.getMDC("serviceCode"))) {
// System.out.println("decide" +
// loggingEvent.getMDC("serviceCode"));
return 1;
}
return -1;
}
}