一、前言部分
A Logger是一个记录消息的组件。在Catalina中的一个logger是与一个Container关联,该组件和其他组件相比是相对比较简单。Tomcat在org.apache.catalina.logger包中提供不同类型重做日志功能。在本章的应用程序将会在ex07.pyrmont包中找到,这两个类( SimpleContext,Bootstrap)发生了改变,其他的代码与第六章的应用程序都是一样。
在本章分为三个部分。第一个部分就是说明org.apache.catalina.Logger接口,该接口一定会被整个loggers实现。第二部分解释在Tomcat中的the Loggers,然后第三部分就十分详细的说明在本应用程序中如何运用Tomcat的Loggers。
二、The Logger接口
一个Logger一定要实现org.apache.catalinna.Logger接口,下面请看代码:
package org.apache.catalina;
import java.beans.PropertyChangeListener;
public interface Logger {
public static final int FATAL = Integer.MIN_VALUE;
public static final int ERROR = 1;
public static final int WARNING = 2;
public static final int INFORMATION = 3;
public static final int DEBUG = 4;
public Container getContainer();
public void setContainer(Container container);
public String getInfo();
public int getVerbosity();
public void setVerbosity(int verbosity);
public void addPropertyChangeListener(PropertyChangeListener listener);
public void log(String message);
public void log(Exception exception, String msg);
public void log(String message, Throwable throwable);
public void log(String message, int verbosity);
public void log(String message, Throwable throwable, int verbosity);
public void removePropertyChangeListener(PropertyChangeListener listener);
public void setVerbosityLevel(String verbosity) {
if ("FATAL".equalsIgnoreCase(verbosity))
this.verbosity = FATAL;
else if ("ERROR".equalsIgnoreCase(verbosity))
this.verbosity = ERROR;
else if ("WARNING".equalsIgnoreCase(verbosity))
this.verbosity = WARNING;
else if ("INFORMATION".equalsIgnoreCase(verbosity))
this.verbosity = INFORMATION;
else if ("DEBUG".equalsIgnoreCase(verbosity))
this.verbosity = DEBUG;
}
其中有两个log方法接受一个整数作为the Verbosity level。在这些方法中,如果the verbosity程度低于该组件实例的verbosity程度,那么最终都会调用这个要重载的log方法。你可以看看下面的代码:
public void log(String message, int verbosity) {
if (this.verbosity >= verbosity)
log(message);
}
public void log(String message, Throwable throwable, int verbosity) {
if (this.verbosity >= verbosity)
log(message, throwable);
}
LoggerBase类中的三个子类将会在下部分讨论,你将会看到子类是怎样重载the log(message)方法。
五、The SystemOutLogger 类
The LoggerBase类子类实现了the log(message)方法。每接收到消息就会作为参数传到log方法中,然后就在控制台下打印该消息。下面是The SystemOutLogger类的代码:
package org.apache.catalina.logger;
public class SystemOutLogger
extends LoggerBase {
protected static final String info =
"org.apache.catalina.logger.SystemOutLogger/1.0";
public void log(String msg) {
System.out.println(msg);
}
package org.apache.catalina.logger;
public class SystemErrLogger
extends LoggerBase {
protected static final String info =
"org.apache.catalina.logger.SystemErrLogger/1.0";
public void log(String msg) {
System.err.println(msg);
}
}
呵呵。。。看到了区别了吧。。。
七、The FileLogger类
The FileLogger类是LoggerBase的子类,该子类是功能最为全面的类。该类一旦接收到与容器关联的消息时它就会把该消息写到一个文件中,并且每条消息都会有任意的时间标记。当第一次实例该类时,这个类就会创建一个文件(文件名字就是创建文件的时间)。如果时间改变了,你将会创建一个新的文件