SpringBoot从入门到进阶——学会Logback日志的配置和搭建

内容   从实际项目需求出发,以最快的速度实现SpringBoot下Logback的配置。然后先后实践测试了SpringBoot内置的基础配置(SizeBasedTriggeringPolicy)、按时间划分日志文件的配置(TimeBasedRollingPolicy) 、同时按时间和大小划分日志文件的配置(SizeAndTimeBasedRollingPolicy)、不同级别日志输出到不同日志文件四种情况。 版本   IDE:IDEA 2017.2.2 x64 ​  JDK:1.8.0_171   manve:3.3.3   SpringBoot:1.5.9.RELEASE   Logback:1.1.11(SpringBoot中适配的版本) 适合人群   Java开发人员 说明   转载请说明出处:SpringBoot从入门到进阶——学会Logback日志的配置和搭建   GitHub仓库:https://github.com/leo-zz/SpringBootDemo 参考   官方文档中filters内容: https://Logback.qos.ch/manual/filters.html   官方文档中appenders内容:https://Logback.qos.ch/manual/appenders.html 注意   修改过电脑时间后,intelij idea的光标无法聚焦到代码区,需要重启 intelij idea才能继续编写代码。 步骤 快速配置出项目所需的Logback 项目对于日志的要求:   通常,我们对于项目的日志会有如下要求:   1、时效性:保存30天   2、按时间分割:每个小时生成1个文件夹   3、按大小分割:每个日志文件大小不超过50MB   4、限定体积:日志文件总大小20GB   5、按级别分割:不同级别的日志保存到不同的文件中   下面,我们先基于这些常见的需求,搭建出一个SpringBoot项目。 Logback配置: application.yaml 复制代码 #其他配置 ... #指明日志存放位置,在jar包所在路径下的logs文件夹中 logging: file: logs/application-gatewayservice-${server.port}.logs 复制代码 logback-spring.xml 复制代码 复制代码 logback-spring-file-level.xml 复制代码 ${LOG_FILE}.INFOLevel.%d{yyyy-MM-dd_HH}.%i.log 50MB 30 20GB INFO ACCEPT DENY %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n ${LOG_FILE}.WARNLevel.%d{yyyy-MM-dd_HH}.%i.log 50MB 30 20GB WARN ACCEPT DENY %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n ${LOG_FILE}.ERRORLevel.%d{yyyy-MM-dd_HH}.%i.log 50MB 30 20GB ERROR ACCEPT DENY %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n 复制代码   项目启动后,日志文件会保留在jar包所在路径下的logs文件夹中,并且按照日志级别,输出到不同的文件中。   同时,每小时会生成一个日志文件,如果当日志文件的大小超过50MB时,会分割日志文件。日志系统会保留30天的日志文件,且当所有日志文件的大小超过20GB时,日志系统会在下一天的0时,删除部分日志文件,使日志文件总体的大小控制在20GB以内。   项目源码地址:FastConfig SpringBoot内置的基础配置: application.yaml 复制代码 #指明日志存放位置 logging: file: logs/application-gatewayservice-${server.port}.logs 复制代码 logback-spring.xml 复制代码 复制代码   其中的base.xml,引自SpringBoot的jar包中的基础配置: 1540955132065 base.xml   可以看到base.xml中引入了defaults.xml,以及控制台输出日志配置文件console-appender.xml和文件输出日志配置文件file-appender.xml。 复制代码 复制代码   defaults.xml和console-appender.xml在本示例中不做讨论。 file-appender.xml   通过文件输出日志配置文件,可以看到默认情况下SpringBoot的日志系统限定单个文件大小为10MB。 复制代码 ${FILE_LOG_PATTERN} ${LOG_FILE} ${LOG_FILE}.%i 10MB 复制代码 打印日志的测试接口 复制代码 @Controller public class LogController { ​ Logger logger=Logger.getLogger("LogController"); @GetMapping("/log") @ResponseBody public String testLog(){ for (int i=0;i<1000;i++) logger.info(String.valueOf(i)); return "999"; } } 复制代码 SizeBasedTriggeringPolicy的测试   使用Postman进行日志接口的重复调用,此处请求100次"/log"。 1540956372674   日志文件超过10MB,日志系统会自动分割日志文件,使得单个文件大小在10MB以内。 1540956468416   配置文件的fileNamePattern{LOG_FILE}.%i中的i为序号。   通过本例的测试可知,最早的日志文件,序号越大,每次分割文件时,所有日志文件的序号都会更新。最早的日志文件序号始终是最大的。   如果删除了旧的日志文件,会发生什么呢? 1540956737704   使用Postman再次调用日志测试接口生成日志,可以看到日志系统会重新编号。 1540956900748   观察大小10MB的日志文件,其中大约9.6W行数据。因此平均一行的日志大概104个字节。 1540956057238   项目源码地址:DefaultConfig 按时间划分日志文件   SpringBoot内置的日志系统使用SizeBasedTriggeringPolicy将日志文件在占用空间的维度进行分割。下面我们使用TimeBasedRollingPolicy,将日志文件按时间维度进行分割,示例保留了3天的日志,并且日志文件的最大容量为20MB。   项目配置文件application.yaml不变。 logback-spring.xml 复制代码 复制代码 logback-spring-file.xml 复制代码 ${LOG_FILE}.%d{yyyy-MM-dd_HH}.log 3 20MB %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n 复制代码   注意:file-appender的配置,位置一定要放在标签之前,否则报如下错误:   java.lang.IllegalStateException: Logback configuration error detected:   Could not find an appender named [FILE]. Did you define it below instead of above in the configuration file? TimeBasedRollingPolicy测试 测试totalSizeCap   开启项目后运行一段时间,可以观察到日志文件会按照FileNamePattern中规定的最小时间周期HH(小时)分割日志文件。 1540968935404   使用Postman调用日志测试接口生成日志,使单个日志文件的大小超过20MB。 1540969062304 ​   整点过后,发现13点和14点的日志文件被删除,剩余日志文件的大小保持在20MB以内。 1540969597549   由此测试可知配置文件中totalSizeCap的含义:所有日志文件的大小在一个计时周期内(小时HH)可以超过totalSizeCap设定的容量,但是在下一个计时周期开始时,日志系统会清理日志文件,确保日志文件总体的大小在totalSizeCap以内。 测试MaxHistory   当日志容量不超过totalSizeCap时,更改系统日期为10月30日,10月31日,11月1日,11月2日,并调用日志测试接口生成日志。 1541057233143   当记录11月2日的日志时,日志系统会清除11月1日的日志文件,保留10月30日、10月31日、11月2日三天的日志。 1541143729656   再将日期改成11月10日,调用日志测试接口生成日志,日志系统会清除11月2日的日志文件,保留10月30日、10月31日、11月10日三天的日志。由此可见MaxHistory只是限定保存日志的天数,而不是限定保存最近自然日日志的天数, 1540971323304   通过上面的观察可以发现,在新的日志计时周期到来时,如果所有日志文件大小之和超过totalSizeCap,或日志记录天数超过MaxHistory。日志系统会优先删除最近日期的日志文件,使的日志大小在totalSizeCap内,且日志记录天数在MaxHistory内。   项目源码地址:TimeBasedConfig 同时按时间和大小划分日志文件的配置   配置文件application.yaml不变。 logback-spring.xml 复制代码 复制代码 Logback-spring-file.xml 复制代码 ${LOG_FILE}.%d{yyyy-MM-dd_HH}.%i.log 10MB 3 50MB %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n 复制代码 SizeAndTimeBasedRollingPolicy测试 ​   项目启动后的日志信息: 1540973544860 测试maxFileSize:   调用日志测试接口生成日志,当单个日志文件大小超过10MB时,会新建日志文件存储超过10MB部分的日志内容,并且新日志文件的序号大于旧日志文件的序号(序号规则与Spring内置使用的SizeBasedTriggeringPolicy相反)。 1540974375988 测试maxHistory:   分别更改系统日期为10月30日,10月31日,11月1日,11月2日并调用日志测试接口生成日志。 1541061122949   当记录11月2日的日志时,日志系统会清除11月1日的日志文件,保留10月30日,10月31日,11月2日三天的日志。 1541147624399 测试totalSizeCap:   调用日志测试接口生成日志,使所有日志文件大小之和超过50MB。此时日志仍然在记录,日志文件大小还在增长。1541148062409   将系统时间调至1小时后,继续调用日志测试接口生成日志,日志文件大小超过60MB,此时日志仍然在记录,日志文件大小还在增长。 1541151848427   将系统时间调至1天后,日志系统进行了日志文件的清理,日志系统清除了11月2日的日志文件,保留10月30日,10月31日,11月3日三天的日志,并使的日志文件大小在50MB范围内。 1541152118166   可见此示例中SizeAndTimeBasedRollingPolicy清理的周期(一天)与TimeBasedRollingPolicy不同(一个小时)。   项目源码地址:SizeAndTimeBasedConfig 按日志级别输出到不同的文件中   配置文件application.yaml不变。 logback-spring.xml 复制代码
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信