2011-05-17 149 views
0

我正在写一个servlet。 我有几个班,其中一些我希望他们的日志分开彼此。 这里是log4j的配置文件:log4j日志问题

log4j.rootLogger=INFO, CONSOLE, SearchPdfBill, Scheduler 

# CONSOLE is set to be a ConsoleAppender. 
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender 
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout 
log4j.appender.CONSOLE.layout.ConversionPattern=<%p> %c{1}.%t %d{HH:mm:ss} - %m%n 

# LOGFILE is set to be a file 
log4j.appender.SearchPdfBill=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.SearchPdfBill.File = /bps/app/BpsPdfBill/BpsPdfBill.ear/BpsPdfBill.war/WEB-INF/logs/BpsPdfBill.log 
#log4j.appender.SearchPdfBill.File = E:\\Workspace\\Eclipse_Workspace\\BpsPdfBill\\log\\BpsPdfBill.log 
log4j.appender.SearchPdfBill.Append = true 
log4j.appender.SearchPdfBill.DatePattern = '.'yyyy-MM-dd 
log4j.appender.SearchPdfBill.layout=org.apache.log4j.PatternLayout 
log4j.appender.SearchPdfBill.layout.ConversionPattern=<%p> %c{1}.%t %d{HH:mm:ss} - %m%n 

# LOGFILE is set to be a file 
log4j.appender.Scheduler=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.Scheduler.File = /bps/app/BpsPdfBill/BpsPdfBill.ear/BpsPdfBill.war/WEB-INF/logs/Schedule.log 
#log4j.appender.Scheduler.File = E:\\Workspace\\Eclipse_Workspace\\BpsPdfBill\\log\\BpsPdfBill.log 
log4j.appender.Scheduler.Append = true 
log4j.appender.Scheduler.DatePattern = '.'yyyy-MM-dd 
log4j.appender.Scheduler.layout=org.apache.log4j.PatternLayout 
log4j.appender.Scheduler.layout.ConversionPattern=<%p> %c{1}.%t %d{HH:mm:ss} - %m%n 

我设置一个记录器在这里:

  String logDir = conf.getInitParameter("log_file_path"); 
     if (logDir == null) { 
      initErrMsg = "Param - log_file_path cannot be empty"; 
      throw new ServletException(initErrMsg); 
     } 

     if ((logger = Logger.getLogger(SearchPdfBill.class)) != null) { 
      //writeLog("Initializing log4j."); 
      conf.getServletContext().log("Log4j initialized."); 
     } else { 
      conf.getServletContext().log("Cannot initialize log4j properly."); 
     } 

而另一记录在这里:

  logDir = sc.getInitParameter("log_file_path"); 
     if (logDir == null) { 
      initErrMsg = "Param - log_file_path cannot be empty"; 
      try { 
       throw new ServletException(initErrMsg); 
      } catch (ServletException e) { 
       // TODO Auto-generated catch block 
       conditionalWriteLog(logEnabled, e.getMessage()); 
      } 
     } 

     if ((logger = Logger.getLogger(Scheduler.class)) != null) { 
      //writeLog("Initializing log4j."); 
      conditionalWriteLog(logEnabled, "Log4j initialized."); 
     } else { 
      conditionalWriteLog(logEnabled, "Cannot initialize log4j properly."); 
     } 

然而,最终的2两记录器是记录同样的事情。每个日志都以相同的方式登录到2个文件。为什么?

我认为配置文件可能是错误的,但我不知道它在哪里,有人可以帮我纠正吗?

回答

1

您需要在配置文件中定义这两个记录器。这些对象是否在一个包中?这对您配置它们的方式很重要。说包是com.gunbuster:

log4j.category.com.gunbuster.SearchPdfBill=INFO, SearchPdfBill 
log4j.additivity.com.gunbuster.SearchPdfBill=false 

log4j.category.com.gunbuster.Scheduler=INFO, Scheduler 
log4j.additivity.com.gunbuster.Scheduler=false 

additivity设置是为了防止那些伐木工从添加到rootLogger输出CONSOLE此外,你应该做的第一行:

log4j.rootLogger=INFO, CONSOLE 

从而使rootLogger不会将条目添加到这些文件中。

+0

是不是分类折旧?我怎样才能在程序中创建这些记录器? – lamwaiman1988 2011-05-17 03:55:05

+0

我在Log4j配置中使用'category'没有任何问题,所以我不知道有任何弃用。快速搜索发现'Category'对象已被弃用,但这是不同的。您发布的代码在调用Logger.getLogger(Class type)时已经创建了这些记录器。 logger实例将使用配置中为记录器定义的配置来匹配完全限定的类名称。 – laz 2011-05-17 03:59:58

+0

它的工作原理,谢谢! – lamwaiman1988 2011-05-17 06:06:28