How Tomcat works 7: Logger日志系统
1. Logger接口
(1)Code:
package com.cisco.tomcat.logger;
import java.beans.PropertyChangeListener;
import com.cisco.tomcat.lifecycle.Container;
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 void setVerbosity(int verbosity);
public int getVerbosity();
public Container getContainer();
public void setContainer();
public String getInfo();
public void addPropertyChangeListener(PropertyChangeListener propertyChangeListener);
public void removePropertyChangeListener(PropertyChangeListener propertyChangListener);
public void log(String message);
public void log(String message, Throwable throwable);
public void log(String message, int verbosity);
public void log(String message, Throwable throwable, int verbosity);
}
(2)接口包含五个日志层次:
FATAL>ERROR>WARNING>INFORMATION>DEBUG
(1)主要包含三个类:
FileLogger, SystemErrLogger, SystemOutLogger。它们都继承自LoggerBase.
UML图:
(2)LoggerBase抽象类:
代码:
package com.cisco.tomcat.logger;
public abstract class LoggerBase implements Logger{
protected int verbosity = ERROR;
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;
}
}
public abstract void log(String message);
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);
}
}
}
(3)SystemOutLogger类:
代码:
public class SystemOutLogger extends LoggerBase{
protected static final String Info = "logger.SystemOutLogger/1.0";
@Override
public void log(String message) {
System.out.println(message);
}
}
(4)SystemErrLogger类:
代码:
public class SystemErrLogger extends LoggerBase{
protected static final String Info = "logger.SystemErrLogger/1.0";
@Override
public void log(String message) {
System.err.println(message);
}
}
(5)FileLogger类:
根据时间创建日志文件,写入内容
代码:
public class FileLogger extends LoggerBase{
private String date;
private PrintWriter writer;
private String directory;
private String prefix;
private String suffix;
private boolean timestamp = false;
@Override
public void log(String message) {
Timestamp ts = new Timestamp(new Date(), null);
String tsString = ts.toString().substring(0, 19);
String tsDate = tsString.substring(0, 10);
if(!date.equals(tsDate)) {
synchronized (this) {
if(!date.equals(tsDate)) {
close();
date = tsDate;
open();
}
}
}
if(writer != null) {
if(timestamp) {
writer.println(tsString + " " + message);
}else {
writer.println(message);
}
}
}
private void open() {
File dir = new File(directory);
if(!dir.isAbsolute()) {
dir = new File(System.getProperty("catalina.base"), directory);
}
dir.mkdirs();
try {
String pathname = dir.getAbsolutePath() + File.separator + prefix + date+suffix;
writer = new PrintWriter(new FileWriter(pathname, true), true);
}catch(IOException e) {
writer = null;
}
}
private void close() {
if(writer == null) {
return;
}
writer.flush();
writer.close();
writer = null;
date = "";
}
}