我有一个jsp web应用程序,我按如下方式打印错误堆栈跟踪:
catch (SQLException e) {
e.printStackTrace(System.out);
}
但在生产环境中,我不希望我的应用程序打印一些东西。我想放一个全局标志(例如Debug = true)。然后我会像这样更新代码
if(debug) e.printStackTrace(System.out);
我的申请表中有很多页面。现在我应该在哪里声明调试变量?我可以将它放在web.xml文件中,但我不确定它是否安全。谢谢
答案 0 :(得分:3)
使用JB Nizet建议的日志记录API。它们使用起来相当简单。这是一个使用来自Apache(http://logging.apache.org/log4j)的Log4j实现日志记录的小例子,非常受欢迎。
您的所有课程都有一个记录器准备好的实例
private static final Logger log = Logger.getLogger(this.getClass());
然后在你捕捉异常的地方
catch (SQLException e) {
log.debug(e);
}
然后只需使用log4j.properties
classpath
配置Log4j
log4j.appender.stdout.Target=System.out
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout
log4j.rootLogger=debug, stdout
转换日志就像改变
一样简单log4j.rootLogger=warn, stdout
这意味着您只对处于警告级别或更高级别(如错误或致命)级别的日志语句感兴趣。大约有六个日志级别:致命,错误,警告,信息,调试和跟踪。设置级别时,将忽略以低于您指定的级别记录的所有日志语句。
请注意,我已经简化了上述内容。建议使用log4j.xml
代替.properties
。最新的API还允许您在记录之前完成检查以获得一些性能
catch (SQLException e) {
if (log.isDebugEnabled()) log.debug(e);
}
但是,在执行Globals.DEBUG
之前使用框架而不仅仅是检查printStackTrace()
标志的真正卖点是它是未来的证据。如果您必须将文件记录到文件中,只需从ConsoleAppender
切换到FileAppender
即可。想要通过fatal
发送的电子邮件,仅使用SMTPAppender
来处理此用例。其他appender保持原样配置。