设为首页 收藏本站
查看: 669|回复: 0

[经验分享] tomcat中的几种log配置

[复制链接]

尚未签到

发表于 2018-12-1 14:24:29 | 显示全部楼层 |阅读模式
  日志是程序员居家旅行必备,哦不对,是定位问题,修复bug,甚至是验证应用是否正常的必备利器。甚至很多时候,我们做一次部署仅仅是为了加一行log。虽然现在有各种各样的问题诊断工具,但是在定位线上问题时,我们很多时候还是希望有打印良好的log。
  打印良好的log很重要,但是知道我们需要的log在哪里也很重要。因为各种各样的原因,我们经常会将log打到不同的文件中,这样就导致了出问题找几个日志文件的情况。
  这不,默认情况下tomcat就会生成几个日志文件:catalina.out,  catalina.{yyyy-MM-dd}.log, localhost.{yyyy-MM-dd}.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            # 这里推荐改为 OFF,关闭这个日志记录。
  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日志的同学。嗯,可以和运维商量一下。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-642029-1-1.html 上篇帖子: Tomcat的安装与配置 下篇帖子: tomcat 7配置ssl教程
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表