使用Log4j在Tomcat 7中进行应用程序日志记录

时间:2012-06-14 13:59:38

标签: tomcat web-applications logging log4j

我在Windows上运行Tomcat 7的vanilla安装的Web应用程序,内部Tomcat日志记录保持不变(默认)。在我的应用程序中,我使用log4j,它有一个RollingFileAppender写入TOMCAT / logs目录中我自己的应用程序日志(app.log)(而不是localhost.yyyy-mm-dd.log)。对于我的应用程序,日志似乎工作正常,除了一些堆栈跟踪不会显示在app.log中,而是显示在localhost.yyyy-mm-dd.log中。例如,我的应用程序缺少commons-validators类,并且此堆栈跟踪未显示在app.log中。

我不确定如何让这些堆栈跟踪显示在我的app.log中?我的log4j.properties文件在这里:

### Root Level ###
log4j.rootLogger=WARN, LOGFILE

### Application Level ###
log4j.logger.com.ccn=TRACE

### Spring ###
log4j.logger.org.springframework.core=INFO
log4j.logger.org.springframework.beans=INFO
log4j.logger.org.springframework.context=INFO
log4j.logger.org.springframework.web=INFO

### Configuration for the LOGFILE appender ###
log4j.appender.LOGFILE=org.apache.log4j.RollingFileAppender
log4j.appender.LOGFILE.MaxFileSize=5MB
log4j.appender.LOGFILE.MaxBackupIndex=10
log4j.appender.LOGFILE.File=$\{catalina.home\}/logs/app.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=[%p %d %t]  %c  [%C{1}.%M(): "%m"]%n

2 个答案:

答案 0 :(得分:1)

我发现了问题。我正在使用org.springframework.stereotype.Controller注释来标记我的控制器类。我失去的具体例外是在这堂课中产生的。解决方案是在类中的方法中添加@ExceptionHandler注释,我可以将异常重定向到Log4j,类似于:

@ExceptionHandler
public void handleException(Exception e) {
    logger.error("Error: ", e);
}

如果没有@ExceptionHandler装饰方法,堆栈跟踪将被吐出到stderr,最终出现在localhost.yyyy-mm-dd.log中。

答案 1 :(得分:0)

如何进行堆栈跟踪记录?

就我而言,

Logger log = Logger.getLogger(HogeServlet.class);
try {
    // Something
} catch (HogeException e) {
    log.error("Hoge Error !!", e); // Print stack trace
}