日誌系統是一個記錄信息的組件
在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;
}
}
}