体会html
catalina.out catalina.logjava
是tomcat的标准输出(stdout)和标准出错(stderr)程序员
cataliana.{yyyy-MM-dd}.log和localhost.{yyyy-MM-dd}.logweb
是经过logging.properties配置的tomcat本身运行的一些日志, catalina.log 是tomcat本身运行的一些日志apache
localhost.{yyyy-MM-dd}.logtomcat
主要是应用初始化(listener, filter, servlet)未处理的异常最后被tomcat捕获而输出的日志 日志是程序员居家旅行必备,哦不对,是定位问题,修复bug,甚至是验证应用是否正常的必备利器。甚至不少时候,咱们作一次部署仅仅是为了加一行log。虽然如今有各类各样的问题诊断工具,可是在定位线上问题时,咱们不少时候仍是但愿有打印良好的log。 打印良好的log很重要,可是知道咱们须要的log在哪里也很重要。由于各类各样的缘由,咱们常常会将log打到不一样的文件中,这样就致使了出问题找几个日志文件的状况。 这不,默认状况下tomcat就会生成几个日志文件:catalina.out, catalina.{yyyy-MM-dd}.log, localhost.{yyyy-MM-dd}.log。(嗯,这里说的是默认状况下,这些都是能够配置修改的)。 这几个不一样的日志文件里的内容也不尽相同,查问题也要看不一样的日志文件,若是没找到文件,甚至都没法了解真正的问题是什么。app
咱们先来看看这几个日志都是怎么产生的,而后来了解一下什么样子的东西会出如今哪一个日志文件。框架
catalina.out catalina.out实际上是tomcat的标准输出(stdout)和标准出错(stderr),这是在tomcat的启动脚本里指定的,若是没有修改的话stdout和stderr会重定向到这里。因此咱们在应用里使用System.out打印的东西都会到这里来。运维
另外,若是咱们在应用里使用其余的日志框架,配置了向Console输出的,则也会在这里出现。好比以logback为例,若是配置ch.qos.logback.core.ConsoleAppender则会输出到catalina.out里。eclipse
cataliana.{yyyy-MM-dd}.log和localhost.{yyyy-MM-dd}.log 这两个日志都是经过logging.properties配置的(默认状况下,启动脚本里指定了java.util.logging.config.file和java.util.logging.manager两个变量)。
一个典型的logging.properties可能以下所示:
handlers = 1catalina.org.apache.juli.FileHandler, 2localhost.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler
.handlers = 1catalina.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler
1catalina.org.apache.juli.FileHandler.level = INFO
1catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
1catalina.org.apache.juli.FileHandler.prefix = catalina.
2localhost.org.apache.juli.FileHandler.level = FINE
2localhost.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
2localhost.org.apache.juli.FileHandler.prefix = localhost.
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers = 2localhost.org.apache.juli.FileHandler
这个文件大体的意思是,root输出到catalina和console。
而这里的catalina按照配置对应的是catalina.{yyyy-MM-dd}.log,这里的console最终会输出到catalina.out。
这就是咱们看到catalina.{yyyy-MM-dd}.log和catalina.out的日志不少都是同样的缘由。
配置文件中还有一个localhost,全部logname或parent logname为org.apache.catalina.core.ContainerBase.[Catalina].[localhost]的都会输出到localhost.{yyyy-MM-dd}.log文件。
而这个logname又表明着什么呢?在tomcat中有一个server.xml的配置文件,其中有这么一个片断:
咱们能够这么简单的理解: 一个Tomcat进程对应着一个Engine,一个Engine下能够有多个Host(Virtual Host),一个Host里能够有多个Context,好比咱们经常将应用部署在ROOT下仍是webapps里其余目录,这个就是Context。 这其中Engine对应着tomcat里的StandardEngine类,Host对应着StandardHost类,而Context对应着StandardContext。这几个类都是从ContainerBase派生。
这些类里打的一些跟应用代码相关的日志都是使用ContainerBase里的getLogger,而这个这个logger的logger name就是: org.apache.catalina.core.ContainerBase.[current container name].[current container name]... 而咱们一个webapp里listener, filter, servlet的初始化就是在StandardContext里进行的,好比ROOT里有一个listener初始化出异常了,打印日志则logger name是org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/]。这其中Catalina和localhost是上面xml片断里的Engine和Host的name,而[/]是ROOT对应的StandardContext的name。因此listener, filter, servlet初始化时的日志是须要看localhost.{yyyy-MM-dd}.log这个日志的。
好比如今咱们使用Spring,Spring的初始化咱们每每是使用Spring提供的一个listener进行的,而若是Spring初始化时由于某个bean初始化失败,致使整个应用没有启动,这个时候的异常日志是输出到localhost中的,而不是cataina.out中。因此有的时候咱们应用没法启动了,而后找catalina.out日志,但最后也没有定位根本缘由是什么,就是由于咱们找的日志不对。
但有的时候catalina.out里也有咱们想要的日志,那是由于咱们的应用或使用的一些组件本身捕获了异常,而后将其打印了,这个时候若是刚好这些日志被咱们配置成输出到console,则这些日志也会在catalina.out里出现了。
总结
那么总结起来,catalina.out即标准输出和标准出错,全部输出到这两个位置的都会进入catalina.out,这里包含tomcat运行本身输出的日志以及应用里向console输出的日志。
catalina.{yyyy-MM-dd}.log是tomcat本身运行的一些日志,这些日志还会输出到catalina.out,可是应用向console输出的日志不会输出到catalina.{yyyy-MM-dd}.log。
localhost.{yyyy-MM-dd}.log主要是应用初始化(listener, filter, servlet)未处理的异常最后被tomcat捕获而输出的日志,而这些未处理异常最终会致使应用没法启动。
最后想一想,这里分几个日志文件其实不利于问题查找,为啥不干脆都输出到catalina.out里呢?
我想tomcat做为通用容器自己,可能考虑到Engine下有多个Host,每一个Host的日志仍是要输出到不一样的文件。而实际中咱们每每是单容器,单Host,甚至是只有一个ROOT的Context。
因此对于这种状况,我以为是能够将全部日志都输出到catalina.out方便查问题,特别是那些还不知道初始化失败应该去看localhost日志的同窗。
嗯,能够和运维商量一下。
一、Tomcat自带日志功能,即时你的项目中有log4j也不会影响到Tomcat本身记录日志。
二、你的项目中的log4j中的日志指定打印到什么地方(控制台或者文件),便会打印到什么地方,和Tomat日志无关。
——若是你项目中的log4j指定打印到控制台,而且你开启的tomcat有控制台,那么这个时候你能够在控制台观察到日志。
——若是你用log4j来处理了Tomcat的日志(具体须要你本身配置tomcat的配置文件),那么Tomcat便会使用log4j来打印,可是这和你项目中的log4j仍然不是同一个log4j。
三、关于异常日志的打印
若是你在你的项目中处理了某个异常:
try { int i = 1/0; }catch(Exception e) { e.printStackTrace(); }
A、那么这个异常信息会打印到你的控制台。你说你没有开控制台,是用服务的形式跑的?那么这个异常的信息你就看不见了。
B、你在你的项目中直接throw的,而且没有任何地方处理这个异常,那么最后这个异常会被抛给你的容器——Tomcat,Tomcat这时会在localhost.日期.log文件中记录这个异常。
C、你使用的是log4j:
LogFactory.getLog(Logger.class).error("Thread:"+i+"-print:"+j+"-CurrentThread:"+Thread.currentThread());
那么你应该去看看你的log4j配置文件中,看看里面写的要把这条错误信息打印在哪。
——若是是打印到控制台,那么就去控制台找。若是没有控制台,那么这个错误信息也就丢了。
——若是是写入某个文件,那固然就是在你的文件中了。
四、控制台
Tomcat默认也会往控制台输出日志,这部分日志和其catalina.日期.log文件中记录的是一致的。
程序中的syso、e.printStackTrace(),以及log4j若是配置的往控制台输出日志,那么他们所有都会出如今控制台上,
别看你eclipse里的控制台上有那么多日志,你要搞清楚他们不是同一个日志记录器写的。
禁用 catalina 日志的输出:
1catalina.org.apache.juli.FileHandler.level = OFF
tomcat参考文档 http://wiki.jikexueyuan.com/project/tomcat/logging.html