catalina.out其实是tomcat的标准输出(stdout)和标准出错(stderr),这是在tomcat的启动脚本里指定的,如果没有修改的话stdout和stderr会重定向到这里。所以我们在应用里使用system.out打印的东西都会到这里来。另外,如果我们在应用里使用其他的日志框架,配置了向console输出的,则也会在这里出现。比如以logback为例,如果配置ch.qos.logback.core.consoleappender则会输出到catalina.out里。
这两个日志都是通过logging.properties配置的(默认情况下,启动脚本里指定了java.util.logging.config.file和java.util.logging.manager两个变量)。一个典型的logging.propert作文提纲ies可能如下所示:
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梁咏琪被塞了多少蛋糕 = info1catalina.org.汽车维修知识apache.juli.filehandler.directory = ${catalina.ba}/logs1catalina.org.apache.juli.filehandler.prefix = catalina. 2localhost.org.apache.juli.filehandler.lev造价师答案el = fine2localhost.org.apache.juli.filehandler.directory = ${catalina.ba}/logs2localhost.org.apache.juli.filehandler.prefix = localhost. java.util.logging.consolehandler.level = infojava.util.logging.consolehandler.formatter = java.util.logging.simpleformatter org.apache.catalina.core.containerba.[catalina].[localhost].level = infoorg.apache.catalina.core.containerba.[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.containerba.[catalina].[localhost]的都会输出到localhost.{yyyy-mm-dd}.log文件。而这个logname又代表着什么呢?在tomcat中有一个rver.xml的配置文件,其中有这么一个片段:
<engine name="catalina" defaulthost="localhost"> <host name="localhost" appba="webapps" unpackwars="fal" autodeploy="fal"> </host></engine>
我们可以这么简单的理解: 一个tomcat进程对应着一个engine,一个engine下可以有多个host(virtual host),一个host里可以有多个context,比如我们常常将应用部署在root下还是webapps里其他目录,这个就是context。
这其中engine对应着tomcat里的standardengine类,host对应着standardhost类,而context对应着standardcontext。这几个类都是从containerba派生。这些类里打的一些跟应用代码相关的日志都是使用containerba里的getlogger,而这个这个logger的logger name就是: org.apache.catalina.core.containerba.[current container name].[current container name]…
而我们一个webapp里listener, filter, rvlet的初始化就是在standardcontext里进行的,比如root里有一个listener初始化出异常了,打印日志则logger name是org.apache.catalina.core.containerba.[catalina].[localhost].[/]。这其中catalina和localhost是上面xml片段里的engine和host的name,而[/]是root对应的standardcontext的name。所以listener, filter, rvlet初始化时的日志是需要看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, rvlet)未处理的异常最后被tomcat捕获而输出的日志,而这些未处理异常最终会导致应用无法启动。
最后想想,这里分几个日志文件其实不利于问题查找,为啥不干脆都输出到catalina.out里呢?我想tomcat作为通用容器本身,可能考虑到engine下有多个host,每个host的日志还是要输出到不同的文件。而实际中我们往往是单容器,单host,甚至是只有一个root的context。
一般是用log4j按照业务划分,对一些比较重要的业务会单独打到一个文件,方便容易定位问题,,其他的默认会打到catalina。
到此这篇关于tomcat中catalina.out 和 catalina.log的区别和用途详解的文章就介绍到这了,更多相关tomcat catalina.out catalina.log内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!
本文发布于:2023-04-05 01:30:40,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/b289bc4fb3361ffd620773666d0b5364.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:Tomcat中catalina.out 和 catalina.log的区别和用途详解.doc
本文 PDF 下载地址:Tomcat中catalina.out 和 catalina.log的区别和用途详解.pdf
留言与评论(共有 0 条评论) |