Tomcat中的日志记录器都必须实现org.apache.catalina.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 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);
}
首先FileLogger还实现了Lifecycle接口,因此它能够像其它组件一样被父组件所启动。
在本节中FileLogger的start与stop方法事实上仅仅是改变了布尔值started而已,没有做其它的,还有一方面,FileLogger的start与stop方法也并没有被调用!
如今我们就看看怎么给文件中写信息。
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);
System.out.println("tsString "+tsString); //tsString 2014-10-20 15:25:27
System.out.println("ts "+ts); //ts 2014-10-20 15:25:27.406
System.out.println("tsDate "+tsDate); //tsDate 2014-10-20
// 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);
}
}
} private void open() {
// Create the directory if necessary
File dir = new File(directory);
if (!dir.isAbsolute())
dir = new File(System.getProperty("catalina.base"), directory); //至于catalina.base是什么 一会再说
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;
}
}
private void close() {
if (writer == null)
return;
writer.flush();
writer.close();
writer = null;
date = "";
}...
System.setProperty("catalina.base", System.getProperty("user.dir"));
FileLogger logger = new FileLogger();
logger.setPrefix("FileLog_");
logger.setSuffix(".txt");
logger.setTimestamp(true);
logger.setDirectory("webroot");
context.setLogger(logger);
....
public synchronized void start() throws LifecycleException {
log("starting Context");
........
lifecycle.fireLifecycleEvent(AFTER_START_EVENT, null);
log("Context started");
}
private void log(String message) {
Logger logger = this.getLogger();
if (logger!=null)
logger.log(message);
}原文:http://www.cnblogs.com/wzzkaifa/p/7066940.html