How tomcat works (7)日志记录器

总体概述

顾名思义,这一章将的是tomcat的日志记录器组件,比较简单,tomcat提供了几种类型不同的日志记录器,但是所有的日志记录器都需要实现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(); //与container绑定
public void setContainer(Container container); public String getInfo(); public int getVerbosity(); //设置日志级别
public void setVerbosity(int verbosity); public void addPropertyChangeListener(PropertyChangeListener listener); //重载了log方法,不同的logger实现实现了不同的log方法
public void log(String message); public void log(Exception exception, String msg); public void log(String message, Throwable throwable); //这两个log方法都接收一个verbosity参数,如果该参数的级别数字比该日志记录器的级别数字小,才会记录
//该日志,好比说DEBUG级别的日志记录器可以记录所有级别的日志
public void log(String message, int verbosity); public void log(String message, Throwable throwable, int verbosity); public void removePropertyChangeListener(PropertyChangeListener listener); }

tomcat提供了三种具体实现,FileLogger、SystemErrLogger、SystemOutLogger,这三者与Logger的UML图如下:

LoggerBase为抽象类,它实现了除了log(String msg)之外的所有方法,而具体的实现类则根据自己的特点实现了不同的log(String msg)方法,此外LoggerBase的默认日志级别是ERROR

protected int verbosity = ERROR;

可以调用setVerbosity(int verbosity)来设置

下面来看,三个不同的log方法的实现

SystemOutLogger类

public void log(String msg) {

        System.out.println(msg);

    }

SystemErrLogger类

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());
//ts.toString()返回的日期格式如下:yyyy-mm-dd hh:mm:ss.fffffffff
//fffffffff表示纳秒,substring(0,19)去除掉后面纳秒数
String tsString = ts.toString().substring(0, 19);
//以天为单位
String tsDate = tsString.substring(0, 10); // If the date has changed, switch log files
//如果day发生了变化,换一个文件重新记录
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);
}
} } private void close() { if (writer == null)
return;
writer.flush();
writer.close();
writer = null;
date = ""; } 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;
} }

应用程序

直接看看Bootstrap即可

// ------ add logger --------
System.setProperty("catalina.base", "D:\\tomcat\\HowTomcatWorks");
FileLogger logger = new FileLogger();
logger.setPrefix("FileLog_");
logger.setSuffix(".txt");
logger.setTimestamp(true);
logger.setDirectory("webroot");
context.setLogger(logger);

How tomcat works(深入剖析tomcat)(7) Logger的更多相关文章

  1. How Tomcat works — 四、tomcat启动(3)

    上一节说到StandardService负责启动其子组件:container和connector,不过注意,是有先后顺序的,先启动container,再启动connector,这一节先来看看conta ...

  2. How Tomcat works — 二、tomcat启动(1)

    主要介绍tomcat启动涉及到的一些接口和类. 目录 概述 tomcat包含的组件 server和service Lifecycle Container Connector 总结 概述 tomcat作 ...

  3. How Tomcat works — 七、tomcat发布webapp

    目录 什么叫发布 webapp发布方式 reload 总结 什么叫发布 发布就是让tomcat知道我们的程序在哪里,并根据我们的配置创建Context,进行初始化.启动,如下: 程序所在的位置 创建C ...

  4. How Tomcat works — 八、tomcat中的session管理

    在使用shiro的session的时候感觉对于tomcat中session的管理还不是特别清楚,而且session管理作为tomcat中比较重要的一部分还是很有必要学习的. 目录 概述 session ...

  5. How Tomcat works — 六、tomcat处理请求

    tomcat已经启动完成了,那么是怎么处理请求的呢?怎么到了我们所写的servlet的呢? 目录 Http11ConnectionHandler Http11Processor CoyoteAdapt ...

  6. How Tomcat works — 五、tomcat启动(4)

    前面摆了三节的姿势,现在终于要看到最终tomcat监听端口,接收请求了. 目录 Connector Http11Protocol JIoEndpoint 总结 在前面的初始化都完成之后,进行Conne ...

  7. How Tomcat works — 三、tomcat启动(2)

    在了解了tomcat 的一些基本组件之后,学习启动过程就更容易理解了,因为启动过程就是启动各个组件. 目录 启动顺序 Bootstrap类 Catalina类 StandardServer类和Stan ...

  8. How tomcat works(深入剖析tomcat)servlet容器

    How tomcat works (5)servlet容器阅读笔记 第四章阅读了tomcat默认连接器的实现,当时connector中的使用的容器是自定义的容器,也是非常之简单奥,一个人就干完了所有的 ...

  9. How tomcat works(深入剖析tomcat)生命周期Lifecycle

    How Tomcat Works (6)生命周期Lifecycle 总体概述 这一章讲的是tomcat的组件之一,LifeCycle组件,通过这个组件可以统一管理其他组件,可以达到统一启动/关闭组件的 ...

随机推荐

  1. Java学习的第十八天

    1abstract 综合实例 2.不知道为什么综合实例中的Scanner报错 3.明天解决问题并学习第六章初步知识

  2. python实现类的多态

    多态 关注公众号"轻松学编程"了解更多. 1.多态使用 一种事物的多种体现形式,举例:动物有很多种 注意: 继承是多态的前提 函数重写就是多态的体现形式 演示:重写Animal类 ...

  3. 01_cifsd 高性能网络共享服务

    01_cifsd 高性能网络共享服务 1.简介 cifsd 是一款高性能I/O网络文件共享服务, 通过一种与kernel直接交互的方式实现, github简介:https://github.com/n ...

  4. Serilog源码解析——使用方法

    在上两篇文章(链接1和链接2)中,我们通过一个简易 demo 了解到了一个简单的日志记录类库所需要的功能,即一条日志有哪些数据,以及如何通过一次记录的方式将同一条日志消息记录到多个日志媒介中.在本文中 ...

  5. leetcode128-generate-parentheses

    题目描述 给出n对括号,请编写一个函数来生成所有的由n对括号组成的合法组合. 例如,给出n=3,解集为: "((()))", "(()())", "( ...

  6. BIM与GIS融合的意义——从智慧工地到智慧城市

    随着智慧城市概念的发展,BIM与GIS融合的概念深入人心,通过整合BIM的参数化描述建筑组件性质的特性与GIS宏观的几何空间概念,将 BIM 描述单体建筑物的特性通过 GIS 拓展至三维城市. BIM ...

  7. python类继承中构造子的调用

    python面向对象中的继承关系中,子类对父类的构造方法的调用有两种方法: 父类名.__init__(self,参数) #注意名字是父类 super(本子类名,self)__init__(其他参数) ...

  8. UnixIPC之共享内存

    Unix-IPC之共享内存 一,共享内存的概念 共享内存通信技术是一种最快的可用IPC形式,它是针对其他通信机制运行效率低和设计的新型通信技术(其他的如:信号量,管道,套接字等).这种通信技术往往与其 ...

  9. Docker UnicodeEncodeError: 'ascii' codec can't encode characters in position

    在容器里查询nova服务的时候字符集报错问题留档及处理方法: 1.在容器里执行nova list --all 提示 [root@stack1 region_01]# nova list --all E ...

  10. 1. 线性DP 152. 乘积最大子数组

    152. 乘积最大子数组  https://leetcode-cn.com/problems/maximum-product-subarray/ func maxProduct(nums []int) ...