我有一个应用程序,它有许多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();
}
}