日志记录器
用来记录消息的组件。在catalina中,日志记录器需要与某个servlet容器相关联。
在org.apache.catalina.logger包下,Tomcat提供几种不同类型的日志记录器。
与上一节的程序相比,只是SimpleContext和Bootstrap类有变化。
Logger接口
提供了一些log()方法来写日志。
接受一个日志级别的参数,如果参数的日志基本的数字 比 该日志记录器设定的要低,才会记录。
5个级别,fatal ,error,warning,information,debug 通过get、setVerbosity()设置获取。
通过get、setContainer()方法,将日志记录器和servlet关联起来。
FilterLogger、SystemErrorLogger、SystemOutLogger。
他们都继承LoggerBase类,该类也实现了Lifecycle接口。
public void log(String message , int verbosity){
if(this.verbosity > verbosity){
log(message);
}
}
SystemOutLogger类,输出到控制台。
public void log(String msg){
System.out.println(msg);
}
SystemErrorLogger类,输出错误信息到控制台
public void log(String msg){
System.err.println(msg);
}
FilterLogger类,将从servlet容器获得的日志消息,写到一个文件中。并且可以选择是否添加时间戳。
当该类实例化的时候,创建一个空文件,包含日期信息,如果变了则创建一个新文件(包含之前的所有日志)。
start()与stop() 基本不做事情,stop只是关闭日志文件 colse()
public void log(String msg){
Timestamp ts = new Timestamp(System.currentMillis());
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+" "+msg);
}else{
writer.println(msg);
}
}
}
open方法
public void open(){
File dir = new File(directory);
//检验目录是否存在
if(!dir.isAbsolute()){
dir = new File(System.getProperty("Catalina.base"),directory);
}
dir.mkdirs();
//创建指定目录的 日志文件 前缀+当前日期+后缀
String pathname = dir.getAbsolutePath()+File.separator + prefix +date+suffix;
writer = new PrintWriter(new FileWriter(pathname,true),true);
}
close方法
private void close(){
if(writer == null)
return;
writer.flush();
writer.close();
writer = null;
date=""; //时间戳
}
Bootstrap类
在配置好各种容器,并set好之后。增加日志组件。
System.setProperty("catalina.base",System.getProperty("use.dir"));
FileLogger logger = new FileLogger();
logger.setPrefix("FileLog_");
logger.setSuffix(".txt");
logger.setTimestamp(true);
logger.setDirectory("webroot");
context.setLogger(logger);