本文主要讲的是 Tomcat 本身自己对日志的处理,而非每一个 webapp 的日志配置(如今 webapp 通常会独立配置日志)。
内容基本上来自官方文档:http://tomcat.apache.org/tomcat-6.0-doc/logging.htmlhtml
1、Webapp 记录日志的方法
Tomcat 中的 webapp 有三种方法记录日志:java
- 使用 java.util.logging
- 使用 Servlet 标准中的日志记录方法 javax.servlet.ServletContext.log(...)
- 使用任意其它的日志框架(例如 Log4j)
通常来讲,每一个 webapp 使用的日志框架都是独立的,不会影响其余 webapp。但若是用的是 Java 原生的 java.util.logging,因为它是经过系统加载的,所以各个 webapp 之间会共享同一个日志配置。web
2、什么是 JULI
Tomcat 默认会使用 java.util.logging (JUL) 日志框架,但重写了一些实现,以解决一个 JVM 中 JUL 只能使用一个配置文件的问题,知足多个 webapp 独立配置日志的需求。这个实现就叫 JULI (['d?u:li])。apache
全局日志配置tomcat
- 默认使用 ${catalina.base}/conf/logging.properties,这个路径在 Tomcat 启动脚本中经过 java.util.logging.config.file 系统属性指定
- 若是上述默认配置文件不可用(不存在或无权限读取),则使用 JRE 中的 ${java.home}/lib/logging.properties
webapp 独立日志配置app
- JULI 支持每一个 ClassLoader (也就是每一个 webapp) 使用本身的日志配置,配置文件位于 {webapp]/WEB-INF/classes/logging.properties
控制台框架
- 在 Linux 上运行 Tomcat 时,控制台的输出 (System.err/out) 同时会被保存到文件 catalina.out 中,这个名称是经过运行脚本指定的
- 在 Windows 上,若是以服务的形式运行 Tomcat,也会将控制台输出保存到文件(文档没说文件名是什么。。。),若是不以服务的形式运行,则不会保存控制台输出
3、JULI 对 JUL 的扩展
- 配置文件中能经过 ${systemPropertyName} 的格式使用系统属性
- Handler
- JUL 中,handler 名称即为类的完整限定名,一个类只能建立一个 handler。而 JULI 的 handler 名称能够在类的完整限定名以前加前缀,该前缀以数字开头,以 . 结尾(注意中间不能出现 .),例如 5portallocal.
- JULI 定义一些 handler 类,例如 org.apache.juli.FileHandler,支持缓冲。
- Logger
- 每一个 logger 能够指定多个 handler(Java 6 的 JUL 开始支持)
- root logger 可使用 .handler 指定 handler:
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].useParentHandlers = true
- 注意,若是一个 logger 已经指定了 handler,则默认不会将日志传递给上级 logger,但能够经过 useParentHandlers 修
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].useParentHandlers = true
4、生产环境中的注意事项
5、其它
Tomcat 也能配置为使用 Log4j 代替 JULI 来处理日志,详见 http://tomcat.apache.org/tomcat-6.0-doc/logging.html#Using_Log4jwebapp