转载-SpringBoot开发案例之整合日志管理
转载:https://cloud.tencent.com/developer/article/1097579
有一种力量无人能抵挡,它永不言败生来倔强。有一种理想照亮了迷茫,在那写满荣耀的地方。

概述
参考文档:Logging
这里顺便引用以下部分原文,当然看不明白也没关系,我们有有道翻译,如果翻译的不准确,后面会提供详细配置分享给大家。
Spring Boot uses Commons Logging for all internal logging, but leaves the underlying log implementation open. Default configurations are provided for Java Util Logging, Log4J2 and Logback. In each case loggers are pre-configured to use console output with optional file output also available. By default, If you use the ‘Starters’, Logback will be used for logging. Appropriate Logback routing is also included to ensure that dependent libraries that use Java Util Logging, Commons Logging, Log4J or SLF4J will all work correctly.
使用
pom.xml相关配置就不跟大家在这里扯了,依赖自行添加。
Console output
配置日志的相关参数也只需要写在 application.properties或者application.yml中就可以了,当然,这仅仅是基本的配置。
- #官方文档中有提到, SpringBoot 的 Logging 配置的级别有7个:TRACE , DEBUG , INFO , WARN , ERROR , FATAL , OFF
- #root日志以INFO级别输出
- logging.level.root=INFO
- #springframework.web日志以WARN级别输出
- logging.level.org.springframework.web=WARN
- #hibernate日志以ERROR级别输出
- logging.level.org.hibernate=ERROR
加入以上配置后,我们启动项目,就可以在控制台打印Log信息了。
但是,在生产环境中,日志往往要以文件形式存放到服务器,下面介绍一下spring-boot日志的文件输出方式。
File output
- logging.file=spring_boot.log
- logging.pattern.console=%d{yyyy/MM/dd-HH:mm:ss} [%thread] %-5level %logger- %msg%n
- logging.pattern.file=%d{yyyy/MM/dd-HH:mm} [%thread] %-5level %logger- %msg%n
配置完成以后,我们再次启动项目,这时候会在根目录下生成一个spring_boot.log日志文件。
但是,经历过项目上线的小伙伴,其实这样配置远远达不到生产要求。比如,区分普通日志和错误日志,按照日期存储日志,配置单个日志文件最大容量,删除多少天之前的文件等等!下面与大家分享一款更高级的配置。
Custom log configuration
Depending on your logging system, the following files will be loaded:
Logback:logback-spring.xml, logback-spring.groovy, logback.xml or logback.groovy
Log4j2:log4j2-spring.xml or log4j2.xml
JDK (Java Util Logging):logging.properties
spring-boot日志管理支持Logback,Log4j2以及Log4j,根据以上说明,我们可以定义文件命名。
下面我们使用Logback的指定配置文件实现更高级的日志配置。
logback-spring.xml:
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- scan 配置文件如果发生改变,将会被重新加载 scanPeriod 检测间隔时间-->
- <configuration scan="true" scanPeriod="60 seconds" debug="false">
- <contextName>spring-boot-log</contextName>
- <include resource="org/springframework/boot/logging/logback/base.xml"/>
- <!-- 普通日志 -->
- <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
- <file>log/spring-boot-log-info.log</file>
- <!-- 循环政策:基于时间创建日志文件 -->
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
- <!-- 日志命名:单个文件大于128MB 按照时间+自增i 生成log文件 -->
- <fileNamePattern>log/spring-boot-log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
- <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
- <maxFileSize>128MB</maxFileSize>
- </timeBasedFileNamingAndTriggeringPolicy>
- <!-- 最大保存时间:30天-->
- <maxHistory>30</maxHistory>
- </rollingPolicy>
- <append>true</append>
- <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
- <charset>utf-8</charset>
- </encoder>
- <filter class="ch.qos.logback.classic.filter.LevelFilter">
- <level>info</level>
- <onMatch>ACCEPT</onMatch>
- <onMismatch>DENY</onMismatch>
- </filter>
- </appender>
- <!-- 错误日志 -->
- <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
- <file>log/spring-boot-log-error.log</file>
- <!-- 循环政策:基于时间创建日志文件 -->
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
- <!-- 日志命名:单个文件大于2MB 按照时间+自增i 生成log文件 -->
- <fileNamePattern>log/spring-boot-log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
- <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
- <maxFileSize>2MB</maxFileSize>
- </timeBasedFileNamingAndTriggeringPolicy>
- <!-- 最大保存时间:180天-->
- <maxHistory>180</maxHistory>
- </rollingPolicy>
- <append>true</append>
- <!-- 日志格式 -->
- <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
- <charset>utf-8</charset>
- </encoder>
- <!-- 日志级别过滤器 -->
- <filter class="ch.qos.logback.classic.filter.LevelFilter">
- <!-- 过滤的级别 -->
- <level>ERROR</level>
- <!-- 匹配时的操作:接收(记录) -->
- <onMatch>ACCEPT</onMatch>
- <!-- 不匹配时的操作:拒绝(不记录) -->
- <onMismatch>DENY</onMismatch>
- </filter>
- </appender>
- <!-- 控制台 -->
- <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
- <!-- 日志格式 -->
- <encoder>
- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
- <charset>utf-8</charset>
- </encoder>
- <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
- <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
- <level>INFO</level>
- </filter>
- </appender>
- <!-- additivity 避免执行2次 -->
- <logger name="com.itstyle" level="INFO" additivity="false">
- <appender-ref ref="STDOUT"/>
- <appender-ref ref="INFO_FILE"/>
- <appender-ref ref="ERROR_FILE"/>
- </logger>
- <root level="INFO">
- <appender-ref ref="STDOUT" />
- <appender-ref ref="INFO_FILE" />
- <appender-ref ref="ERROR_FILE" />
- </root>
- </configuration>
如果我们使用了 Logback 的指定配置文件的话,那么application.properties 中的配置可以取消了。
测试
配置完成后,我们做一个测试,为了测试方便把info和error日志容量maxFileSize都改为2MB。
然后启动程序:
- /**
- * 创建者 https://blog.52itstyle.com
- * 创建时间 2017年7月24日
- */
- @EnableAutoConfiguration
- public class Application {
- private static final Logger logger = LoggerFactory.getLogger(Application.class);
- public static void main(String[] args) throws InterruptedException {
- SpringApplication.run(Application.class, args);
- while(true){
- logger.info("普通日志");
- logger.error("错误日志");
- }
- }
- }
执行一段时间,如果在项目路径下生成以下日志文件说明配置成功。

