Tomcat主要由connector连接器和容器组成 ,有四大容器(engine 、host、context、wrapper)。
1,Engine 引擎, 启动一个tomcat服务,也就是启动一个引擎
2,host 虚拟主机, 一个Engine启动,下面项目都会启动,localhost:8080/work1,work2
3,context 上下文, 一个项目对应一个上下文,通过map映射到不同的servlet。
4,wrapper 包装器, 一个wrapper对应一个servlet。
1, catalina.out即标准输出和标准出错,所有输出到这两个位置的都会进入catalina.out,这里包含tomcat运行自己输出的日志以及应用里向console输出的日志。(向控制台输出的日志,全部都打印到catalina.out里面了)
2, localhost.{yyyy-MM-dd}.log主要是应用初始化(listener, filter, servlet)未处理的异常最后被tomcat捕获而输出的日志,而这些未处理异常最终会导致应用无法启动。(启动失败的日志)
不同的日志文件里的内容也不尽相同,查问题也要看不同的日志文件,如果没找到文件,甚至都无法了解真正的问题是什么。
1, catalina.log 是tomcat自己运行的一些日志。catalina.out其实是tomcat的标准输出(stdout)和标准出错(stderr)
2, localhost.{yyyy-MM-dd}.log主要是应用初始化(listener, filter, servlet)未处理的异常最后被tomcat捕获而输出的日志.(应用初始化,Tomcat启动失败,日志可能在这里)
在tomcat中有一个server.xml的配置文件,其中有这么一个片段:
<Engine name="Catalina" defaultHost="localhost">
<Host name="localhost" appBase="webapps"unpackWARs="false" autoDeploy="false">
</Host>
</Engine>
Tomcat作为通用容器本身,可能考虑到Engine下有多个Host,每个Host的日志还是要输出到不同的文件。而实际中我们往往是单容器,单Host,甚至是只有一个ROOT的Context。
一个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里出现了。