本文接下來分析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元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
