Tomcat教程

全部教程

×

配置 Tomcat 使用 Log4j

前面介绍了用于 Tomcat 内部日志的 java.util.logging,接下来本部分内容介绍如何通过配置 Tomcat 使用 log4j

注意:当你想重新配置 Tomcat 以便利用 log4j 来进行自身日志记录时,下面的步骤都是必需的;而当你只是想在自己的 Web 应用上使用 log4j 时,这些步骤则不是必需的。在后一种情况下,只需将 log4j.jar 和 log4j.properties 放到 Web 应用的 WEB-INF/lib 和 WEB-INF/classes 中即可。

通过下列步骤可配置 log4j 输出 Tomcat 的内部日志:

1.创建一个包含下列配置的 log4j.properties 文件,将其保存到 $CATALINA_BASE/lib。

log4j.rootLogger = INFO, CATALINA
    # Define all the appenders
    log4j.appender.CATALINA = org.apache.log4j.DailyRollingFileAppender
    log4j.appender.CATALINA.File = ${catalina.base}/logs/catalina
    log4j.appender.CATALINA.Append = true
    log4j.appender.CATALINA.Encoding = UTF-8
    # Roll-over the log once per day
    log4j.appender.CATALINA.DatePattern = '.'yyyy-MM-dd'.log'
    log4j.appender.CATALINA.layout = org.apache.log4j.PatternLayout
    log4j.appender.CATALINA.layout.ConversionPattern = %d [%t] %-5p %c- %m%n
    log4j.appender.LOCALHOST = org.apache.log4j.DailyRollingFileAppender
    log4j.appender.LOCALHOST.File = ${catalina.base}/logs/localhost
    log4j.appender.LOCALHOST.Append = true
    log4j.appender.LOCALHOST.Encoding = UTF-8
    log4j.appender.LOCALHOST.DatePattern = '.'yyyy-MM-dd'.log'
    log4j.appender.LOCALHOST.layout = org.apache.log4j.PatternLayout
    log4j.appender.LOCALHOST.layout.ConversionPattern = %d [%t] %-5p %c- %m%n
    log4j.appender.MANAGER = org.apache.log4j.DailyRollingFileAppender
    log4j.appender.MANAGER.File = ${catalina.base}/logs/manager
    log4j.appender.MANAGER.Append = true
    log4j.appender.MANAGER.Encoding = UTF-8
    log4j.appender.MANAGER.DatePattern = '.'yyyy-MM-dd'.log'
    log4j.appender.MANAGER.layout = org.apache.log4j.PatternLayout
    log4j.appender.MANAGER.layout.ConversionPattern = %d [%t] %-5p %c- %m%n
    log4j.appender.HOST-MANAGER = org.apache.log4j.DailyRollingFileAppender
    log4j.appender.HOST-MANAGER.File = ${catalina.base}/logs/host-manager
    log4j.appender.HOST-MANAGER.Append = true
    log4j.appender.HOST-MANAGER.Encoding = UTF-8
    log4j.appender.HOST-MANAGER.DatePattern = '.'yyyy-MM-dd'.log'
    log4j.appender.HOST-MANAGER.layout = org.apache.log4j.PatternLayout
    log4j.appender.HOST-MANAGER.layout.ConversionPattern = %d [%t] %-5p %c- %m%n
    log4j.appender.CONSOLE = org.apache.log4j.ConsoleAppender
    log4j.appender.CONSOLE.Encoding = UTF-8
    log4j.appender.CONSOLE.layout = org.apache.log4j.PatternLayout
    log4j.appender.CONSOLE.layout.ConversionPattern = %d [%t] %-5p %c- %m%n
    # Configure which loggers log to which appenders
    log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost] = INFO, LOCALHOST
    log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager] =\
  INFO, MANAGER
    log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager] =\
  INFO, HOST-MANAGER

2.下载 log4j(Tomcat 需要 1.2.x 版本)。

3.下载或构建 tomcat-juli.jar 和 tomcat-juli-adapters.jar,以便作为 Tomcat 的额外组件使用。详情参考 Additional Components documentation。

