七、The FileLogger类
The
FileLogger类是LoggerBase的子类,该子类是功能最为全面的类。该类一旦接收到与容器关联的消息时它就会把该消息写到一个文件中,并且
每条消息都会有任意的时间标记。当第一次实例该类时,这个类就会创建一个文件(文件名字就是创建文件的时间)。如果时间改变了,你将会创建一个新的文件并把任何消息都写到该文件(文件名字就是创建的时间)中。这个类的实例允许你在文件的名字添加一个前缀和后缀名。
在Tomcat4 中FileLogger类实现了Lifecycle接口,这样就十分的方便像其他组件(都实现了org.apache.catalina.Lifecycle接口)那样,能够启动和关闭。在Tomcat 5 中却是The LoggerBase类(它是FileLogger的父类)且实现了Lifecycle接口.
但是在Tomcat 4 中the LoggerBase类没有实现了Lifecycle接口,所有就没有开始启动组件。这种功能却在子类FileLogger中实现了The Lifecycle接口,因此就能够启动和关闭组件,并能够触发监听者感兴趣的事件。这两个方法会在下面代码中呈现。注意The stop方法也调用了私有close方法( 关闭文件)。The close方法将会在后面的部分讨论。
public void start() throws LifecycleException {
// Validate and update our current component state
if (started)
throw new LifecycleException
(sm.getString("fileLogger.alreadyStarted"));
lifecycle.fireLifecycleEvent(START_EVENT, null);
started = true;
}
public void stop() throws LifecycleException {
// Validate and update our current component state
if (!started)
throw new LifecycleException
(sm.getString("fileLogger.notStarted"));
lifecycle.fireLifecycleEvent(STOP_EVENT, null);
started = false;
close();
}
The FileLogger类最重要的方法是the log方法,请看下面的代码:
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);
}
}
}
The log方法接收到一个消息就把它写到一个日志文件里。在FileLogger实例的生命周期里,the log方法中的可能打开和关闭多个日志文件。如果日期改变,The log方法就会关闭当前的日志文件并且打开了一个新创建的一个日志文件。现在让我们来看看the log方法中的open, close 方法是怎样工作的。
八、The open方法
The open方法请看下面的代码,他主要是在制定的目录下创建一个日志文件。
/**
* 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;
}
}
The open方法开始就核实一下目录(创建日志文件)是否存在。如果目录不存在,该方法也会创建一个目录,然后该目录就会存储到类的成员变量中。
File dir=new File(directory);
if(!dir.isAbsolute())
dir=new File(System.getProperty("catalina.base"),directory);
dir.mkdirs();
然后,the pathname它是由一下部分组成:一个基于打开日志文件的目录, 前缀,当前日期,后缀。
try{
String pathname=dir.getAbsolutePath()+File.separator+
prefix+date+suffix;
接下来,该方法有构造了一个java.io.PrintWriter类实例(该类的构造函数参数是java.io.FileWriter对象(把pathname传给该对象)),The PrintWriter实例赋给了类成员变量writer. The Log方法使用writer写日志消息。
writer=new PrintWriter(new FileWriter(pathname,true),true);
九、The Close方法
The close方法清洗The PrinterWriter对象writer,清洗该对象的内容,关闭the PrinterWriter,设置The PrinterWriter为null,设置日期为空字符串。下面是the close方法代码:
private void close() {
if (writer == null)
return;
writer.flush();
writer.close();
writer = null;
date = "";
}
十、The Log方法
The log方法开始是通过创建一个java.sql.Timestamp类实例(继承了java.util.Date类)。在该方法中实例化The Timestamp类的目的的是能够非常容易的获得当前的时间,并且该方法构造的Timestamp类实例时,是把当前的时间作为参数传给构造函数。
Timestamp ts=new Timestamp(System.currentTimeMills());
使用The Timestamp类用了toString方法变成字符串,那你就能够得到当前日期的字符串形式。toString方法输出字符串格式是:
yyy-mm-dd hh:mm:SS.fffffffff
这个fffffffff代表十亿分之秒。为了仅仅得到时间和小时,该方法有调用了subString方法截取字符串:
String tsString=ts.toString().subString(0,19);
对于tsString字符串为了之得到日期部分那么the Log方法还需要调用subString方法:
String tsDate=tsString.subString(0,10);
The log方法就会用tsDate与String变量的值(初始化的时候只是一个空字符串)进行比较,如果他们不一样的话,那么就会关闭当前文件,把tsDate值赋给date,打开一个新的日志文件。
// If the date has changed, switch log files
if (!date.equals(tsDate)) {
synchronized (this) {
if (!date.equals(tsDate)) {
close();
date = tsDate;
open();
}
}
}
注解: 这中凡是也值得我们学习,如何打开文件,如何创建文件的名字等等,这样设计的思想就一个好字了得。。。
最后,the Log方法同时也写入到输出流的the PrintWriter实例。如果布尔值timestamp值是true,那么日志消息就会带有前缀(tsString),否则的会该日志消息就没有前缀。
// Log this message, timestamped if necessary
if (writer != null) {
if (timestamp) {
writer.println(tsString + " " + msg);
} else {
writer.println(msg);
}
}
十一、应用程序
本章的应用程序与第六章的应用程序十分的类似,除了你有一个FileLogger与SimpleContext对象相关联。在第六章中改变的代码将会在ex07.pyrmont.startup.Bootstrap类主方法找到。下面就请您看看代码吧。这里需要特别关注的是你看看这些变了颜色的代码就可以了。。。
// Log this message, timestamped if necessary
if (writer != null) {
if (timestamp) {
writer.println(tsString + " " + msg);
} else {
writer.println(msg);
}
}
十二、总结
在这章你已经学到了关于the Logger组件,复习了the org.apache.catalina.Logger接口。除此之外,本章的应用程序还应用了FileLogger类,这个在Tomcat中是十分高级的logger.
分享到:
相关推荐
《How Tomcat Works》是一份深入探讨Apache Tomcat工作原理的重要资源,包含了英文PDF文档、中文HTML翻译以及源代码,旨在帮助读者理解Tomcat服务器的内部运作机制。这份资料是IT从业者,特别是Java Web开发者、系统...
《How Tomcat Works》这本书是理解Apache Tomcat服务器工作原理的宝贵资源,它全面深入地讲解了这个流行的Java Servlet和JavaServer Pages(JSP)容器的内部机制。书中的20个章节涵盖了从基础概念到高级特性的广泛...
《How Tomcat Works》这本书深入浅出地介绍了Apache Tomcat这款广泛应用的Java Servlet容器的工作原理。Tomcat作为开源软件,是许多Web应用的基础,尤其在轻量级开发和测试环境中非常常见。以下是对Tomcat核心知识点...
《How Tomcat Works》是一本深入探讨Apache Tomcat工作原理的中文版书籍,对于Java Web开发者来说,理解Tomcat的工作机制至关重要。Tomcat是Apache软件基金会的Jakarta项目中的一个核心部分,它是一个开源的、免费的...
首先,从标题和描述我们可以得知,这个压缩包包含两部分内容:《HowTomcatWorks》的中文翻译和源码。这使得我们能够从理论和实践两个层面去了解Tomcat。中文版的书籍可以帮助中国开发者消除语言障碍,更深入地理解...
《How Tomcat Works》是一本深入探讨Apache Tomcat工作原理的书籍,包含了中英文两个版本。这本书对于理解Java Servlet和JavaServer Pages(JSP)容器的运作方式具有极高的价值,特别是对于那些想要深入理解Web应用...
《How Tomcat Works》是一本深入解析Apache Tomcat工作原理的书籍,同时也包含了源码,为读者提供了理论与实践相结合的深入学习体验。Tomcat是一款广泛使用的开源Java Servlet容器,它是Apache软件基金会 Jakarta...
《How Tomcat Works》是一本深入探讨Apache Tomcat工作原理的专业书籍,对于任何希望深入了解Java Servlet和JavaServer Pages (JSP)容器的人来说,都是一份宝贵的资源。Tomcat作为最流行的开源Servlet容器,其内部...
"HowTomcatWorks"项目,正如其名,旨在帮助开发者了解Tomcat的工作原理,通过源代码分享,使我们有机会深入探究这个强大的服务器内部机制。 1. **Tomcat架构概览** Tomcat的架构设计分为几个主要部分:Catalina...
《How Tomcat Works》是一本深入解析Apache Tomcat工作原理的权威书籍,对于学习和理解Tomcat服务器的内部机制有着极高的价值。Tomcat作为开源的Java Servlet容器,是许多Web应用开发的基础,广泛应用于小型到中型...
《How Tomcat Works》是一本深入探讨Apache Tomcat工作原理的专业书籍,提供了高清中文版和英文版,适合不同语言背景的读者。这本书旨在帮助开发者理解Tomcat服务器的内部运作机制,提升对Java应用服务器的掌控能力...
《Tomcat工作原理详解——(5)容器》 在深入探讨Tomcat的工作原理时,我们不得不提到一个核心概念——容器。Tomcat作为一个流行的开源Java Servlet容器,它的内部架构设计是理解其高效运行的关键。本篇将详细介绍...
《如何Tomcat工作》这本书深入浅出地揭示了Apache Tomcat服务器的工作机制,它是Java Web应用程序的首选服务器之一。Tomcat是开源的、基于Java Servlet和JavaServer Pages(JSP)技术的应用服务器,由Apache软件基金...
《译How Tomcat Works(第二章)》这篇文章主要讲解了Apache Tomcat服务器的工作原理,它是一个开源的Java Servlet容器,广泛用于部署Web应用程序。在这一章中,我们将深入探讨Tomcat如何处理HTTP请求,以及其内部架构...
《How Tomcat Works》这本书深入剖析了Apache Tomcat服务器的工作原理,它是一个开源的Java Servlet容器,用于部署和运行Java Web应用程序。Tomcat是许多Web开发者和企业的首选,因为其轻量级、高效且易于配置。以下...
《How Tomcat Works》是一本深入解析Apache Tomcat服务器运行机制的重要参考资料,它为开发者提供了详尽的理解Tomcat内部工作原理的指南。Tomcat作为Java Servlet和JavaServer Pages(JSP)的开源应用服务器,是许多...
本书《How Tomcat Works》深入剖析了Tomcat 4.1.12 和 5.0.18 的内部工作机制,通过逐步构建简化的组件来帮助读者更好地理解其复杂系统。 #### 二、目标读者群体 本书面向所有从事Java技术领域的开发者: 1. **...