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. 微信小程序跳转到微信公众号

    我这里是uniapp里的操作 微信开发者工具配置 微信小程序官网地址:official-account 公众号关注组件. 当用户扫小程序码打开小程序时,开发者可在小程序内配置公众号关注组件,方便用户快 ...

  2. 老师问学生while判断

    老师问学生,这道题你会做了吗?如果学生答"会了(y)",则可以放学.如果学生不会做(n),则老师再讲一遍,再问学生是否会做了...... (1)直到学生会为止,才可以放学. (2) ...

  3. CORS与Django

    前言 在前后端分离项目中,如何解决跨域请求是一个必须要面对的问题.因为前端和后端的数据交互会被浏览器的同源策略所挟持,在很早之前我在博客园发了一篇文章,大概就说了一下如何简单粗暴的解决跨域. 其实那种 ...

  4. jQuery JSONP

    同源策略 浏览器不允许跨域发送Ajax请求,如你在http://127.0.0.1:8000/下发送一个Ajax请求去获取http://127.0.0.1:9000/的资源. 如何解决这个问题?其实j ...

  5. 【Mycat】作为Mycat核心开发者,怎能不来一波Mycat系列文章?

    写在前面 Mycat是基于阿里开源的Cobar产品而研发,Cobar的稳定性.可靠性.优秀的架构和性能以及众多成熟的使用案例使得Mycat一开始就拥有一个很好的起点,站在巨人的肩膀上,我们能看到更远. ...

  6. 小学生学习C++应该具备哪些基础?

    一.电脑操作基础: 应该具备一些必要的电脑相关的知识,如操作系统的相关知识,如何打开.编辑.保存文件.对电脑的能力有一些基本的认识,以及会使用鼠标,键盘熟练输入. 磨刀不误砍柴工,至少要做到能快速找到 ...

  7. Boost.Accumulators累加器的简单使用

    Boost.Accumulators是一个累加器,实现的功能很简单,就是对一组数据进行操作,然后可以得到一些特征数据. 由于累加器默认不对数据进行储存操作,所以不能把它作为一个简单的容器使用. 简单使 ...

  8. Pandas_数据清洗与整理_全

    # 数据清洗与整(全) # 1) 常见的数据清洗方法 # 2) 数据合并:多源数据的合并和连接 # 3) 数据重塑:针对层次化索引,学会 stack和 unstack # 4) 字符串处理:学会 Da ...

  9. 浅析TCP协议---转载

    https://cloud.tencent.com/developer/article/1150971 前言 说到TCP协议,相信大家都比较熟悉了,对于TCP协议总能说个一二三来,但是TCP协议又是一 ...

  10. AHB SRAM控制器设计