第七章 日志记录器

来源:互联网 发布:任易行期货软件 编辑:程序博客网 时间:2024/06/05 04:00

一、概述
日志记录器是用来记录消息的组件。在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 = "";  }  
0 0
原创粉丝点击