第七章 日志记录器

一、概述
日志记录器是用来记录消息的组件。在catalina中,日志记录器需要与摸个servlet容器关联。

二、常用接口、类
①Logger接口
tomcat中的日志记录器都必须实现此接口。

package org.apache.catalina;  

import java.beans.PropertyChangeListener;  

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

接口中的最后两个log()方法接收一个日志级别的参数。如果参数的日志级别的数字比该日志记录器实例中设定的级别低,才会记录该条消息。否则,会忽略该条记录。
logger接口中共定义了5中日志级别,分别是fatal、error、warning、information和debug。可以使用getVerbosity()和setVerbosity()方法来获取/设置日志级别。

②tomcat日志记录器
Tomcat提供了3种日志记录器。分别是FileLogger、SystemOutLogger和SystemErrorLogger。
UML类图如下:
这里写图片描述

③LoggerBase类
这是一个抽象类,我们知道抽象类可以不实现接口中的所有方法。该类实现了Logger接口中除log(String msg)方法外的所有方法。需要子类实现该方法。

public abstract void log(String msg);

接收日志等级的两个log()重载方法。

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

④SystemOutLogger类
该类继承自LoggerBase,提供了log(String name)重载方法的实现。

public class SystemOutLogger extends LoggerBase{
    public void log(String msg){
        system.out.println(msg);
    }
}

⑤SystemErrLogger类
与SystemOutLogger相似。

public class SystemOutLogger extends LoggerBase{
    public void log(String msg){
        system.err.println(msg);
    }
}

⑥FileLogger类
此类是LoggerBase类的3个子类中最复杂的一个。它从servlet容器中接收到的消息写到一个文件中。
FileLogger类中最为重要的方法是log()。

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);  
        System.out.println("tsString   "+tsString); //tsString   2014-10-20 15:25:27  
        System.out.println("ts   "+ts);            //ts   2014-10-20 15:25:27.406  
        System.out.println("tsDate   "+tsDate);        //tsDate   2014-10-20  

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

log()方法会将接收到的日志消息写到一个日志文件中。在FileLogger实例的整个生命周期中,log()方法可能会打开或关闭多个日志文件。典型情况下,当日期发生变化时,log()方法会关闭当前日志文件,并打开一个新的文件。
1.open()方法

private void open() {  

     // Create the directory if necessary  
     File dir = new File(directory);  
     if (!dir.isAbsolute())  
         dir = new File(System.getProperty("catalina.base"), directory);  //至于catalina.base是什么 一会再说  
     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;  
     }  

 }  

2.close()方法

private void close() {  

    if (writer == null)  
        return;  
    writer.flush();  
    writer.close();  
    writer = null;  
    date = "";  
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值