共计 2631 个字符,预计需要花费 7 分钟才能阅读完成。
1.前言
日志作为系统运行的衍生产物,对于排查系统问题具有相当重要的作用。通常情况下我们通过添加日志配置文件的形式来配置我们的应用系统,但是这种方式缺少了灵活性,一旦配置完毕,应用启动后我们将很难改变日志行为。为了运行时动态调整日志系统,我们该考虑如何编程式的配置日志系统。
2.如何配置
Springboot默认的日志系统为Logback,我们就以Logback为例说明。首先我们需要弄清楚日志配置文件是如何装载的,通过LoggingApplicationListener来引导
日志系统的核心接口LoggingSystem
它有着几个,默认实现,Logback的实现为LogbackLoggingSystem,默认配置文件名如下
这时候可能会有人说了,我写的logback-spring.xml也可以识别啊,这怎么没有?其实那是父类行为
默认的配置文件没有找到时,会尝试约定命名的spring配置文件。配置文件文件读取到后,就开始配置了
读到这里,我们也基本知道通过LoggerContext就可以编程式的配置我们的日志系统了。这里的LoggerContext我们发现是通过
StaticLoggerBinder.getSingleton().getLoggerFactory()
获取的,结合日志的Appender配置,编程式的配置就可以实现了。以配置Logstash的Appender为例
String applicationName = environment.getProperty("spring.application.name");
LogstashTcpSocketAppender logstashTcpSocketAppender = new LogstashTcpSocketAppender();
logstashTcpSocketAppender.setName(LOGSTASH_APPENDER_NAME);
logstashTcpSocketAppender.setContext(loggerContext);
logstashTcpSocketAppender.addDestination("127.0.0.1:4560");
LoggingEventCompositeJsonEncoder loggingEventCompositeJsonEncoder = new LoggingEventCompositeJsonEncoder();
LoggingEventJsonProviders loggingEventJsonProviders = new LoggingEventJsonProviders();
LoggingEventPatternJsonProvider loggingEventPatternJsonProvider = new LoggingEventPatternJsonProvider();
loggingEventPatternJsonProvider.setPattern("{\n" +
" \"logLevel\": \"%level\",\n" +
" \"serviceName\": \"" + applicationName + "\",\n" +
" \"thread\": \"%thread\",\n" +
" \"class\": \"%logger{40}\",\n" +
" \"message\": \"%message\",\n" +
" \"exception\": \"%ex{full}\"\n" +
" }");
loggingEventPatternJsonProvider.setContext(loggerContext);
loggingEventPatternJsonProvider.start();
loggingEventJsonProviders.addProvider(loggingEventPatternJsonProvider);
loggingEventJsonProviders.setContext(loggerContext);
ArgumentsJsonProvider argumentsJsonProvider = new ArgumentsJsonProvider();
argumentsJsonProvider.setContext(loggerContext);
argumentsJsonProvider.start();
loggingEventJsonProviders.addArguments(argumentsJsonProvider);
loggingEventJsonProviders.start();
loggingEventCompositeJsonEncoder.setContext(loggerContext);
loggingEventCompositeJsonEncoder.setProviders(loggingEventJsonProviders);
loggingEventCompositeJsonEncoder.start();
logstashTcpSocketAppender.setEncoder(loggingEventCompositeJsonEncoder);
ThresholdFilter thresholdFilter = new ThresholdFilter();
thresholdFilter.setLevel(Level.ERROR.levelStr);
thresholdFilter.setContext(loggerContext);
thresholdFilter.start();
logstashTcpSocketAppender.addFilter(thresholdFilter);
logstashTcpSocketAppender.start();
loggerContext.getLogger(Logger.ROOT_LOGGER_NAME).addAppender(logstashTcpSocketAppender);
编程式的指定了Appender -> LogstashTcpSocketAppender,同时日志级别设置为ERROR。
3.小结
本文描述了如何编程式的配置Springboot日志系统。编程式的配置结合配置中心,可以运行时动态的调整我们的日志系统,是不是很有意思呢?