日志记录器

日志记录器作为任何一个系统最重要的组件,可以说没有一套完善的日志组件的系统,是无法投入使用的。
tomcat开发者也对其做出了一个相当优雅的设计实现。

Logger接口

org.apache.catalina.Logger接口描述了一个通用的信息与异常的Logger,理论上logger能被用在任何container上,但是实际的典型应用中,Logger只会用在Context或更高的级别容器上。

1
2
3
4
5
6
7
8
9
10
public interface Logger {
// 定义了一些日志级别的常量,fatal/error/warning/information/debug
public static final int FATAL = Integer.MIN_VALUE;
// 属性: container, info, verbosity日志级别
Container getContainer(); ...
// 定义了一些重载的log方法
void log(String message);
void log(Exception exception, String msg);
...
}

Tomcat的日志记录器

LoggerBase类

LoggerBase这个抽象类提供了Logger接口的基础实现,但将核心方法log(String)交由子类实现,类似于模板方法模式。

SystemOutLogger/SystemErrLogger类

继承自LoggerBase,分别以System.out.println(String)/System.err.println(String)实现了抽象方法log(String)。

FileLogger类

这个类将servlet容器中接受到的日志消息写到一个文件中,并且可以选择添加时间戳,并且会根据日期的变化创建新的文件,同时提供了文件名称的前缀与后缀设置接口。

这个类的具体实现无需赘述,可以看出,tomcat引擎级别的日志catalina.2016-11-08.log,主机级别的日志localhost.2016-11-08.txt都是由此类生成的。具体设置在$CATALINA_BASE/conf/logging.properties。