How tomcat works(深入剖析tomcat)(7) Logger
阿新 • • 發佈:2020-11-18
How tomcat works (7)日誌記錄器
總體概述
顧名思義,這一章將的是tomcat的日誌記錄器元件,比較簡單,tomcat提供了幾種型別不同的日誌記錄器,但是所有的日誌記錄器都需要實現Logger介面,Logger的定義如下
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(); //與container繫結 public void setContainer(Container container); public String getInfo(); public int getVerbosity(); //設定日誌級別 public void setVerbosity(int verbosity); public void addPropertyChangeListener(PropertyChangeListener listener); //過載了log方法,不同的logger實現實現了不同的log方法 public void log(String message); public void log(Exception exception, String msg); public void log(String message, Throwable throwable); //這兩個log方法都接收一個verbosity引數,如果該引數的級別數字比該日誌記錄器的級別數字小,才會記錄 //該日誌,好比說DEBUG級別的日誌記錄器可以記錄所有級別的日誌 public void log(String message, int verbosity); public void log(String message, Throwable throwable, int verbosity); public void removePropertyChangeListener(PropertyChangeListener listener); }
tomcat提供了三種具體實現,FileLogger、SystemErrLogger、SystemOutLogger,這三者與Logger的UML圖如下:
LoggerBase為抽象類,它實現了除了log(String msg)
之外的所有方法,而具體的實現類則根據自己的特點實現了不同的log(String msg)
方法,此外LoggerBase的預設日誌級別是ERROR
protected int verbosity = ERROR;
可以呼叫setVerbosity(int verbosity)
來設定
下面來看,三個不同的log方法的實現
SystemOutLogger類
public void log(String msg) { System.out.println(msg); }
SystemErrLogger類
public void log(String msg) {
System.err.println(msg);
}
FileLogger類
public void log(String msg) { // Construct the timestamp we will use, if requested Timestamp ts = new Timestamp(System.currentTimeMillis()); //ts.toString()返回的日期格式如下:yyyy-mm-dd hh:mm:ss.fffffffff //fffffffff表示納秒,substring(0,19)去除掉後面納秒數 String tsString = ts.toString().substring(0, 19); //以天為單位 String tsDate = tsString.substring(0, 10); // If the date has changed, switch log files //如果day發生了變化,換一個檔案重新記錄 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 = ""; } 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; } }
應用程式
直接看看Bootstrap即可
// ------ add logger --------
System.setProperty("catalina.base", "D:\\tomcat\\HowTomcatWorks");
FileLogger logger = new FileLogger();
logger.setPrefix("FileLog_");
logger.setSuffix(".txt");
logger.setTimestamp(true);
logger.setDirectory("webroot");
context.setLogger(logger);