Tomcat Servlet 日志记录

13

我是Servlet容器的新手,使用Tomcat 6.0.26创建了一个Web应用程序。我的代码中散布着“TODO: log”. 我看到存在以下内容:

myServlet.getServletContext().log()

这似乎会将日志写入以“localhost”为前缀的文件,位于Tomcat“/logs”目录中。 我不需要任何高级记录功能,但至少需要日期、时间、消息和堆栈跟踪。此外,我创建了一些被各种servlet使用的类,它们也需要记录功能。 我需要将SevletContext注入这些类中以便它们可以记录吗?

Apache的log4j似乎是常用的日志包,但我不确定是否值得设置。

对于我的需求,推荐的记录方式是什么?

2个回答

12
您不想将所有业务和数据访问代码与ServletContext捆绑在一起(当然,我假设您的业务和数据库代码没有在一个servlet类内部紧密耦合,而只是存在于它们自己的类层中,没有任何javax.servlet引用)。因此,我不建议使用ServletContext#log()。在现实世界中,它也很少被使用。
您是对的,log4j很受欢迎,尽管它已被logback取代。设置log4j并不需要那么麻烦。我建议先使用比XML文件更易理解的属性文件开始。一旦您了解了log4j配置中发生的事情,您可以随时升级到XML文件。
创建名为log4j.properties的文件,并将其放置在类路径的根目录下,例如/WEB-INF/classes(或者如果您使用的是IDE,可以将其放置在src文件夹的根目录下,它最终会落在正确的位置)。您还可以将其保留在webapp之外,并通过在Tomcat/conf/catalina.properties中指定其路径来将其路径添加到服务器的运行时类路径中的shared.loader属性中。最后按以下方式填充它:
# Set root logger level and appender name.
log4j.rootLogger = TRACE, console

# Specify appenders.
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.file = org.apache.log4j.DailyRollingFileAppender

# Configure console appender.
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern = %d{ABSOLUTE} [%t] %-5p %m%n

# Configure file appender.
log4j.appender.file.File = /webapp/logs/web.log
log4j.appender.file.DatePattern = '.'yyyy-MM-dd
log4j.appender.file.layout = org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern = %d{ABSOLUTE} [%t] %-5p %m%n

这个启动示例默认记录TRACE级别的日志。您可以像这样将其更改为DEBUGINFO

# Set root logger level and appender name.
log4j.rootLogger = INFO, console

这个例子默认使用控制台 appender。它会按照 Tomcat 的默认配置将日志记录到标准输出,而标准输出通常会被重定向到 /logs/localhost.yyyy-MM-dd.log 文件中。

但是,你可以通过以下方式将其更改为使用文件 appender:

# Set root logger level and appender name.
log4j.rootLogger = INFO, file
ConversionPattern设置的详细信息可以在PatternLayout javadoc中找到。
希望这能帮助你入门。

谢谢提供信息。我在使用Log4j时最不理解的就是如何在代码中使用它。我应该如何在Servlet、Bean和POJO中使用它?我需要创建一个Log4j实例,然后查找并解析属性或XML文件吗? - Wilson
只需使用 Logger#getLogger() 然后使用 debug()info() 等方法即可。您无需每次查找和解析它。如果它在类路径中,log4j 将自行处理。这确实是初学者常见的问题,因为他们不理解 "classpath"。 - BalusC
1
回应BalusC所说的,SLF4J + Logback 是更现代化的日志记录方式。由log4j的发明者创建,并旨在成为log4j的继承者。有关更多信息,请参见我的答案类似问题 - Basil Bourque
@BalusC - 有没有一种简单的方法可以将Servlet活动记录到文件中,而不需要log4j或console?我已经发布了一个关于此问题的问题。请在https://stackoverflow.com/questions/23858552/simple-way-to-log-servlet-in-tomcat上帮助我。 - Erran Morad

9
除了BalusC上面提到的所有内容之外,在您的Java代码(servlets/beans/whatever)中,只需导入并初始化Logger即可。
package my.app;

import org.apache.log4j.Logger;

private static Logger logger = Logger.getLogger("classname");
// use any string you want 

在任何日志记录点,您可以记录不同级别的日志,例如:

if (logger.isDebugEnabled()) {
            logger.debug("Some log at this point");
        }

...

logger.info("Some info message here");

这些内容将出现在日志中,取决于您在log4j.properties中设置的DEBUG或INFO。

请查看http://www.java2s.com/Code/Java/Language-Basics/Examplelog4jConfigurationFile.htm上的示例以及同一篇文章中的所有相关示例。


1
谢谢你的帮助。我似乎找不到这个拼图的连接部分。另外,JDK内置的日志记录工具为什么不经常使用呢? - Wilson
@Wilson - 关于那场辩论,可以参考以下链接:https://dev59.com/-HVD5IYBdhLWcg3wRpeX 和 https://dev59.com/MkbRa4cB1Zd3GeqP2qwC - JoseK
@JoseK - 有没有一种简单的方法可以将Servlet活动记录到文件中,而不需要log4j或控制台? 我已经发布了一个问题。请在此处帮助我 - https://stackoverflow.com/questions/23858552/simple-way-to-log-servlet-in-tomcat - Erran Morad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接