日志系统是一个记录信息的组件
在Catalina中,日志系统是一个相对简单的跟容器相关联的组件
一个日志系统必须实现org.apache.catalina.Logger接口
日志接口提供了日志系统要实现的方法,最简单的方法是接受一个字符串并将其记录
verbosity level : 冗余级别
五个冗余级别:
FATAL
ERROR
DEBUG
WARNING
INFOMATION
Logger接口:
public interface Logger {
//冗余级别
int FATAL = Integer.MIN_VALUE;
int ERROR = 1;
int WARNING = 2;
int INFORMATION = 3;
int DEBUG = 4;
Container getContainer();
void setContainer(Container container);
String getInfo();
//获取日志实现的冗余级别
int getVerbosity();
void setVerbosity(int verbosity);
void log(String message);
/**
* 如果传递的数字低于该类的实例设置的冗余级别,就将信息记录下来,否则就忽略信息。
*
* @param message 日志信息
* @param verbosity 冗余级别
*/
void log(String message, int verbosity);
}
Tomcat提供了三种日志系统
1. FileLogger
2. SystemErrLogger
3. SystemOutLogger
它们都继承了LoggerBase类,LoggerBase类实现了Logger接口
LoggerBase是一个抽象类,实现了Logger接口中除了log(String msg)之外的所有方法
LoggerBase默认冗余级别为ERROR
public abstract class LoggerBase
implements Logger {
protected Container container = null;
protected int debug = 0;
//getInfo获取的信息
protected static final String info =
"org.apache.catalina.logger.LoggerBase/1.0";
//默认冗余级别为ERROR
protected int verbosity = ERROR;
public Container getContainer() {
return container;
}
public void setContainer(Container container) {
this.container = container;
}
public int getDebug() {
return debug;
}
public void setDebug(int debug) {
this.debug = debug;
}
public String getInfo() {
return info;
}
public int getVerbosity() {
return this.verbosity;
}
public void setVerbosity(int verbosity) {
this.verbosity = verbosity;
}
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;
}
}
/**
* 交给子类去实现
*
* @param msg 日志信息
*/
public abstract void log(String msg);
public void log(String message, int verbosity) {
if (this.verbosity >= verbosity)
log(message);
}
}
SystemErrLogger:
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);
}
}
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);
}
}
public class TestLogger {
public static void main(String[] args) {
Logger logger = new SystemOutLogger();
logger.log("SystemOutLogger");
logger = new SystemErrLogger();
logger.log("SystemErrLogger");
}
}
FileLogger:把日志记录在文件中,文件名带有日期信息
public class FileLogger
extends LoggerBase {
private String date = "";
private String directory = "logs";
protected static final String info =
"org.apache.catalina.logger.FileLogger/1.0";
//文件前缀
private String prefix = "catalina.";
//文件后缀
private String suffix = ".log";
private boolean timestamp = false;
private PrintWriter writer = null;
public String getDirectory() {
return directory;
}
public void setDirectory(String directory) {
String oldDirectory = this.directory;
this.directory = directory;
}
public String getPrefix() {
return prefix;
}
public void setPrefix(String prefix) {
String oldPrefix = this.prefix;
this.prefix = prefix;
}
public String getSuffix() {
return suffix;
}
public void setSuffix(String suffix) {
String oldSuffix = this.suffix;
this.suffix = suffix;
}
public boolean getTimestamp() {
return timestamp;
}
public void setTimestamp(boolean timestamp) {
boolean oldTimestamp = this.timestamp;
this.timestamp = timestamp;
}
public void log(String msg) {
// Construct the timestamp we will use, if requested
Timestamp ts = new Timestamp(System.currentTimeMillis());
String tsString = ts.toString().substring(0, 19);
String tsDate = tsString.substring(0, 10);
// If the date has changed, switch log files
if (!date.equals(tsDate)) {
synchronized (this) {
if (!date.equals(tsDate)) {
close();
date = tsDate;
open();
}
}
}
// Log this message, timestamped if necessary
if (writer != null) {
if (timestamp) {
writer.println(tsString + " " + msg);
} else {
writer.println(msg);
}
}
}
/**
* Close the currently open log file (if any)
*/
private void close() {
if (writer == null)
return;
writer.flush();
writer.close();
writer = null;
date = "";
}
/**
* Open the new log file for the date specified by <code>date</code>.
*/
private void open() {
// Create the directory if necessary
File dir = new File(directory);
if (!dir.isAbsolute()) {
dir = new File(System.getProperty("catalina.base"), directory);
}
dir.mkdirs();
// Open the current log file
try {
String pathname = dir.getAbsolutePath() + File.separator +
prefix + date + suffix;
writer = new PrintWriter(new FileWriter(pathname, true), true);
} catch (IOException e) {
writer = null;
}
}
}