how tomcat works读书笔记 七 日志记录器

时间:2022-09-13 13:51:58

大家可以松一口气了,这个组件比较简单,这一节和前面几节想比,也简单的多。

Logger接口

Tomcat中的日志记录器都必须实现org.apache.catalina.Logger接口。

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

Logger定义了五种日志记录基本,当我们在调用log(String message, int verbosity)方法记录日志的时候,只有传进来的verbosity小于等于系统的默认值才会记录。话说大家知道Integer.MIN_VALUE等于多少吗?大概负的21亿左右吧。setVerbosity与getVerbosity是干什么的还需要我说么?

Tomcat的日志记录器

how tomcat works读书笔记 七 日志记录器

LoggerBase类(抽象类)

它实现了Logger接口中除log(String message)方法外的其余方法;

在类中默认了日志记录级别为

         protected int verbosity = ERROR;

但是我们可以通过setVerbosity(int verbosity)来重新设置记录级别;

看看定义的接受日志级别的两个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类

看名字就知道,信息最后输出到控制台。

SysteErrLogger类

看名字就知道,它是错误输出,信息仍在控制台,不过是红色的。

FileLogger类

看名字就知道,它是吧信息输出的文件里。

不过具体的来说,里面还是有点说头的,慢慢来。

首先FileLogger还实现了Lifecycle接口,因此它可以像其他组件一样被父组件所启动。

在本节中FileLogger的start与stop方法其实只是改变了布尔值started而已,没有做其他的,另一方面,FileLogger的start与stop方法也并没有被调用!

现在我们就看看怎么给文件里写信息。

 

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

File默认是每一天一个新的文件,文件内格式就是日期+具体信息(如果timestamp为true的话);

那close(),open()方法和writer属性又是什么呢?

 

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

    }

先检查给定的目录是否存在,如果不存在新建一个;接着根据前缀,时间,后缀设定文件名;根据文件名填充writer对象。

    private void close() {

        if (writer == null)
            return;
        writer.flush();
        writer.close();
        writer = null;
        date = "";
    }

FileLogger中的date代表的就是当前的时间,当然关闭后为空。

应用程序

Bootstrap类

...
    System.setProperty("catalina.base", System.getProperty("user.dir"));
    FileLogger logger = new FileLogger();
    logger.setPrefix("FileLog_");
    logger.setSuffix(".txt");
    logger.setTimestamp(true);
    logger.setDirectory("webroot");
    context.setLogger(logger);
....

SimpleContext类

public synchronized void start() throws LifecycleException {
    log("starting Context");
    ........
    lifecycle.fireLifecycleEvent(AFTER_START_EVENT, null);
    log("Context started");
  }
private void log(String message) {
    Logger logger = this.getLogger();
    if (logger!=null)
      logger.log(message);
  }

运行后在项目的webroot目录下就可以看到FileLog_2014-10-20.txt文件;

每次运行,在文件中都会多出如下的内容

2014-10-20 14:34:21 HttpConnector Opening server socket on all host IP addresses

2014-10-20 14:34:22 HttpConnector[8080] Starting background thread

2014-10-20 14:34:22 HttpProcessor[8080][0] Starting background thread

2014-10-20 14:34:22 HttpProcessor[8080][1] Starting background thread

2014-10-20 14:34:22 HttpProcessor[8080][2] Starting background thread

2014-10-20 14:34:22 HttpProcessor[8080][3] Starting background thread

2014-10-20 14:34:22 HttpProcessor[8080][4] Starting background thread

2014-10-20 14:34:22 starting Context

2014-10-20 14:34:22 Context started

