在spring boot中,只要我们在项目的resource文件夹中,增加了一个叫logback-spring.xml的文件,那么spring boot就会自动识别日志配置,并应用这个文件里的配置,这是由ClasspathLoggingApplicationListener
类做的
appender: 是用来处理系统的日志输出到哪里的东西,比如我可以有2个appender,一个appender用来将日志打印到控制台,一个appender用来将日志打印到我电脑C盘的某个文件中,这就是appender,当然,logback自己已经定义了很多appender
假设我的logback-spring.xml文件内容如下,那么此时启动服务,则不会打印任何内容,控制台一片空白,不知道的还以为服务卡住起不来了呢,其实已经起来了,只是没有打印任何内容,当然,这是因为这个配置文件里没有配置appender的原因,尤其是没有输出到控制台的appender,所以我们在控制台看不到任何内容
<?xml version="1.0" encoding="UTF-8"?>
<configuration></configuration>
开始自定义Appender
步骤1: 因为打印日志就是appender的工作,配置文件中如果没有appender,那么就不会打印日志,所以我们自定义一个appender,需要继承AppenderBase
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.AppenderBase;public class TestAppender extends AppenderBase<ILoggingEvent> {@Overrideprotected void append(ILoggingEvent eventObject) {// 这个eventObject就是日志信息,我们调用println方法将其打印到控制台System.out.println(eventObject);}
}
注意:其中泛型必须为ILoggingEvent,可能是由于这个API过早写的,看名字我们就知道,多说一句,大写I开头的接口,这都是以前从事C++的工作写出来的,比如在RabbitMQ源码中,很多接口都是大写I开头,因为早期C++的开发工具不能一目了然看出是接口还是实现类,而有些Java开发者不明所以,也用这种方式,这是非常不好的行为,话已至此,其实这个地方根本就不需要泛型,直接形参就可以了,如果用我们自定义的泛型(日志事件)是否可行呢?答案是不行的,当我们打印日志的时候,logback拿到ILoggingEvent,然后判断当前这个appender接收的事件是否为ILoggingEvent,如果不是,那么它不会调用append
方法,例如下面的代码就是错误的
public class TestAppender extends AppenderBase<XXXEvent> {// 这个方法不会被调用,因为它的事件类型不是ILoggingEvent@Overrideprotected void append(XXXEvent eventObject) {System.out.println(eventObject);}
}
步骤2: 下面将我们自定义的appender告诉logback,这样它就会用我们的appender打印日志了
<?xml version="1.0" encoding="UTF-8"?>
<configuration><appender name="hehe" class="com.example.demo.TestAppender"></appender><!-- 只打印info级别及以上的日志 --><root level="info"><appender-ref ref="hehe" /></root>
</configuration>
本文就到这里,主要阐述如何自定义appender,比如我们想将日志用flink统一收集起来然后实时分析,那么此时我们就可以自定义一个appender,当然,logback自己实现了很多appender,多数情况下我们是不需要自定义appender的
从业这么久,实际项目开发中,我只用过两次自定义appender
1.统一收集日志到kafka,然后推到flink
2.我们的devops平台日志功能不完善,所以我们统一收集日志,打到了阿里云上