`tomcat-juli.jar` 跟默认的版本不同。它包含所有的 Commons Logging 实现,从而能够发现 log4j 并配置自身。  

4.如果希望全局性地使用 log4j,则如下配置 Tomcat:

  • 将 log4j.jar 和 tomcat-juli-adapters.jar 从 extras 中放入 $CATALINA_HOME/lib 中。
  • 用 extras 中的 tomcat-juli.jar 替换 $CATALINA_HOME/bin/tomcat-juli.jar。

5.如果是利用独立的 $CATALINA_HOME 和 $CATALINA_BASE 来运行 Tomcat,并想在一个 $CATALINA_BASE 中配置使用 log4j,则需要:

  • 创建 $CATALINA_BASE/bin 和 $CATALINA_BASE/lib 目录——如果它们不存在的话。
  • 将 extras 中的 log4j.jar 与 tomcat-juli-adapters.jar 从 extras 放入 $CATALINA_BASE/lib 中。
  • 将 extras 中的 tomcat-juli.jar 转换成 $CATALINA_BASE/bin/tomcat-juli.jar。
  • 如果使用安全管理器运行,则需要编辑 $CATALINA_BASE/conf/catalina.policy 文件来修改它,以便使用不同版本的 tomcat-juli.jar。

注意:其中的工作原理在于:优先将库加载到 $CATALINA_HOME 中同样的库中。

注意:tomcat-juli.jar 之所以从 $CATALINA_BASE/bin 加载(而不是从 $CATALINA_BASE/lib 加载),是因为它是用作引导进程的,而引导类都是从 bin 加载的。

6.删除 $CATALINA_BASE/conf/logging.properties,以防止 java.util.logging 生成零长度的日志文件。

7.启动 Tomcat。

log4j 配置沿用了默认的 java.util.logging 设置:管理器与主机管理器应用各自获得了独立的日志文件,而所有其余内容都发送到 catalina.log 日志文件中。

你可以(也应该)更加挑剔地选择日志所包括的包。Tomcat 使用 Engine 和 Host 名称来定义 logger。比如,要想得到更详细的 Catalina localhost log,可以将它放在 log4j.properties 属性中。注意,在 log4j 基于 XML 的配置文件的命名惯例上,目前存在一些问题,所以建议使用所前所述的属性文件,直到未来版本的 log4j 允许使用这种惯例。

log4j.logger.org.apache.catalina.core.ContainerBase.
[Catalina].[localhost]=DEBUGlog4j.logger.org.apache.catalina.core=
DEBUGlog4j.logger.org.apache.catalina.session=DEBUG

警告:设定为 DEBUG 级别,会产生数以兆计的日志,从而拖慢 Tomcat 的启动。只有当需要调试 Tomcat 内部操作,才应该使用这一级别。

你的 Web 应用当然应该使用各自的 log4j 配置。上面的配置是有效的。你可以将相似的 log4j.properties 文件放到你的 Web 应用的 WEB-INF/classes 目录中,将 log4jx.y.z.jar 放入 WEB-INF/lib 中。 然后指定包级别日志。这是基本的 log4j 配置方法,不需要 Commons-Logging。更多选项可参考 log4j 文档,该页面只是一种引导指南。

额外注意:

  • 通过 Commons 类加载器将 log4j 库暴露给 Web 应用。详见类加载器文档。
    正是由于这一点,使用 [Apache Commons Logging] 库的 Web 应用和库有可能自动会将 log4j 选为底层日志实现。
  • java.util.logging API 仍适用于直接使用它的 Web 应用。${catalina.base}/conf/logging.properties 文件仍然可被 Tomcat 启动脚本所引用。详情可查看本页的简介部分。
  • 如前面相关步骤所述,删除了 ${catalina.base}/conf/logging.properties 文件,会导致 java.util.logging 回退到 JRE 默认的配置,从而使用 ConsoleHandler,然而却不创建任何标准日志文件。所以必须确保:在禁止标准机制之前,所有的日志文件必须是由 log4j 创建的。
  • Access Log Valve 和 ExtendedAccessLogValve 使用它们自包含的日志实现,所以无法配置使用 log4j,详情参看 Valves。