how tomcat works读书笔记 七 日志记录器的更多相关文章

  1. how tomcat works 读书笔记(二)----------一个简单的servlet容器

    app1 (建议读者在看本章之前,先看how tomcat works 读书笔记(一)----------一个简单的web服务器 http://blog.csdn.net/dlf123321/arti ...

  2. how tomcat works 读书笔记四 tomcat的默认连接器

    事实上在第三章,就已经有了连接器的样子了,只是那仅仅是一个学习工具,在这一章我们会開始分析tomcat4里面的默认连接器. 连接器 Tomcat连接器必须满足下面几个要求 1 实现org.apache ...

  3. how tomcat works 读书笔记(一)----------一个简单的webserver

    http协议 若是两个人能正常的说话交流,那么他们间必然有一套统一的语言规则<在网络上server与client能交流也依赖与一套规则,它就是我们说的http规则(超文本传输协议Hypertex ...

  4. how tomcat works 读书笔记&lpar;一&rpar;----------一个简单的web服务器

    http协议 若是两个人能正常的说话交流,那么他们间必定有一套统一的语言规则<在网络上服务器与客户端能交流也依赖与一套规则,它就是我们说的http规则(超文本传输协议Hypertext tran ...

  5. How Tomcat Works读书笔记三-------连接器

    几个概念 HttpServlet,Servlet Servlet是一个接口,定义了一种网络服务,我们所有的servlet都要实现它(或它的子类) HttpServlet是一个抽象类,它针对的就是htt ...

  6. How Tomcat Works 读书笔记 八 载入器 上

    Java的类载入器 详细资料见 http://blog.csdn.net/dlf123321/article/details/39957175 http://blog.csdn.net/dlf1233 ...

  7. How tomcat works 读书笔记十七 启动tomcat 下

    在上一节中,我们程序的起始位置还是Bootstrap,现在我们通过bat文件来启动这个类. 在分析catalina.bat之前,我们先看看几个简单的我们能用到的dos命令. 基础知识 1 rem 注释 ...

  8. How tomcat works 读书笔记十七 启动tomcat 上

    一路跋山涉水,这是最后一章了. 关于tomcat的启动,有两个类,一个是Catalina类,一个是Bootstrap类. 理论上,两个类可以和到一起,但是为了支持多种运行模式,又把他们分开了. 为了让 ...

  9. How tomcat works 读书笔记十五 Digester库 下

    在这一节里我们说说ContextConfig这个类. 这个类在很早的时候我们就已经使用了(之前那个叫SimpleContextConfig),但是在之前它干的事情都很简单,就是吧context里的co ...

随机推荐

  1. java设计模式之-----桥接模式

    一.概念定义 将抽象部分和实现部分分离,使他们都可以独立的变化.(这句话有点抽象啊..) 在软件系统中,某种类型由于自身逻辑,具有多个维度的变化,如何利用面向对象的技术来使得该类型沿着多方向变化,而又 ...

  2. &lbrack;转&rsqb;深入理解Flash Player重绘

    这个是tencent flash team的一篇文章,但团队的博客已经关闭了,所以就在这里备份下吧~ 后来有人把这篇文章又发布到9ria上了,引发了一些讨论,其中有两位大神发言了,内容在原文下方. 9 ...

  3. zendstudio 10下载汉化

      1.文件和汉化文件 ZendStudio官方下载地址:http://www.geekso.com/component/zendstudio-downloads/ 百度云地址: 10.0.0.msi ...

  4. php中利用HttpClient判断页面状态

    $url = ''; $info = parse_url($url); $httpClient = new HttpClient($info['host']); $httpClient->get ...

  5. c语言实现atoi和itoa函数。

    首先看atoi函数: C语言库函数名: atoi 功 能: 把字符串转换成整型数. 名字来源:ASCII to integer 的缩写. 原型: int atoi(const char *nptr); ...

  6. hdu1978(递推dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1978 分析: 递推DP. dp[][]表示可以到达改点的方法数. 刚开始:外循环扫描所有点dp[x][ ...

  7. &period;net core 项目文件结构浅析

    1:launch.json (配置调试用的) 通过vs code创建的项目,都会有这个文件,是启动调试的配置文件: (vscode默认支持nodejs调试) 要调试调试c#代码  需要安装 C# 插件 ...

  8. Intellij Idea下tomcat设置自动编译

    *eclipse默认tomcat下是自动完成编译:而Intellij Idea默认tomcat下不是自动完成编译,从如下开始设置: 进入"settings",如下图找到" ...

  9. 支付-stripe

    国外三大支付paypal,braintree,stripe,有兴趣可以去了解一下他们的区别. 支付宝和paypal基本只需要发送charge信息请求交给后端做就ok了,那么stripe前端也只需要收集 ...

  10. 解读经典-《C&num;高级编程》第七版-Chapter1-&period;Net体系结构-Page13-20

    01 程序集 程序集是包含编译好的.基于.Net Framework的代码逻辑单元.一般来说,在Visual Studio中的一个项目即一个程序集,而一个项目中包含多种不同的代码文件.程序集分为可执行 ...