墨菲定律:当你觉得一个地方可能有bug,那么这个地方就会有bug----顺带了解下Tomcat那少有人注意的localhost.log

一、问题概述

题目有点长,但应该值得后端java们了解下有点小坑的localhost.log,让我长话短说。

博主是搞java后端的。后台是很简单的spring mvc + spring框架。

今天测试一个Controller层的接口,但是断点一直进不来。

我做的改动也不大,新增了mqMsgFactoryUtils这个spring 托管的bean,(代码是接手别人的,所以看着原来的部分有点臃肿,就提炼了mqMsgFactoryUtils公共类

,mqMsgFactoryUtils需要依赖bean,就把自己也搞成bean了)。

如下:

断点进不来怎么办,作为一个工作了几年的老司机,思路还是清晰的,直接在filter打断点,发现可以进来。

然后在aop层打断点,aop层有个切controller层方法的@before方法,主要是一些额外的参数校验。

在aop层的断点里,代码走到如下位置,return了:

因为这个类也是刚被我重构的,我一想,难道是用了return后,像spring的拦截器一样,直接把request返回了吗?

于是我把针对这个aop类的修改回退了,结果发现问题还是存在。

这就神了,filter正常,对aop的修改也回退了,然而controller还是进不去。

二、问题原因

经过上面一番折腾了,午睡是没了,很困,暂时没什么思路。然后又发起了一次request,发现问题还是那样。

但是,这次,我点开了下面的日志:(图片小的话,可以在新的tab打开就清晰了)

哈?这里还有个日志?一看还真就和该问题有关系。

至此,真相大白。

之前刚接手这份代码时,我就很奇怪为什么很多controller头上要搞个这:

当时感觉新接手代码,觉得“一切都是有因有果”,可能是之前的哥们觉得这个controller类有可能有并发问题,线程同步问题啥的。

加就加吧,我又不动它。虽然感觉有点和以前不一样,但应该没啥大问题。无非是controller不是单例罢了。

多创建几个没什么大不了。

以上就是我之前的心态。直到这次遇到这个问题。

有些同学估计没懂,我这里解释下,当controller加了prototype后,就不会在应用启动时就将该controller 单例bean创建好,而是等到需要的时候再去创建。

什么时候是需要的时候呢,就是请求进来,经spring mvc的handlerMappingAdapter分析,需要路由到该controller时,发现该bean的bean definition的scope为prototype,

就会去创建该controller。

创建的时候,就该注入各service了。但是恰好,这个service的包没在扫描范围内(我单独加了个包,然后我们的配置文件不是配置成只扫描base package的,是扫描一系列的具体package)。

那么,没扫描到这个bean,依赖不满足,当然,这个controller就创建失败了。

于是抛异常。

三、异常日志为啥打这儿呢

接着说问题。原因清楚了之后,我又试了一遍:去掉prototype,重启应用,果然,这次启动失败了。

然后,大家估计有疑问了,你有异常,日志打这个localhost.log是什么意思,一般人(比如我),主要关注的是应用的console输出面板。

我就想,这个异常信息,打到这个文件?为什么?这个文件干嘛的?

查了点资料,发现google比百度资料还少点。。。将就看吧。

localhost.{yyyy-MM-dd}.log主要是应用初始化(listener, filter, servlet)未处理的异常最后被tomcat捕获而输出的日志

这么说,这是spring 创建bean失败,直接向tomcat抛出了异常。这下面是堆栈。

02-Nov-2018 16:36:17.882 严重 [http-nio-8080-exec-4] org.apache.catalina.core.ApplicationDispatcher.invoke Servlet.service() for servlet [DispatcherServlet] threw exception
 org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type ‘com.ceiec.service.mqmsg.MqMsgFactoryUtils‘ available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1486)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1104)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585)
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1264)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:325)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
    at org.springframework.web.method.HandlerMethod.createWithResolvedBean(HandlerMethod.java:259)
    at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:323)
    at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:61)
    at org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandler(AbstractHandlerMapping.java:352)
    at org.springframework.web.servlet.DispatcherServlet.getHandler(DispatcherServlet.java:1156)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:936)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:661)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:728)
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:467)
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:392)
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:311)
    at com.ceiec.webservice.filter.WebRequestFilter.doFilterInternal(WebRequestFilter.java:116)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.orm.hibernate4.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:151)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:748)

