log4j - 在类/方法

时间:2016-03-09 13:12:51

标签: java java-ee log4j

我有一个应用程序,它有许多ejb Timer方法,它们以不同的间隔触发,试图记录这些计划任务的性能我写了两个方法,记录每个任务的开始和结束,并记录一些信息,如每次定时器触发时的名称,运行持续时间和日志信息

使用日志信息的意图是拦截从这些方法中引发的所有日志记录语句,输出到字符串并保存...我这样做是通过创建一个新的WriterAppender,将所有日志记录级别附加到Logger,然后当计时器完成捕获字符串输出并删除appender

效果不错但似乎有两种不必要的效果:

1)它正在停止出现在普通文件appender日志中出现的计时器类的任何日志记录,例如。正在捕获日志消息,但它们现在没有出现在我们的普通日志中(配置为显示所有内容> INFO

2)来自不同计时器的日志重叠的日志记录出现在彼此的日志中,我想这是Logger在单个线程上工作的结果,不确定是否有办法解决这个问题?

我不是log4j的专家,所以我希望有人可以指出一个简单的修复1,2或两者

下面的代码显示了在每个作业的开始和结束时调用的两种方法

private Writer w = new StringWriter();
private WriterAppender wa;
private Logger logOutput = Logger.getLogger(ScheduledActions.class);

private TimerEvent logStartTimerEvent(ScheduledTask task){

    RedisActions redisActions = (RedisActions)Component.getInstance("redisActions");
    TimerEvent event = new TimerEvent(task);

    //Initialise a new log appender to intercept all log4j entries
    w = new StringWriter();
    Layout l = new PatternLayout("%m%n");
    wa = new WriterAppender(l, w);
    wa.setEncoding("UTF-8");
    wa.setThreshold(Level.ALL);
    wa.activateOptions();

    // Add it to logger
    logOutput = Logger.getLogger(ScheduledActions.class);
    logOutput.addAppender(wa);

    //Push this timer event to redis
    redisActions.addToFixedLengthList(RedisItem.TIMER_HISTORY.getKey()+"_"+task.getName(), gson.toJson(event), 100L);

    return event;
}

private void logEndTimerEvent(TimerEvent event){

    try{

        RedisActions redisActions = (RedisActions)Component.getInstance("redisActions");
        event.setLogInfo(w.toString());
        event.setEndTime(new Date());
        redisActions.editLastMemberInList(RedisItem.TIMER_HISTORY.getKey()+"_"+event.getTask().getName(), gson.toJson(event));
        w.flush();

    } catch (IOException e) {
        e.printStackTrace();
    }finally{
        //clean up the temp log appender
        logOutput.removeAppender(wa);
        wa.close();

    }

}

0 个答案:

没有答案