第七章 日志记录器
来源:互联网 发布:任易行期货软件 编辑:程序博客网 时间: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 = ""; }
- 第七章 日志记录器
- 日志记录器
- Sysklogd 系统日志记录器
- Sysklogd 系统日志记录器
- Sysklogd 系统日志记录器
- Sysklogd系统日志记录器
- log4j(日志记录器)
- tomcat(7)日志记录器
- Log4j日志记录器
- ACE提供的日志记录器
- Sysklogd 系统日志记录器使用指南
- ACE提供的日志记录器
- Log4j配置单独的日志记录器
- how tomcat works读书笔记 七 日志记录器
- aop之应用 时间记录器及日志
- Log4j扩展使用--日志记录器Logger
- 7.1 Tomcat学习(日志记录器Logger)
- Tomcat源码分析(六)--日志记录器和国际化
- java在mac上的安装路径
- (8421.BCD码)加权组合应用
- 求第n个数的斐波那数
- Android系统所有可申明的权限(中文)
- 【编程范式】【响应式编程】【本质】【到底是什么】
- 第七章 日志记录器
- study of hacking_linux(day1)
- 2016总结---记录不敢平庸的我们
- 移动手机APP开发、一个完整的APP是如何从零开始做出来的?
- 结构体的自引用
- 【NOIP2014模拟11.2A组】国色天香 (Standard IO)
- Html标签
- BigDecimal类的练习使用
- 修改npm包管理器的registry为淘宝镜像(npm.taobao.org)