1. 程式人生 > 實用技巧 >How tomcat works(深入剖析tomcat)(7) Logger

How tomcat works(深入剖析tomcat)(7) Logger

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);