代码:http://git.oschina.net/52itstyle/spring-boot-log
转载-SpringBoot开发案例之整合日志管理的更多相关文章
- SpringBoot开发案例之整合Dubbo分布式服务
前言 在 SpringBoot 很火热的时候,阿里巴巴的分布式框架 Dubbo 不知是处于什么考虑,在停更N年之后终于进行维护了.在之前的微服务中,使用的是当当维护的版本 Dubbox,整合方式也是使 ...
- SpringBoot开发案例之整合Kafka实现消息队列
前言 最近在做一款秒杀的案例,涉及到了同步锁.数据库锁.分布式锁.进程内队列以及分布式消息队列,这里对SpringBoot集成Kafka实现消息队列做一个简单的记录. Kafka简介 Kafka是由A ...
- SpringBoot开发案例之整合Activiti工作流引擎
前言 JBPM是目前市场上主流开源工作引擎之一,在创建者Tom Baeyens离开JBoss后,JBPM的下一个版本jBPM5完全放弃了jBPM4的基础代码,基于Drools Flow重头来过,目前官 ...
- SpringBoot 开发案例之整合FastDFS分布式文件系统
1.pom依赖 <!--fastdfs--> <dependency> <groupId>com.github.tobato</groupId> < ...
- SpringBoot开发案例从0到1构建分布式秒杀系统
前言 最近,被推送了不少秒杀架构的文章,忙里偷闲自己也总结了一下互联网平台秒杀架构设计,当然也借鉴了不少同学的思路.俗话说,脱离案例讲架构都是耍流氓,最终使用SpringBoot模拟实现了部分秒杀场 ...
- SpringBoot开发案例之多任务并行+线程池处理
前言 前几篇文章着重介绍了后端服务数据库和多线程并行处理优化,并示例了改造前后的伪代码逻辑.当然了,优化是无止境的,前人栽树后人乘凉.作为我们开发者来说,既然站在了巨人的肩膀上,就要写出更加优化的程序 ...
- SpringBoot | 第二十三章:日志管理之整合篇
前言 在本系列<第四章:日志管理>中,由于工作中日志这块都是走默认配置,也没有深入了解过,因为部署过程中直接使用了linux中的输出重定向功能,如java -jar xx.jar > ...
- SpringBoot开发案例之打造私有云网盘
前言 最近在做工作流的事情,正好有个需求,要添加一个附件上传的功能,曾找过不少上传插件,都不是特别满意.无意中发现一个很好用的开源web文件管理器插件 elfinder,功能比较完善,社区也很活跃,还 ...
- SpringBoot开发案例之分布式集群共享Session
前言 在分布式系统中,为了提升系统性能,通常会对单体项目进行拆分,分解成多个基于功能的微服务,如果有条件,可能还会对单个微服务进行水平扩展,保证服务高可用. 那么问题来了,如果使用传统管理 Sessi ...
随机推荐
- Android的简述
程序截图 先来简单了解下程序运行的效果 程序入口点 类似于win32程序里的WinMain函数,Android自然也有它的程序入口点.它通过在AndroidManifest.xml文件中配置来指明, ...
- 基于drone构建CI-CD系统
kubernetes集群三步安装 CI 概述 用一个可描述的配置定义整个工作流 程序员是很懒的动物,所以想各种办法解决重复劳动的问题,如果你的工作流中还在重复一些事,那么可能就得想想如何优化了 持续集 ...
- Python—三目运算
Python 可通过 if 语句来实现三目运算的功能,因此可以近似地把这种 if 语句当成三目运算符.作为三目运算符的 if 语句的语法格式如下: (True_statements) if (expr ...
- 基于Spring注解的上下文初始化过程源码解析(一)
最近工作之余有时间和精力,加上平时对源码比较感兴趣,就开始啃起了Spring源码.为加深印象写了这篇博客,如有错误,望各位大佬不吝指正. 我看的是Spring5的源码,从同性社区download下来后 ...
- c#图片的平移与旋转
1新建文件夹,添加一个图片 2 添加控件 两个button控件 一个image控件 一个Canvas控件 3 代码实现 using System;using System.Collections.Ge ...
- Java连载11-转义字符&整数型
一.转义符 1.\'代表单引号:\\代表\; 二.native2ascii.exe JDK中自带的native2ascii.exe命令,可以将文字转换成unicode编码形式 我们使用这个程序尝试一下 ...
- intellij idea 2019 安装使用教程
一.安装 idea 2019.2 链接:https://pan.baidu.com/s/1acx_P23W463it9PGAYUIBw 提取码:4bky 双击运行idea.exe 点击Next ...
- C++实现微信WeChat网页接口推送股票报警消息
QStockView微信推送股票报警 1.功能简介 最近很多用户反馈,软件只能在电脑上使用,不能在手机上使用.所以增加了微信推送报警的功能,电脑端的报警提示消息可以通过微信同步发送到手机微信.这样即可 ...
- Jenkins使用aqua-microscanner-plugin进行容器漏洞扫描
官方地址:https://github.com/jenkinsci/aqua-microscanner-plugin Step1 在jenkins安装"Aqua MicroScanner&q ...
- Go类型别名与类型定义区别
类型别名和自定义类型区别 自定义类型 //自定义类型是定义了一个全新的类型 //将MyInt定义为int类型 type MyInt int 类型别名 //类型别名规定:TypeAlias只是Type的 ...