如何以编程方式删除Log4j Appenders?

时间:2012-12-13 16:22:56

标签: java logging jboss log4j

每个服务都有一个log4j appender,还有一个执行加载这些appender的方法。 appender按预期处理。

在重新加载同一个appender之前是否需要卸载任何/所有appender?如果是这样,我如何卸载这些appender,BasicConfigurator.unConfigure

我的示例Appender Loader(注意:UserNameserviceName是通过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;
    }

}

0 个答案:

没有答案