SpringBoot默认的日志配置通常来说足够满足要求:日志记录到控制台,也能够配置日志的级别,样式等等。但是其也有些不足:没有了之前logback提供的热更新日志配置的功能。
logback有个非常好用的配置是“scan”,当“scan=true”的时候默认一分钟刷新一次配置。这样可以自动更新系统的日志级别。对于在线系统可以方便修改日志级别获取更加详细的日志,方便定位错误。这样可以保证服务不中断的情况下调整日志级别获取更多日志信息。但是默认的SpringBoot配置中不支持这种选项。
1. 多配置支持
改造方案是使用logback。但是有一点需要注意的是不能够使用通常用的 logback.xml这个文件名来进行配置。因为这个文件名被logback自动扫描,无法做到不同环境不同配置。可以使用logging.config
这个配置项,来进行环境不同的设定:
在application.yaml中,如下配置:
1# Set logback configuration file
2logging:
3 config: classpath:logback-default.xml
2. 配置文件
下面是最后使用的配置文件的一个例子,可以供以后项目参考。
1<?xml version="1.0" encoding="UTF-8"?>
2
3<configuration debug="false" scan="true" >
4 <!-- 定义全局的变量 //-->
5 <property name="cap.logger.level" value="info"/>
6 <property name="cap.logger.level.server" value="debug"/>
7 <property name="cap.logger.outputdir" value="/opt/cap/cap-uid-logs"/>
8
9 <!-- 定义一些converionRule -->
10 <!-- clr 定义色彩 -->
11 <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
12 <!-- wex 异常处理用的 -->
13 <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
14 <!-- wex 异常处理用的 -->
15 <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
16
17 <jmxConfigurator />
18
19 <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
20 <resetJUL>true</resetJUL>
21 </contextListener>
22
23 <!-- Standard syslog/console used by root appenders -->
24 <appender name="syslog" class="ch.qos.logback.classic.net.SyslogAppender">
25 <syslogHost>${PUBLIC_IP}</syslogHost>
26 <facility>LOCAL7</facility>
27 <suffixPattern>[%-5level] [%logger{0}] - %msg%n</suffixPattern>
28 </appender>
29
30 <!-- console输出,有色彩支持的 //-->
31 <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
32 <!--<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">-->
33 <!--<pattern>[%date] [%-5level] [%logger{0}] - %msg%n</pattern>-->
34 <!--</encoder>-->
35 <encoder>
36 <pattern>${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}</pattern>
37 </encoder>
38 </appender>
39
40 <!-- accessFile。使用标准的springboot格式输出,方便阅读。 //-->
41 <appender name="accessFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
42 <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
43 <!-- daily rollover -->
44 <fileNamePattern>${cap.logger.outputdir}/access_%d{yyyy_MM_dd}.log</fileNamePattern>
45 <!-- keep 30 days' worth of history capped at 3GB total size -->
46 <maxHistory>90</maxHistory>
47 </rollingPolicy>
48 <append>true</append>
49 <encoder>
50 <pattern>${FILE_LOG_PATTERN:-%d{yyyy-MM-dd HH:mm:ss.SSS} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}</pattern>
51 </encoder>
52 </appender>
53
54 <!-- 使用JSON格式。方便管理平台分析。Use JSONLayout, UID Admin may analysis it //-->
55 <appender name="errorFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
56 <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
57 <level>ERROR</level>
58 </filter>
59 <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
60 <!-- daily rollover -->
61 <fileNamePattern>${cap.logger.outputdir}/error_%d{yyyy_MM_dd}.log</fileNamePattern>
62 <!-- keep 30 days' worth of history capped at 3GB total size -->
63 <maxHistory>90</maxHistory>
64 </rollingPolicy>
65 <append>true</append>
66 <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
67 <layout class="com.eveus.common.logger.JSONLayout" />
68 </encoder>
69 </appender>
70
71 <!-- 使用JSON格式。方便管理平台分析。Use JSONLayout, UID Admin may analysis it //-->
72 <appender name="kafkaErrorFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
73 <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
74 <level>ERROR</level>
75 </filter>
76 <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
77 <!-- daily rollover -->
78 <fileNamePattern>${cap.logger.outputdir}/kafka_error_%d{yyyy_MM}.log</fileNamePattern>
79 <!-- keep 30 days' worth of history capped at 3GB total size -->
80 <maxHistory>90</maxHistory>
81 </rollingPolicy>
82 <append>true</append>
83 <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
84 <layout class="com.eveus.common.logger.JSONLayout" />
85 </encoder>
86 </appender>
87
88 <!-- third party library logger level -->
89 <logger name="org.springframework" level="${cap.logger.level}" />
90 <logger name="org.apache.cxf" level="${cap.logger.level}" />
91 <logger name="ch.qos.logback" level="${cap.logger.level}" />
92 <logger name="com.notnoop.apns" level="${cap.logger.level}" />
93 <logger name="org.springframework.security" level="${cap.logger.level}"/>
94 <logger name="org.springframework.transaction" level="${cap.logger.level}" />
95 <logger name="org.springframework.jdbc" level="${cap.logger.level}" />
96
97 <!-- UID server logger -->
98 <!-- change level to debug to show sql -->
99 <logger name="com.eveus.cloudauth.dao" level="info"/>
100 <!-- LoggerAspect, Used for API & Service logging -->
101 <logger name="com.eveus.common.logger" level="debug"/>
102 <!-- KafkaConsumer -->
103 <logger name="com.eveus.common.kafka" level="info"/>
104 <!-- AccessLogger -->
105 <logger name="com.eveus.cloudauth.service.impl.jms.AccessLogService" level="info"/>
106
107 <!-- The following needs detail log in development stage -->
108 <logger name="com.eveus.cloudauth.api" level="${cap.logger.level.server}"/>
109 <logger name="com.eveus.cloudauth.service" level="${cap.logger.level.server}"/>
110 <logger name="com.eveus" level="${cap.logger.level.server}" />
111
112 <!-- kafka error logger -->
113 <logger name="com.eveus.common.kafka.KafkaProducer" level="error">
114 <appender-ref ref="kafkaErrorFile"/>
115 </logger>
116
117 <root level="${cap.logger.level}">
118 <appender-ref ref="console"/>
119 <appender-ref ref="accessFile"/>
120 <appender-ref ref="errorFile"/>
121 </root>
122</configuration>
3. 部署方式
SpringBoot项目打包的时候会把配置文件一同打包到jar文件中。 这样修改logback配置文件会比较麻烦。所以在部署的时候会把配置文件解压出来,和jar文件放到同一个目录中。这是利用了SpringBoot配置文件加载的一个特性。官方文档介绍如下:
SpringApplication will load properties from application.properties files in the following locations and add them to the Spring Environment(SpringBoot会按照顺序从下面的路径中加载配置文件):
- A /config subdirectory of the current directory. (当前目录内的/config目录)
- The current directory (当前目录)
- A classpath /config package (classpath中的/config文件夹)
- The classpath root (classpath根目录) The list is ordered by precedence (properties defined in locations higher in the list override those defined in lower locations).
利用这个特性,在部署的时候将配置文件解压出来,放到当前目录下(和jar文件统计目录),这样它的优先级高于在jar包中的配置文件。
最后还需要在启动命令中增加配置,指定logback的配置文件,方法是指定logging.config
这个Java环境变量:
1-Dspring.profiles.active=chanpayprd -Dlogging.config=file:/opt/cap/cap-uid/logback-chanpayprd.xml