tomcat启动logback日志报错ERROR in ch.qos.logback.classic.PatternLayout("null") - Empty or null pattern
事件背景:
公司的线上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!!!
问题到此结束。有疑问欢迎指出。