【发布时间】:2012-02-25 20:56:42
【问题描述】:
我有一个 spring 批处理程序,我在其中实现如下skiplistener 类:
public class MySkipListener implements SkipListener<SomeBean, SomeBean> {
public void onSkipInProcess(final SomeBean item, final Throwable t) {
// TODO Auto-generated method stub
System.out.println("Skipped details during PROCESS is: " + t.getMessage());
LogFactory.getLog("INFO" + MySkipListener.class.getName()).info(
"Skipped details during PROCESS is: " + t.getMessage());
}
public void onSkipInRead(final Throwable t) {
System.out.println("Skipped details during READ is: " + t.getMessage());
LogFactory.getLog("INFO" + MySkipListener.class.getName()).info(
"Skipped details during READ is: " + t.getMessage());
}
public void onSkipInWrite(final SomeBean item, final Throwable t) {
// TODO Auto-generated method stub
System.out.println("Skipped details during WRITE is: " + t.getMessage());
LogFactory.getLog("INFO" + MySkipListener.class.getName()).info(
"Skipped details during WRITE is: " + t.getMessage());
}
}
log4j 配置是:
log4j.rootLogger=myLOG
log4j.appender.myLOG=org.apache.log4j.RollingFileAppender
log4j.appender.myLOG.File=myLog.log
log4j.appender.myLOG.MaxFileSize=100KB
# Keep one backup file
log4j.appender.myLOG.MaxBackupIndex=1
log4j.appender.myLOG.layout=org.apache.log4j.PatternLayout
log4j.appender.myLOG.layout.ConversionPattern=%d{dd/MM/yyyy HH:mm:ss.SSS} [%t] [%c{1}] %-5p %x - %m%n
很明显,所有的日志记录语句都会进入 myLog.log,包括上面跳过侦听器类方法中的语句。
但是,我不希望跳过的项目日志进入主日志文件。我希望他们转到一个单独的文件(例如skippedItems.log),这样我就不需要在主日志中搜索跳过的项目行,而是直接在一个单独的文件中获取所有跳过的项目。
我需要做哪些改变才能实现这一目标?
如果 myLOGTwo 是我的配置中未添加到 rootLogger 中的新附加程序,则以下尝试不起作用。因此,每次我想通过该 appender 写入时,我都想动态地将其添加和删除到 rootLogger。
Logger l = Logger.getRootLogger();
Appender a = l.getAppender("myLOGTwo");
l.addAppender(a);
LogFactory.getLog("INFO" + MySkipListener.class.getName()).info("Testing");
l.removeAppender(a);
【问题讨论】:
-
为什么要使用 add/removeAppender ?参见例如jguru.com/faq/view.jsp?EID=1311014 它适用于 getLogger("category")
标签: spring log4j logging spring-batch