How Tomcat Works学习笔记<七>

 

日志

         日志是一个记录信息的组件,一般来说日志与其它组件一起使用,设计的非常简单,在catalina中所有的日志类都必须实现org.apache.catalina.Logger接口,相关的类都放在org.apache.catalina.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();

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

}

在这里为日志信息定义了五个级别:当写入信息的时候提供的日志级别大于本身的级别,日志将被忽略。

LoggerBase类

         LoggerBase类提供了对日志接口公共方法的实现,如设置日志级别:

         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;

}

记录日志相关方法:

public void log(Exception exception, String msg) {

        log(msg, exception);

    }

    public void log(String msg, Throwable throwable) {

        CharArrayWriter buf = new CharArrayWriter();

        PrintWriter writer = new PrintWriter(buf);

        writer.println(msg);

        throwable.printStackTrace(writer);

        Throwable rootCause = null;

        if (throwable instanceof LifecycleException)

            rootCause = ((LifecycleException) throwable).getThrowable();

        else if (throwable instanceof ServletException)

            rootCause = ((ServletException) throwable).getRootCause();

        if (rootCause != null) {

            writer.println("----- Root Cause -----");

            rootCause.printStackTrace(writer);

        }

        log(buf.toString());

    }

    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类

    实现log(String message)方法,调用System.out.println()方法:

    package org.apache.catalina.logger;

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

    }

}

System.ErrLogger类

与SystemOutLogger方法相似调用System.err.println()方法:

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类

把日志输入到文件中:

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

            }

        }

    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值