catalina.out 和 catalina.log 的区别和用途
catalina.out
catalina.out其实是tomcat的标准输出(stdout)和标准出错(stderr),这是在tomcat的启动脚本里指定的,如果没有修改的话stdout和stderr会重定向到这里。所以我们在应用里使用System.out打印的东西都会到这里来。另外,如果我们在应用里使用其他的日志框架,配置了向Console输出的,则也会在这里出现。比如以logback为例,如果配置ch.qos.logback.core.ConsoleAppender则会输出到catalina.out里。
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的配置文件,其中有这么一个片段:
<Engine name="Catalina" defaultHost="localhost">
<Host name="localhost" appBase="webapps"
unpackWARs="false" autoDeploy="false">
</Host>
</Engine>
我们可以这么简单的理解: 一个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。
一般是用log4j按照业务划分,对一些比较重要的业务会单独打到一个文件,方便容易定位问题,,其他的默认会打到catalina。
最新文章
- 备忘-Sql server Timeout expired 超时时间已到. 达到了最大池大小 错误及Max Pool Size设置
- DATAGUARD 添加修改REDOLOG大小
- 基于ArcEngine与C#的鹰眼地图实现
- JAVA-3-水仙花
- Oracle-3 - :超级适合初学者的入门级笔记--用户权限,set运算符,高级子查询
- zookeeper web ui--&;gt;node-zk-browser安装
- Bootstrap3 代码-用户输入
- iOS下WebRTC音视频通话(一)
- [Swift]LeetCode492. 构造矩形 | Construct the Rectangle
- Liunx 网络神器之抓包 --tcpdump
- 转: 解压Assets.car (iOS加密资源)
- 平板电脑安装Ubuntu教程
- Python 模块 和 包
- 20155318 《网络攻防》 Exp7 网络欺诈防范
- hadoop Mahout中相似度计算方法介绍(转)
- 【CF618G】Combining Slimes 概率+矩阵乘法
- 使用UTL_SMTP发送中文邮件及使用UTL_TCP从附件服务器获取中文附件
- okhttp 简单用法
- Alpha7
- maven Web项目中POM的配置信息
热门文章
- ecshop微信接口基础认识
- C语言速度优化之指针赋值与if推断
- GraphX 图数据建模和存储
- 【CS Round #46 (Div. 1.5) A】Letters Deque
- POJ 1166	The Clocks 高斯消元 + exgcd(纯属瞎搞)
- (转)看懂类图——UML类图基础
- 1.6 Python基础知识 - for循环
- 软件——keil的查找,错误,不能跳转到相应的行
- report_timing_requirement
- 8.1 Android灯光系统_总体框架