当前位置:首页 > 攻略

【applicationisinterrupted】异常日志,不能解决问题吗?

众所周知,日志是解决问题的重要手段。从日志设计和[用户报告]链接到初级定位问题,下一期将重点讨论在没有异常日志的情况下如何定位问题。(注:日志设计、用户举报、用户举报、用户举报、用户举报、用户举报、用户举报、用户举报、用户举报)没有日志,真的可以调查问题,应该不是标题党吧!

案例1

从最大的同性约会网站上抽取[dubbo-spring-boot-project]代码。

然后运行demo。

这个场景是根据实际事例改编的。因为公司代码复杂,不方便公开,所以这个demo在github上都可以找到,不仅能保证本来的味道,还能让人们自己体验调查过程。

好,我们先设置owner='feichao ',然后再查看控制台

一切正常

那我就owner='feichaozhenshuai!'设置为时,重新启动

好像一切正常,去控制台看看吧。

怎么了,为什么欧文不在?

这是哪部分出问题了?其实胖子当初在公司遇到这个问题的时候,场面比这个复杂得多。公司的业务没有owner,因此在运行时可能会出现其他异常。关于公司业务,这里不展开。我们言归正传,为毛设定了feichaozhenshuai!不行。那我设定成胖子会不会比电脑爆炸?嗯?嗯?

一般错误的方法是把这个问题的截图扔在群里,问“你在杜甫里面遇到过owner设置不起作用的问题吗?”是问。

关注胖子公众号的“真爱粉丝”会这样问。“在Dubo内安装owner没有效果,你认为我应该从什么角度调查问题?”“。一看到这么正确的提问方式,我觉得不回复你都很抱歉。好了,回到主题。此时,没有一点错误日志,但安装没有成功。我们有什么解决问题的手段?(大卫亚设)。

例行程序1

不知道是不是直接找set方法判断代码,在owner字段里阻止set肥真帅的说法,不要泄露帅这件事!这种分析似乎有道理,那么如何快速找到这种set方法呢?绘画

age/2a0f36a7b7c143288b1ddc6ba6ccbc70?from=article.detail&_iz=31825&index=8" width="550" height="309"/>

public void setOwner(String owner) { checkMultiName("owner", owner); = owner; } 复制代码

我们跟进 checkMultiName 代码后发现

protected static void checkProperty(String property, String value, int maxlength, Pattern pattern) { if (value)) { return; } if () > maxlength) { throw new IllegalStateexception("Invalid " + property + "=\"" + value + "\" is longer than " + maxlength); } if (pattern != null) { Matcher matcher = (value); if (!ma()) { throw new IllegalStateException("Invalid " + property + "=\"" + value + "\" contains illegal " + "character, only digit, letter, '-', '_' or '.' is legal."); } } } 复制代码

从异常描述就很明显可以看出,原来 owner 里面是只支持 - 和 _ 等这类特殊符号, ! 是不支持的,所以设置成不成功,和肥朝帅不帅是没关系的,和后面的 ! 是有关系的。擦,原来是肥朝想多了,给自己加戏了!!!

当然肥朝可以告诉你,在后面的版本,修复了这个bug,日志会看得到异常了。这个时候你觉得问题就解决了?

我相信此时很多假粉就会关掉文章,或者说下次肥朝发了一些他们不喜欢看的文章(你懂的)后,他们就从此取关,但是肥朝想说,且慢动手!!!

你想嘛,万一你以后又遇到类似的问题呢?而且源码层次很深,就不是简单的搜个 set 方法这么简单,这次给你搜到了set方法并解决问题,简直是 偶然成功 。因此,我才多次强调,要持续关注肥朝,掌握更多套路。这难道是想骗你关注?我这分明是爱你啊!

那么,万一以后遇到一些 吞掉异常 ,亦或者某些原因导致 日志没打印 ,我们到底如何排查?

套路二

我们知道idea里面有很多好用的功能,比如肥朝之前的【看源码,我为何推荐idea?】中就提到了 条件断点 ,除此之外,还有一个被大家低估的功能,叫做 异常断点 。

肥朝扫了一眼,里面的单词都是小学的英语单词,因此怎么使用就不做过多解释。遇到这个问题时,我们可以这样设置异常断点。

运行起来如下:

这样,运行起来的时候,就会迅速定位到异常位置。然后一顿分析,应该很容易找出问题。

