微信号:tomcat0000

介绍:由从事应用服务器核心研发的工程师维护.文章深入Tomcat源码,分析应用服务器的实现细节,工作原理.以及与之相关的技术,使用技巧,工作实战等.起于Tomcat,但不止于此.同时会分享JVM、并发等,内容多为原创...

Tomcat的Logging(1)

2016-01-23 21:43 chainhou


启动Tomcat后,总能看着Console里输出的内容哗哗的闪过,一行行...

有些时候,他们又如同流星,在你打开Console的一瞬间,消失了...



这些Log是怎么被定义的,从哪里来,又到了哪里?坐在电脑前,我不禁陷入深深的思考...


首先,注意到的现象是:


  • 我们在应用内的System.out/System.err这些输出,也都出现在了Console中

  • 同时Tomcat的Console中的输出,在日志文件中也有一份一样的内容


这个是如何做到的呢?


在说这个之前,需要先了解下JDK提供的Log实现,而Tomcat是在此基础之上做的改动。


JDK的实现


我们在Java类中如果要直接使用Log,一般除System.out、System.err之外,都会这样使用:

private Logger logger = Logger.getLogger("log");
logger.info("test");


这一过程,不依赖任何第三方的JAR,是基于JDK的实现。因此,整个Log都输出到了Console中。而对比Tomcat的输出,我们的内容并没有输出到文件中。

这是由于JDK的内部,默认提供了关于Log的配置文件,文件位于


JAVA_HOME/jre/lib/logging.properties





我们看到,最上面就声明了关于Log的处理类handler --- ConsoleHandler,用于输出到命令行中。


为了支持同时输出到文件中,我们可以手动在handlers后面增加关于文件的处理:

java.util.logging.FileHandler


增加这一配置后,默认关于文件格式的配置也开始生效:



windows系统下,会生成如下文件


C:\Users\用户名\java1.log


文件名中的1是配置中%u 生成的一个变化的数字。

文件生成的格式根据formatter指定,默认是XML格式。


Tomcat实现


Tomcat内部的日志实现,是使用JULI,是apache commons logging改名后的一个项目。

Tomcat中为了增加自定义的Log配置,同时不影响其它使用JDK中的Log的应用,所以指定了自定义的logger配置文件,这一过程中通过是启动脚本 

catalina.bat中增加参数的实现的,参数主要有如下两个:


  • LOGGING_CONFIG=-Djava.util.logging.config.file="%CATALINA_BASE%\conf\logging.properties"


  • LOGGING_MANAGER=-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager



即启动参数中包含两个-D参数 java.util.logging.config.file,java.util.logging.manager。


而Tomcat自定义的log配置文件中,

我们看到,Tomcat中默认就支持文件和Console两种Log的输出。


同时handler的类名中包含一些1、2这些,这在JDK的配置文件中是不合法的,而Tomcat使用自定义的classLoader,来解析这种定义的prefix,增加prefix是为了一个handler的class可以生成多个实例。



Tomcat内log文件的命名,是根据配置文件中的逻辑,前缀是catalina,后面则是由FileHandler的逻辑控制,代码如下:


// Open the current log file
writerLock.writeLock().lock();
File pathname = new File(dir.getAbsoluteFile(), prefix
           
+ (rotatable ? date : "") + suffix)
;
File parent = pathname.getParentFile();


所以,整个log文件在自动轮转时,最终是catalina+日期.log,不轮转则一直是

catalina.log。


而上面提到的Console和日志中,同时都记录了System.out/System.err的信息,这个,是通过将out、err的输出流重定向到日志文件中实现的。


下一篇文章,将会分析整个Logger的内部结构,以及执行逻辑等,欢迎关注。


扫描二维码,关注我!QQ群:96437267



 
Tomcat那些事儿 更多文章 谁是Tomcat? 干嘛的? Tomcat 与Apache/Nginx有啥区别? 透过Tomcat配置认识其内部组件 如何加入Tomcat邮件组和开发者对话? 你可能不知道的几个java小工具
猜您喜欢 百度网盘破解版 VIP群福利:Git使用教程(视频+PPT) 在Xcode7 Beta 6中如何使用 try? 函数 互联网系统可靠性基础:正确的异常处理 Android 开发者需要知道的8个项目管理技巧