logback配置中变量和include的应用
logback配置在实际应用中往往会遇到appender的配置中存在大量的重复内容,但是logback又不像编程语言一样支持继承,采用include和变量结合可以一定程度上解决这个问题。
Example:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
< appender class = "ch.qos.logback.core.rolling.RollingFileAppender" name = WarnLogFile "> < encoder > < charset >UTF-8</ charset > < pattern >%d{dd.MMM.yyyy HH:mm:ss.SSS z}, [%6t], %6p, %C:%M %m%n</ pattern > </ encoder > < file >${LOGS_DIR}/warn.log</ file > < triggeringPolicy class = "ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy" > < maxFileSize >40MB</ maxFileSize > </ triggeringPolicy > < rollingPolicy class = "ch.qos.logback.core.rolling.FixedWindowRollingPolicy" > < fileNamePattern >${LOGS_DIR}/warn%i.log.gz</ fileNamePattern > < minIndex >1</ minIndex > < maxIndex >21</ maxIndex > </ rollingPolicy > </ appender > < appender class = "ch.qos.logback.classic.AsyncAppender" name = "Warn" > < queueSize >2048</ queueSize > < includeCallerData >true</ includeCallerData > < discardingThreshold >0</ discardingThreshold > < appender-ref ref = "WarnLogFile" /> < filter class = "ch.qos.logback.classic.filter.ThresholdFilter" > < level >WARN</ level > </ filter > </ appender > < appender class = "ch.qos.logback.core.rolling.RollingFileAppender" name = "InfoLogFile" > < encoder > < charset >UTF-8</ charset > < pattern >%d{dd.MMM.yyyy HH:mm:ss.SSS z}, [%6t], %6p, %C:%M %m%n</ pattern > </ encoder > < file >${LOGS_DIR}/info.log</ file > < triggeringPolicy class = "ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy" > < maxFileSize >10MB</ maxFileSize > </ triggeringPolicy > < rollingPolicy class = "ch.qos.logback.core.rolling.FixedWindowRollingPolicy" > < fileNamePattern >${LOGS_DIR}/info%i.log.gz</ fileNamePattern > < minIndex >1</ minIndex > < maxIndex >21</ maxIndex > </ rollingPolicy > </ appender > < appender class = "ch.qos.logback.classic.AsyncAppender" name = "info" > < queueSize >2048</ queueSize > < includeCallerData >true</ includeCallerData > < discardingThreshold >0</ discardingThreshold > < appender-ref ref = "infoLogFile" /> < filter class = "ch.qos.logback.classic.filter.ThresholdFilter" > < level >INFO</ level > </ filter > </ appender > < appender class = "ch.qos.logback.core.rolling.RollingFileAppender" name = "DebugLogFile" > < encoder > < charset >UTF-8</ charset > < pattern >%d{dd.MMM.yyyy HH:mm:ss.SSS z}, [%6t], %6p, %C:%M %m%n</ pattern > </ encoder > < file >${LOGS_DIR}/debug.log</ file > < triggeringPolicy class = "ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy" > < maxFileSize >5MB</ maxFileSize > </ triggeringPolicy > < rollingPolicy class = "ch.qos.logback.core.rolling.FixedWindowRollingPolicy" > < fileNamePattern >${LOGS_DIR}/debug%i.log.gz</ fileNamePattern > < minIndex >1</ minIndex > < maxIndex >21</ maxIndex > </ rollingPolicy > </ appender > < appender class = "ch.qos.logback.classic.AsyncAppender" name = "Debug" > < queueSize >2048</ queueSize > < includeCallerData >true</ includeCallerData > < discardingThreshold >0</ discardingThreshold > < appender-ref ref = "DebugLogFile" /> < filter class = "ch.qos.logback.classic.filter.ThresholdFilter" > < level >DEBUG</ level > </ filter > </ appender > |
可以看到以上的三个定义存在大量的重复内容会导致logback文件很大,不容易维护,结合变量和include则可以一定程度上解决这个问题。
首先把配置内容抽取一个公共文件default.xml
把不同的内容用变量定义:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
< included > < appender class = "ch.qos.logback.core.rolling.RollingFileAppender" name = "${FILE_APPENDER}" > < encoder > < charset >UTF-8</ charset > < pattern >%d{dd.MMM.yyyy HH:mm:ss.SSS z}, [%6t], %6p, %C:%M %m%n</ pattern > </ encoder > < file >${LOGS_DIR}/${LOGFILE}.log</ file > < triggeringPolicy class = "ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy" > < maxFileSize >5MB</ maxFileSize > </ triggeringPolicy > < rollingPolicy class = "ch.qos.logback.core.rolling.FixedWindowRollingPolicy" > < fileNamePattern >${LOGS_DIR}/${LOGFILE}%i.log.gz</ fileNamePattern > < minIndex >1</ minIndex > < maxIndex >21</ maxIndex > </ rollingPolicy > </ appender > < appender class = "ch.qos.logback.classic.AsyncAppender" name = "${ASYNC_APPENDER}" > < queueSize >2048</ queueSize > < includeCallerData >true</ includeCallerData > < discardingThreshold >0</ discardingThreshold > < appender-ref ref = "${FILE_APPENDER}" /> < filter class = "ch.qos.logback.classic.filter.ThresholdFilter" > < level >${LOG_LEVEL}</ level > </ filter > </ appender > </ included > |
然后基于公共文件定义各自的配置
warn.xml:
1
2
3
4
5
6
7
8
|
< included > < property scope = "local" name = "LOGFILE" value = "warn" /> < property scope = "local" name = "FILE_APPENDER" value = "WarnLogFile" /> < property scope = "local" name = "ASYNC_APPENDER" value = "warn" /> < property scope = "local" name = "LOG_LEVEL" value = "WARN" /> < include file = "${LOGS_CUSTOM_DIR}/default.xml" /> </ included > |
info.xml:
1
2
3
4
5
6
7
8
|
< included > < property scope = "local" name = "LOGFILE" value = "info" /> < property scope = "local" name = "FILE_APPENDER" value = "InfoLogFile" /> < property scope = "local" name = "ASYNC_APPENDER" value = "info" /> < property scope = "local" name = "LOG_LEVEL" value = "INFO" /> < include file = "${LOGS_CUSTOM_DIR}/default.xml" /> </ included > |
debug.xml:
1
2
3
4
5
6
7
8
|
< included > < property scope = "local" name = "LOGFILE" value = "debug" /> < property scope = "local" name = "FILE_APPENDER" value = "DebugLogFile" /> < property scope = "local" name = "ASYNC_APPENDER" value = "debug" /> < property scope = "local" name = "LOG_LEVEL" value = "DEBUG" /> < include file = "${LOGS_CUSTOM_DIR}/default.xml" /> </ included > |
最后在logback.xml中就可以include上面定义的文件
1
2
3
4
5
6
7
8
9
|
< include file = "${LOGS_CUSTOM_DIR}/warn.xml" /> < include file = "${LOGS_CUSTOM_DIR}/info.xml" /> < include file = "${LOGS_CUSTOM_DIR}/debug.xml" /> < root level = "DEBUG" > ... < appender-ref ref = "warn" /> < appender-ref ref = "info" /> < appender-ref ref = "debug" /> </ root > |
logback.xml导入(include)其他项目配置的logback.xml文件
1、其他项目存在的logback.xml文件需要下面这种形式的配置
下面的这个配置文件的意思是定义了两个appender,这两个appender中名为ASYNC-LOG的appender是将com.xx.cloud.trail.client.async路径下面产生的级别为error的日志进行收集,保存在定义的文件夹下面,另一个appender同理,如果这个logback.xml文件想在其他的项目中被引用那么就需要用在iucluded标签将定义的appender跟logger包围起来,表示这个是可以被导入其他项目的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
<? xml version = "1.0" encoding = "UTF-8" ?> < included > < appender name = "ASYNC_LOG" class = "ch.qos.logback.core.rolling.RollingFileAppender" > < rollingPolicy class = "ch.qos.logback.core.rolling.TimeBasedRollingPolicy" > <!--日志文件输出的文件名--> < FileNamePattern >/var/log/xx/cloud/trail/async/error.log.%d{yyyy-MM-dd}.log</ FileNamePattern > < MaxHistory >30</ MaxHistory > </ rollingPolicy > < encoder class = "ch.qos.logback.core.encoder.LayoutWrappingEncoder" > <!-- 日志输出编码 --> < layout class = "ch.qos.logback.classic.PatternLayout" > <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> < pattern >%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n </ pattern > </ layout > </ encoder > <!--日志文件最大的大小--> < triggeringPolicy class = "ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy" > < MaxFileSize >10MB</ MaxFileSize > </ triggeringPolicy > </ appender > < appender name = "AOP_LOG" class = "ch.qos.logback.core.rolling.RollingFileAppender" > < rollingPolicy class = "ch.qos.logback.core.rolling.TimeBasedRollingPolicy" > <!--日志文件输出的文件名--> < FileNamePattern >/var/log/xx/cloud/trail/aop/error.log.%d{yyyy-MM-dd}.log</ FileNamePattern > < MaxHistory >30</ MaxHistory > </ rollingPolicy > < encoder class = "ch.qos.logback.core.encoder.LayoutWrappingEncoder" > <!-- 日志输出编码 --> < layout class = "ch.qos.logback.classic.PatternLayout" > <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> < pattern >%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n </ pattern > </ layout > </ encoder > <!--日志文件最大的大小--> < triggeringPolicy class = "ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy" > < MaxFileSize >10MB</ MaxFileSize > </ triggeringPolicy > </ appender > <!--需要将日志单独输出的包路径--> < logger name = "com.xx.cloud.trail.client.async" level = "ERROR" additivity = "false" > < appender-ref ref = "ASYNC_LOG" /> </ logger > <!--需要将日志单独输出的包路径--> < logger name = "com.xx.cloud.trail.client.aop" level = "ERROR" additivity = "false" > < appender-ref ref = "AOP_LOG" /> </ logger > </ included > |
2、其他项目的配置
假如1中的配置logback.xml文件的名称为logback-trail.xml,那么需要在其他的项目的logback.xml文件中加入一句
表示导入其他项目的logback文件,这样就能将其他项目中的配置文件进行导入
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
<? xml version = "1.0" encoding = "UTF-8" ?> <!-- scan: 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。 scanPeriod: 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 debug: 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 --> < configuration scan = "true" scanPeriod = "60 seconds" debug = "false" > < include resource = "logback-trail.xml" /> <!--配置日志输出到的路径--> < springProperty scop = "context" name = "logging.path" source = "logging.path" defaultValue = "logging-path-not-find" /> < property name = "log.path" value = "${logging.path}" /> < appender name = "STDOUT" class = "ch.qos.logback.core.ConsoleAppender" > < encoder > < pattern >%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</ pattern > </ encoder > </ appender > < appender name = "TRAIL_LOG" class = "ch.qos.logback.core.rolling.RollingFileAppender" > < rollingPolicy class = "ch.qos.logback.core.rolling.TimeBasedRollingPolicy" > <!--日志文件输出的文件名--> < FileNamePattern >${logging.path}/trail/trail.log.%d{yyyy-MM-dd}.log</ FileNamePattern > < MaxHistory >30</ MaxHistory > </ rollingPolicy > < encoder class = "ch.qos.logback.core.encoder.LayoutWrappingEncoder" > <!-- 日志输出编码 --> < layout class = "ch.qos.logback.classic.PatternLayout" > <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> < pattern >%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n </ pattern > </ layout > </ encoder > <!--日志文件最大的大小--> < triggeringPolicy class = "ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy" > < MaxFileSize >10MB</ MaxFileSize > </ triggeringPolicy > </ appender > <!-- 日志输出级别 --> < root level = "DEBUG" > < appender-ref ref = "STDOUT" /> < appender-ref ref = "TRAIL_LOG" /> </ root > </ configuration > |
以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/SonOfWind0311/article/details/86751159