Tomcat源码分析-AccessLogValve类

时间:2022-11-01 00:03:59

类概况

Tomcat的server.xml中,Host节点的子元素名称是Valve,用来定义一系列的处理器,AccessLogValve就是用来记录容器访问请求的日志处理类。Valve,本意是阀门的意思,AccessLogValve是处理生成访问日志的,梳理它的类图如下:

Tomcat源码分析-AccessLogValve类
它的所有的成员变量大多都跟日志文件写入操作有关。

使用方法

tomcate的默认配置为:

 <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t &quot;%r&quot; %s %b" prefix="localhost_access_log." suffix=".txt"/>

xml节点可以添加任意该类的属性,而且它的所有属性都是有默认值的,例如renameOnRotate是false,即每天产生的日志文件都是以日期为后缀的。
renameOnRotate为true的情况下,当天的日志文件是没有日期后缀的,就是localhost_access_log.txt,每天日期切换时,当天文件重命名为前一天日期后缀,同时新生成当天文件。

主要流程

这个类是LifecycleMBeanBase的子类,所以它是随着容器一起启动的,它的startInternal承担着创建日志文件的责任,它的log操作是记录请求日志的,同时先执行rotate操作,判断是否需要生成新日志文件。主要方法有open,close,rotate和close。
open和close流程图如下:

Tomcat源码分析-AccessLogValve类

rotate和close流程图如下:

Tomcat源码分析-AccessLogValve类

启示录

主要就是根据当前日期和记录的dateStamp进行比对,如果日期发生变化,就生成新的日志文件。这个类的renameOnRotate属性决定了日志文件的存在形式是单一的日期后缀的日志呢,还是历史日志以日期结尾,当前日志没有日期后缀。
而renameOnRotate属性为true的使用方式,它的表现形式跟log4j的org.apache.log4j.DailyRollingFileAppender类的日志处理方式一样,即当前和历史日志文件名的格式不一样。当然,这是我观察tomcat日志时发现的,推断DailyRollingFileAppender的实现方式应该跟这个类差不多,哪天再去验证一下。