是不是有点感觉了?那我们再来一个题型练习一下。

案例二

我们先在看之前肥朝粉丝群的提问

考虑到部分粉丝不在群里,我就简单描述一下这个粉丝的问题,他代码有个异常,然后catch打异常日志,但是日志却没输出。

当然你还是不理解也没关系,我根据该粉丝的问题,给你搭建了一个最简模型的demo,模型虽然简单,但是问题是同样的,原汁原味,熟悉的配方,熟悉的味道。git地址如下:【 gi…

@Slf4j public class HelloSpringApplicationRunListener implements SpringApplicationRunListener { public HelloSpringApplicationRunListener(SpringApplication application, String[] args) { } @Override public void starting() { } @Override public void environmentPrepared(ConfigurableEnvironment environment) { } @Override public void contextPrepared(ConfigurableApplicationContext context) { throw new RuntimeException("欢迎关注微信公众号【肥朝】"); } @Override public void contextLoaded(ConfigurableApplicationContext context) { } @Override public void finished(ConfigurableApplicationContext context, Throwable exception) { } } 复制代码

你会发现,一运行起来进程就停止,一点日志都没。绝大部分假粉丝遇到这个情况,都是菊花一紧,一点头绪都没,又去群里问”你们有没有遇到过,Springboot一起来进程就没了,但是没有日志的问题?“。正确提问姿势肥朝已经强调过,这里不多说。那么我们用前面学到的排查套路,再来走一波

我们根据异常栈顺藤摸瓜

我们从代码中看出两个关键单词【reportFailure】、【con()】,经过断点我们发现,确实是会先打印日志,再关掉容器。但是为啥日志先执行,再关掉容器,日志没输出,容器就关掉了呢?因为,这个demo中,日志是全异步日志,异步日志还没执行,容器就关了,导致了日志没有输出。

该粉丝遇到的问题是类似的,他是单元测试中,代码中的异步日志还没输出,单元测试执行完进程就停止了。知道了原理解决起来也很简单,比如最简单的,跑单元测试的时候末尾先sleep一下等日志输出。

在使用Springboot中,其实经常会遇到这种,启动期间出现异常,但是日志是异步的,日志还没输出就容器停止,导致没有异常日志。知道了原理之后,要彻底解决这类问题,可以增加一个 SpringApplicationRunListener 。

/** * 负责应用启动时的异常输出 */ @Slf4j public class OutstandingExceptionReporter implements SpringApplicationRunListener { public OutstandingExceptionReporter(SpringApplication application, String[] args) { } @Override public void starting() { } @Override public void environmentPrepared(ConfigurableEnvironment environment) { } @Override public void contextPrepared(ConfigurableApplicationContext context) { } @Override public void contextLoaded(ConfigurableApplicationContext context) { } @Override public void finished(ConfigurableApplicationContext context, Throwable exception) { if (exception != null) { log.error("application started failed",exception); try { T(100); } catch (InterruptedException e) { log.error("application started failed", e); } } } } 复制代码

再啰嗦一句,其实日志输出不了,除了这个异步日志的案例外,还有很多情况的,比如日志冲突之类的,排查套路还很多,因此,建议持续关注,每一个套路,都想和你分享!


转载出自:肥朝

原 文 :

1.《【applicationisinterrupted】异常日志,不能解决问题吗?》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。

2.《【applicationisinterrupted】异常日志,不能解决问题吗?》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。

3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/gl/2506355.html

上一篇

【GRF代表正式辞职】“解散队鬼才”GRF又开始了。战队经理宣布离职,踢了三个人,怀疑解散。

下一篇

【以下选项中哪个是成语马后炮】成语一共四个字吗?不一定!这三个字经常用成语,你都能说吗?

【applicationisinterrupted】高考题目作文一般使用词汇记忆和范文4。

【applicationisinterrupted】高考题目作文一般使用词汇记忆和范文4。

applicationisinterrupted相关介绍,31.主题:人际关系 常用词汇: harmonious和谐的friendly友好的civilized文明的honest真诚的credible诚实的be public-spirited有公德心的be i...

【applicationisinterrupted】服务首次参与

  • 【applicationisinterrupted】服务首次参与
  • 【applicationisinterrupted】服务首次参与
  • 【applicationisinterrupted】服务首次参与