事件背景:
公司的線上javaweb項目出了個在高並發請求下自動掛掉的bug,日志是斷開的不顯示任何的異常,找了好久沒找到原因,一點點的分析問題,先把日志打印好,啟動的時候logback自帶日志就報錯了,以前沒怎么關注,因為感覺影響不大,現在看來還是需要排除一切可能的因素,把這些小問題解決下。
解決思路:
首先肯定是查找關鍵字在百度上搜一下看有沒有什么解決方案,查找了一圈都沒有信息。谷歌了一把,在stack overflow上找到這樣一個信息
The default encoder is PatternLayoutEncoder which is a subclass of PatternLayoutEncoderBase. PatternLayoutEncoderBase only supports setting a log pattern such as:
<encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder>
You can use LayoutWrappingEncoder instead
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"> <layout class="com.dces.util.LoggingConsoleLayout" /> </encoder>
原文地址:https://stackoverflow.com/questions/14168684/creating-a-custom-layout-in-logback
大概意思是讓我們用encoder標簽吧,簡單就是這么理解的,我們的logback的配置文件里面的配置一直都是layout標簽的,這個encoder編碼標簽是個什么意思。再百度一下
<!--encoder:將事件轉換為字符串 默認配置為PatternLayoutEncoder類 encoder用於替代Layout,encoder擴展了Layout功能 Layout功能:只負責把事件轉換為字符串,但是不能指定何時將記錄寫入到指定目的地 encoder功能:即負責把事件轉換為字符串,也可以指定何時將記錄寫入到指定目的地 -->
原文logback配置模板詳解:https://www.cnblogs.com/z-x-p/p/11686963.html
直接把layout替換成encoder,先用默認的class,什么都不帶試一下
<!--<layout class="ch.qos.logback.classic.PatternLayout">--> <encoder> <pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread] %logger{32}.%method:%L - %msg%n</pattern> </encoder> <!--</layout>-->
沒有報什么其他的錯,但是PatternLayout("null") - Empty or null pattern這個還存在!!很無語,極度無語!后來根據下面提示的、說的好像layout不能作為組件,在官網找到了說明:http://logback.qos.ch/codes.html#layoutInsteadOfEncoder
官網說明:要換成encoder替換layout,還舉了兩個反例,deprecated就是不推薦使用的意思
看起來好像改的沒什么問題啊,改的肯定沒有錯,再看下這個錯 ERROR in ch.qos.logback.classic.PatternLayout("null") - Empty or null pattern
pattern是空的???,然后在配置文件里面找了好久終於發現了罪魁禍首:
這應該是前人留下來的坑吧,第一眼看去encode,指定UTF8編碼,正常的在正常了,突然想到,前面寫了這么多encoder下面都是要指定pattern的,這
里為空不就剛好null,和錯誤日志對應上了,注釋掉這一行,果不其然沒有錯了,真是一個大寫的WC!!!
問題到此結束。有疑問歡迎指出。