本文接下來分析tomcat的日志記錄器,日志記錄器是用來記錄消息的組件,在tomcat中,日志記錄器需要與某個servlet容器相關連;在org.apache.catalina.logger包下,tomcat提供了幾種不同類型的日志記錄器。
tomcat中的日志記錄器都必須實現org.apache.catalina.Logger接口
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);
}
通常,當傳入的日志級別verbosity大于Logger被設置的級別時,message會被記錄,否則被忽略
Logger接口共定義了五種日志級別,分別為FATAL?ERROR?WARNING?INFORMATION?DEBUG
Tomcat提供了三種類型的日志記錄器,分別為SystemOutLogger、SystemErrLogger、FileLogger,在org.apache.catalina.logger包下,均繼承自org.apache.catalina.logger.LoggerBase類
LoggerBase類實現了org.apache.catalina.Logger接口,在tomcat5中還實現了Lifecycle接口
LoggerBase類為抽象類,實現了Logger接口中除abstract void log(String msg)外的全部方法實現,所有的其他重載方法最終都會調用該方法(templet模式),我們還可以調用setVerbosity()方法設置日志級別
具體日志類都比較簡單,下面是SystemOutLogger類的實現
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);
}
}
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);
}
}
FileLogger類稍微復雜一點,將從servlet容器中接收到的消息寫入到一個文件中(在tomcat4中,FileLogger類實現了Lifecycle接口)
public
class
FileLogger
extends
LoggerBase
implements
Lifecycle {
protected
LifecycleSupport lifecycle =
new
LifecycleSupport(
this
);
private
StringManager sm =
StringManager.getManager(Constants.Package);
private
boolean
started =
false
;
private
String suffix = ".log"
;
private
boolean
timestamp =
false
;
private
PrintWriter writer =
null
;
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);
}
}
}
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
;
}
}
public
void
addLifecycleListener(LifecycleListener listener) {
lifecycle.addLifecycleListener(listener);
}
public
LifecycleListener[] findLifecycleListeners() {
return
lifecycle.findLifecycleListeners();
}
public
void
removeLifecycleListener(LifecycleListener listener) {
lifecycle.removeLifecycleListener(listener);
}
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();
}
}
---------------------------------------------------------------------------?
本系列How Tomcat Works系本人原創?
轉載請注明出處 博客園 刺猬的溫馴?
本人郵箱: ? chenying998179 # 163.com ( #改為@ )
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

