tomcat——簡單的日誌實現

日誌系統是一個記錄信息的組件

Catalina中,日誌系統是一個相對簡單的跟容器相關聯的組件

一個日誌系統必須實現org.apache.catalina.Logger接口

日誌接口提供了日誌系統要實現的方法,最簡單的方法是接受一個字符串並將其記錄

verbosity level : 冗餘級別

五個冗餘級別:

FATAL

ERROR

DEBUG

WARNING

INFOMATION


Logger接口:

public interface Logger {

    //冗餘級別
    int FATAL = Integer.MIN_VALUE;

    int ERROR = 1;

    int WARNING = 2;

    int INFORMATION = 3;

    int DEBUG = 4;


    Container getContainer();

    void setContainer(Container container);

    String getInfo();

    //獲取日誌實現的冗餘級別
    int getVerbosity();

    void setVerbosity(int verbosity);

    void log(String message);

    /**
     * 如果傳遞的數字低於該類的實例設置的冗餘級別,就將信息記錄下來,否則就忽略信息。
     *
     * @param message   日誌信息
     * @param verbosity 冗餘級別
     */
    void log(String message, int verbosity);

}


LoggerBase:

Tomcat提供了三種日誌系統
1. FileLogger
2. SystemErrLogger
3. SystemOutLogger
它們都繼承了LoggerBase類,LoggerBase類實現了Logger接口
LoggerBase是一個抽象類,實現了Logger接口中除了log(String msg)之外的所有方法
LoggerBase默認冗餘級別爲ERROR

public abstract class LoggerBase
        implements Logger {

    protected Container container = null;

    protected int debug = 0;
    //getInfo獲取的信息
    protected static final String info =
            "org.apache.catalina.logger.LoggerBase/1.0";

    //默認冗餘級別爲ERROR
    protected int verbosity = ERROR;

    public Container getContainer() {
        return container;
    }

    public void setContainer(Container container) {
        this.container = container;
    }

    public int getDebug() {
        return debug;
    }

    public void setDebug(int debug) {
        this.debug = debug;
    }

    public String getInfo() {
        return info;
    }

    public int getVerbosity() {
        return this.verbosity;
    }

    public void setVerbosity(int verbosity) {
        this.verbosity = verbosity;
    }

    public void setVerbosityLevel(String verbosity) {
        if ("FATAL".equalsIgnoreCase(verbosity)) {
            this.verbosity = FATAL;
        } else if ("ERROR".equalsIgnoreCase(verbosity)) {
            this.verbosity = ERROR;
        } else if ("WARNING".equalsIgnoreCase(verbosity)) {
            this.verbosity = WARNING;
        } else if ("INFORMATION".equalsIgnoreCase(verbosity)) {
            this.verbosity = INFORMATION;
        } else if ("DEBUG".equalsIgnoreCase(verbosity)) {
            this.verbosity = DEBUG;
        }
    }

    /**
     * 交給子類去實現
     *
     * @param msg 日誌信息
     */
    public abstract void log(String msg);

    public void log(String message, int verbosity) {
        if (this.verbosity >= verbosity)
            log(message);
    }

}

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


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


測試類:TestLogger

public class TestLogger {
    public static void main(String[] args) {
        Logger logger = new SystemOutLogger();
        logger.log("SystemOutLogger");
        logger = new SystemErrLogger();
        logger.log("SystemErrLogger");
    }
}

FileLogger:把日誌記錄在文件中,文件名帶有日期信息

public class FileLogger
        extends LoggerBase {
    private String date = "";

    private String directory = "logs";

    protected static final String info =
            "org.apache.catalina.logger.FileLogger/1.0";
    //文件前綴
    private String prefix = "catalina.";
    //文件後綴
    private String suffix = ".log";

    private boolean timestamp = false;

    private PrintWriter writer = null;

    public String getDirectory() {
        return directory;
    }

    public void setDirectory(String directory) {
        String oldDirectory = this.directory;
        this.directory = directory;
    }


    public String getPrefix() {
        return prefix;
    }

    public void setPrefix(String prefix) {
        String oldPrefix = this.prefix;
        this.prefix = prefix;
    }

    public String getSuffix() {
        return suffix;
    }

    public void setSuffix(String suffix) {
        String oldSuffix = this.suffix;
        this.suffix = suffix;
    }

    public boolean getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(boolean timestamp) {
        boolean oldTimestamp = this.timestamp;
        this.timestamp = timestamp;

    }

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


    /**
     * Close the currently open log file (if any)
     */
    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;
        }
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章