Tomca教程
Tomcat Manager
Tomcat Realm 配置
Tomcat 安全管理
Tomcat JNDI 资源
Tomcat JDBC 数据源
Tomcat 类加载机制
Tomcat JSPs
Tomcat SSL/TLS配置
Tomcat SSI
Tomcat CGI
Tomcat 代理支持
Tomcat MBean 描述符
Tomcat 默认 Servlet
Tomcat 集群
Tomcat 连接器
Tomcat监控与管理
Tomcat 日志机制
Tomcat 基于 APR 的原生库
Tomcat 虚拟主机
Tomcat 高级 IO 机制
Tomcat 附加组件
Tomcat 安全性注意事项
Tomcat Windows 服务
Tomcat Windows 认证
Tomcat 的 JDBC 连接池
Tomcat WebSocket 支持
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。