刚开始,我感觉是不是spring这么处理有点不对,直接将异常抛给tomcat。但是转念一想,启动时,创建bean失败的话,也是会直接抛给tomcat,tomcat抛给用户来处理。

这么一想,可以理解。但是还是感觉:为啥不能在应用里打个日志呢?打个日志,起码一下就找到问题了。

四、关于tomcat的日志

这里只简单介绍下几种日志吧。

catalina.out,这个大家都知道,stdout和stderr都会打到这。(也就是应用的System.out.println,以及tomcat自己的stdout和stderr)

然后是logs目录下的另外几种日志,其中,红色箭头指向的,很重要(当然,以前只觉得localhost_access.log重要,经过今天这一课嘛。。。):

这几个日志在哪配置的呢?

一般在tomcat安装目录下的conf下的logging.properties.

但是,tomcat这么完备的服务器,不可能这么easy。

实际是这样的,(来自于官方文档,链接会在最后给出来):

1、全局模式:

那就是catalina.base下的conf下的logging.properties了,也可以通过启动时通过java.util.logging.config.file来指定。如果该文件不可读或没配置,会使用javahome下的lib下的该文件。

2、在应用中,默认位于WEB-INF/classes/logging.properties.

Tomcat默认的日志框架为juli。基于java.util.logging改的。也可以换成log4j,操作不繁琐,链接如下:

https://tomcat.apache.org/tomcat-8.0-doc/logging.html#Using_Log4j

五、心得体会

这里,让我们再次记得:如果出了bug,记得看看localhost.log。

参考了:

tomcat日志 之 catalina.log & localhost.log

https://tomcat.apache.org/tomcat-8.0-doc/logging.html#

原文地址:https://www.cnblogs.com/grey-wolf/p/9897230.html

时间: 2024-11-05 18:43:42

墨菲定律:当你觉得一个地方可能有bug,那么这个地方就会有bug----顺带了解下Tomcat那少有人注意的localhost.log的相关文章

墨菲定律、二八法则、马太效应、手表定理、“不值得”定律、彼得原理、零和游戏、华盛顿合作规律、酒与污水定律、水桶定律、蘑菇管理原理、钱的问题、奥卡姆剃刀等13条是左右人生的金科玉律

墨菲定律.二八法则.马太效应.手表定理.“不值得”定律.彼得原理.零和游戏.华盛顿合作规律.酒与污水定律.水桶定律.蘑菇管理原理.钱的问题.奥卡姆剃刀等13条是左右人生的金科玉律 一.墨菲定律 1949年,一位名叫墨菲的空军上尉project师,觉得他的某位同事是个倒霉蛋,不经意间开了句玩笑:“假设一件事情有可能被弄糟,让他去做就一定会弄糟.”这句话迅速流传,并扩散到世界各地.在流传扩散的过程中,这句笑话逐渐失去它原有的局限性,演变成各种各样的形式,当中一个最通行的形式是:“假设坏事情有可能

墨菲定律、二八法则、马修、手表定理、“不肖”法、彼得原理、零和游戏、华盛顿合作规律、酒与污水定律、水桶定律、蘑菇管理原则、钱的问题、奥卡姆剃刀等。13文章是关于生活的金科玉律

墨菲定律.二八法则.马太效应.手表定理.“不值得”定律.彼得原理.零和游戏.华盛顿合作规律.酒与污水定律.水桶定律.蘑菇管理原理.钱的问题.奥卡姆剃刀等13条是左右人生的金科玉律 一.墨菲定律 1949年,一位名叫墨菲的空军上尉project师,觉得他的某位同事是个倒霉蛋,不经意间开了句玩笑:“假设一件事情有可能被弄糟,让他去做就一定会弄糟.”这句话迅速流传,并扩散到世界各地.在流传扩散的过程中,这句笑话逐渐失去它原有的局限性.演变成各种各样的形式.当中一个最通行的形式是:“假设坏事情有可能

(转载)墨菲定律、二八法则、马太效应、手表定理、“不值得”定律、彼得原理、零和游戏、华盛顿合作规律、酒与污水定律、水桶定律、蘑菇管理原理、钱的问题、奥卡姆剃刀等13条是左右人生的金科玉律

