日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > > 架構師社區(qū)
[導讀]眾所周知,日志是排查問題的重要手段。關于日志設計,以及怎么根據(jù)從【用戶報障】環(huán)節(jié)開始到秒級定位問題這個我們下一期說(絕非套路),這一期,主要講一下,在沒有異常日志的情況下,如何定位問題。沒有日志當真能排查問題,不會是標題黨吧!

眾所周知,日志是排查問題的重要手段。關于日志設計,以及怎么根據(jù)從【用戶報障】環(huán)節(jié)開始到秒級定位問題這個我們下一期說(絕非套路),這一期,主要講一下,在沒有異常日志的情況下,如何定位問題。沒有日志當真能排查問題,不會是標題黨吧!

無異常日志,就不能排查問題了?

案例一

從最大的同性交友網(wǎng)站中拉取【dubbo-spring-boot-project】的代碼。

無異常日志,就不能排查問題了?

然后把demo跑起來。

本場景是由真實案例改編,因為公司代碼比較復雜也不方便透露,而這個demo在github上大家都能找到,既保證了原汁原味,又能讓大家方便自己體驗排查過程。

好了,我們先設置owner = "feichao",然后看一下控制臺

無異常日志,就不能排查問題了?

無異常日志,就不能排查問題了?

一切正常

那么,當我設置成owner = "feichaozhenshuai!",再啟動

無異常日志,就不能排查問題了?

看似一切都正常,那么,我們到控制臺一看。

無異常日志,就不能排查問題了?

什么情況,怎么就沒owner了?

這是在哪個環(huán)節(jié)出問題了?其實肥朝當初在公司遇到這個問題的時候,場景比這個復雜得多。因為公司的業(yè)務里沒有owner的話,在運行時會出現(xiàn)一些其他異常,涉及公司業(yè)務這里就不展開了,我們言歸正傳,為毛我設置成feichaozhenshuai!就不行了,那我設置成肥朝大帥比電腦會不會爆炸?????

無異常日志,就不能排查問題了?

常見的錯誤做法是,把這個問題截圖往群里一丟,問“你們有沒有遇到過dubbo里面,owner設置不生效的問題?”

無異常日志,就不能排查問題了?

而關注了肥朝公眾號的【真愛粉絲】會這么問,“dubbo里面設置owner卻不生效,你們覺得我要從個角度排查問題?”。一看到這么正確的提問方式,我覺得我不回復你都不好意思。好了,回到主題,這個時候,沒有一點點錯誤日志,但是卻設置不成功,我們有哪些排查手段?

套路一

直接找set方法,看看是不是代碼做了判斷,防止在owner字段里面set類似肥朝真帥這種詞語,避免把帥這件事走漏風聲!。這么一分析似乎挺有道理對吧,那么,如何快速找到這個set方法呢?如圖

無異常日志,就不能排查問題了?

public?void?setOwner(String?owner)?{
????checkMultiName("owner",?owner);
????this.owner?=?owner;
}

我們跟進checkMultiName代碼后發(fā)現(xiàn)

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

從異常描述就很明顯可以看出,原來owner里面是只支持-_等這類特殊符號,!是不支持的,所以設置成不成功,和肥朝帥不帥是沒關系的,和后面的!是有關系的。擦,原來是肥朝想多了,給自己加戲了!?。?/p>

當然肥朝可以告訴你,在后面的版本,修復了這個bug,日志會看得到異常了。這個時候你覺得問題就解決了?

我相信此時很多假粉就會關掉文章,或者說下次肥朝發(fā)了一些他們不喜歡看的文章(你懂的)后,他們就從此取關,但是肥朝想說,且慢動手?。?!

無異常日志,就不能排查問題了?

你想嘛,萬一你以后又遇到類似的問題呢?而且源碼層次很深,就不是簡單的搜個set方法這么簡單,這次給你搜到了set方法并解決問題,簡直是偶然成功。因此,我才多次強調(diào),要持續(xù)關注肥朝,掌握更多套路。這難道是想騙你關注?我這分明是愛你啊!

那么,萬一以后遇到一些吞掉異常,亦或者某些原因導致日志沒打印,我們到底如何排查?

套路二

我們知道idea里面有很多好用的功能,比如肥朝之前的【看源碼,我為什么推薦IDEA?】中就提到了條件斷點,除此之外,還有一個被大家低估的功能,叫做異常斷點。

無異常日志,就不能排查問題了?

肥朝掃了一眼,里面的單詞都是小學的英語單詞,因此怎么使用就不做過多解釋。遇到這個問題時,我們可以這樣設置異常斷點。

無異常日志,就不能排查問題了?

運行起來如下:

無異常日志,就不能排查問題了?

這樣,運行起來的時候,就會迅速定位到異常位置。然后一頓分析,應該很容易找出問題。

是不是有點感覺了?那我們再來一個題型練習一下。

案例二

我們先在看之前肥朝粉絲群的提問

無異常日志,就不能排查問題了?

無異常日志,就不能排查問題了?

無異常日志,就不能排查問題了?


考慮到部分粉絲不在群里,我就簡單描述一下這個粉絲的問題,他代碼有個異常,然后catch打異常日志,但是日志卻沒輸出。

當然你還是不理解也沒關系,我根據(jù)該粉絲的問題,給你搭建了一個最簡模型的demo,模型雖然簡單,但是問題是同樣的,原汁原味,熟悉的配方,熟悉的味道。git地址如下:【https://gitee.com/HelloToby/springboot-run-exception】我們運行起來看一下

@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)?{
????}
}

無異常日志,就不能排查問題了?