墨菲定律.二八法则.马太效应.手表定理."不值得"定律.彼得原理.零和游戏.华盛顿合作规律.酒与污水定律.水桶定律.蘑菇管理原理.钱的问题.奥卡姆剃刀等13条是左右人生的金科玉律  一.墨菲定律 1949年,一位名叫墨菲的空军上尉工程师,认为他的某位同事是个倒霉蛋,不经意间开了句玩笑:"如果一件事情有可能被弄糟,让他去做就一定会弄糟." 这句话迅速流传,并扩散到世界各地.在流传扩散的过程中,这句笑话逐渐失去它原有的局限性,演变成各种各样的形式,其中一个最通行的形式是

运营喵必知的66条新媒体墨菲定律

美国工程师墨菲提出过一种心理学效应,叫"墨菲定律": 任何事都没有表面看起来那么简单: 所有的事都会比你预计的时间长: 会出错的事总会出错: 如果你担心某种情况发生,那么它就更有可能发生. 总结之,如果事情有变坏的可能,不管这种可能性有多小,它总会发生. 我来延伸一下,墨菲定律新媒体运营版66条,欢迎对号入座. 1.充分设计构想的创意,都不会被用上. 2.你剽窃的idea,总会被人发现. 3.别试图改文案的稿子,这样不但不会有结果,还会惹文案不高兴. 4.若想受文案欢迎,就积极帮他的坏

“墨菲定律”、“帕金森定理”和“彼德原理”

不能脱俗,周末去看了时下巨火的Imax<星际穿越>,对其中提到的墨菲定律很是熟悉,所以上来复习巩固一下这些有意思的人类结晶,才发现我知道的其实是墨菲定律最著名的变体--菲纳格定律: If anything can go wrong,it will.(会出错的,终将会出错.) 墨菲定律 是一种心理学效应,由”爱德华·墨菲(Edward A. Murphy)工程师提出的,主要内容, 一.任何事都没有表面看起来那么简单: 二.所有的事都会比你预计的时间长: 三.会出错的事总会出错: 四.如果你担心某

成功,侥幸,以小博大?永远离不开的墨菲定律

前些天,在程序界出了一篇爆文,讲述一个程序员因抱侥幸心理接了违法私活,导致在狱中度过456天的事.引起程序界的一阵骚动,但事情过去了也就过去了,很少人从中进行一些反思和总结.最多也就是得出结论:不要干违法的事情. 如果我们深入思考一下那种"侥幸心理"与最终的"锒铛入狱"之间的关系,会发现这就是"墨菲定律"应验的典型. 墨菲定律 墨菲定律(Murphy's Law):"凡是可能出错的事就一定会出错".任何一件事,只要概率大于零,

墨菲定律 by 张鹏程

社会法制 巴纳姆效应:一定戴在谁头上都合适的帽子 彼得原理:找到适合自己的位置 马太效应:多的越多,少的越少 蘑菇定律:先当“小苗”,才能做“大树” 零和游戏定律:社会竞争是生存的唯一手段 囚徒困境:彼此合作,才能利益最大化 社会促进效率:有他人参与,才能更好地激发能力 破窗效应:勿以善小而不为,勿以恶小而为之 传播扭曲效应:保持清醒头脑,谣言止于智者 旁观者效应:责任分散会带来集体冷漠 成功法制 詹森效应:心里素质决定成败 瓦伦达效应:越担心失败就越容易失败 蝴蝶效应:关注细节的变化 木桶定律

墨菲定律:Mac本硬盘坏了

背景 在做熔断降级逻辑的开发,想起了自己的当时对resilience4j做的非常全面的原理和文档的梳理.但是这些数据已经随着Mac硬盘的损坏灰飞烟灭了,不止这个,近几年的一些宝贵积累都随着那个硬盘丢失了,损失惨重.为了防止此类事情的再次发生,觉得有必要自己做一个总结. 根源分析:数据为什么会丢? 以前电脑出现问题主要是软件方面的问题,不会导致数据丢失,没有引起重视.硬件出现问题的几率太小了,不会运气这么差,出现在我的身上吧.最后墨菲定律无情的给我上了一课,可能会发生的一定会发生. 如何解决? 想

墨菲定律&amp;吉德林法则&amp;吉尔伯特定律&amp;沃尔森法则&amp;福克兰定律

一.墨菲定律:越害怕什么,就越会发生什么 二.吉德林法则:把问题清楚地写下来,就已经解决一半了 三.吉尔伯特定律:工作中的最大问题就是没人跟你说该如何去做 四.沃尔森法则:把信息和情报排在第一位,金钱自然就会到来 五.福克兰定律:没必要做决定时,就不要去做决定 原文地址:https://www.cnblogs.com/yaoyuan2/p/10682456.html