你會發(fā)現(xiàn),一運行起來進程就停止,一點日志都沒。絕大部分假粉絲遇到這個情況,都是菊花一緊,一點頭緒都沒,又去群里問”你們有沒有遇到過,Springboot一起來進程就沒了,但是沒有日志的問題?“。正確提問姿勢肥朝已經(jīng)強調(diào)過,這里不多說。那么我們用前面學到的排查套路,再來走一波

無異常日志,就不能排查問題了?

無異常日志,就不能排查問題了?

我們根據(jù)異常棧順藤摸瓜

無異常日志,就不能排查問題了?

我們從代碼中看出兩個關鍵單詞【reportFailure】、【context.close()】,經(jīng)過斷點我們發(fā)現(xiàn),確實是會先打印日志,再關掉容器。但是為啥日志先執(zhí)行,再關掉容器,日志沒輸出,容器就關掉了呢?因為,這個demo中,日志是全異步日志,異步日志還沒執(zhí)行,容器就關了,導致了日志沒有輸出。

該粉絲遇到的問題是類似的,他是單元測試中,代碼中的異步日志還沒輸出,單元測試執(zhí)行完進程就停止了。知道了原理解決起來也很簡單,比如最簡單的,跑單元測試的時候末尾先sleep一下等日志輸出。

在使用Springboot中,其實經(jīng)常會遇到這種,啟動期間出現(xiàn)異常,但是日志是異步的,日志還沒輸出就容器停止,導致沒有異常日志。知道了原理之后,要徹底解決這類問題,可以增加一個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?{
????????????????Thread.sleep(100);
????????????}?catch?(InterruptedException?e)?{
????????????????log.error("application?started?failed",?e);
????????????}
????????}
????}
}

再啰嗦一句,其實日志輸出不了,除了這個異步日志的案例外,還有很多情況的,比如日志沖突之類的,排查套路還很多,因此,建議持續(xù)關注,每一個套路,都想和你分享!

什么是編程思想?

肥朝始終覺得,要想比別人更優(yōu)秀,除了比別人更努力這個必要因素外,思維方式,也是我們必要關注的一個重點。比如在案例二中,很多同學知道了bug之后,就認為自己學到東西了,其實這個想法既正確,也不正確。

正確的地方在于,你知道了這個bug,后面遇到相同的問題,你會猜一下是不是同樣的原因。

不正確的地方在于,你只知道了這個bug出現(xiàn)的某個場景,但是當我們遇到這個問題,應對的排查套路有哪些你并不知道。也就是說,如果這個問題過后,你排查問題的套路并沒有增加,亦或者你沒有能從這個問題上,發(fā)散出自己的想法,繼續(xù)壓榨出更多的價值,本質(zhì)上,你的編程能力,其實并沒有提升的。

然而,你一旦在公司時間長了,也就是我們常說的老油條,對公司的某些坑熟悉,新人遇到問題時,就容易猜對可能是某個坑。但是其實你的套路來來去去就那幾個,本質(zhì)上你的編程能力并沒有提升,卻讓你產(chǎn)生了自己越來越牛逼,這下必須要加薪的錯覺。

一個公司總是有線上報障是有問題的,但是一直不出問題也有問題的。當然很多時候,排查的機會或許輪不到你。這個時候,就會有常見的幾種做法。

1.公司確實項目太簡單,基本沒有什么拿得出手的bug,都是一些低級的漏掉配置的bug。

2.大佬們在排查,反正不是我的問題,那我就看群吹吹水,下班美滋滋。

3.大佬們在排查,等他們有結論了,我就過去問一句是啥問題,然后暗自記下來,下次面試的時候就說是自己排查的,吹一波,美滋滋。

4.大佬們在排查,得知原因后,深入思考,大佬們?yōu)樯稌氲绞沁@個原因,他們是怎么排查的?用了哪些排查工具?排查技巧?然后暗自總結一波,并把自己代入場景,腦補一下自己來排查問題,并把這個bug壓榨出更多價值!(怎么壓榨出更多價值,可以查看肥朝之前的源碼實戰(zhàn)文章,每一篇都有一個環(huán)節(jié)專門講拓展思考的)

你的思維方式,你的行動,往往就決定你成為什么樣的人。

特別推薦一個分享架構+算法的優(yōu)質(zhì)內(nèi)容,還沒關注的小伙伴,可以長按關注一下:

無異常日志,就不能排查問題了?

無異常日志,就不能排查問題了?

無異常日志,就不能排查問題了?

長按訂閱更多精彩▼

無異常日志,就不能排查問題了?

如有收獲,點個在看,誠摯感謝

免責聲明:本文內(nèi)容由21ic獲得授權后發(fā)布,版權歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: 驅動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅動電源的性能直接關系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅動電源設計中至關重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅動性能的關鍵。

關鍵字: 工業(yè)電機 驅動電源

LED 驅動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

關鍵字: 驅動電源 照明系統(tǒng) 散熱

根據(jù)LED驅動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關鍵字: LED 設計 驅動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術之一是電機驅動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅動系統(tǒng)中的關鍵元件,其性能直接影響到電動汽車的動力性能和...

關鍵字: 電動汽車 新能源 驅動電源

在現(xiàn)代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質(zhì)量和效率直接關系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關鍵字: 發(fā)光二極管 驅動電源 LED

LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關鍵字: LED 驅動電源 功率因數(shù)校正

在LED照明技術日益普及的今天,LED驅動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關鍵字: LED照明技術 電磁干擾 驅動電源

開關電源具有效率高的特性,而且開關電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅動電源

關鍵字: LED 驅動電源 開關電源

LED驅動電源是把電源供應轉換為特定的電壓電流以驅動LED發(fā)光的電壓轉換器,通常情況下:LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: LED 隧道燈 驅動電源
關閉