SpringBoot日志配置详情

一、介绍

在所有的项目中,日志是必不可少的,为了高效清晰的查找日志,可以配置日志输出的等级和格式。

在配置后,可以自定义输出日志到指定目录,可以按照天数来分割日志,可以按照日志级别分割日志,可以按照大小来进行分割日志。

输出的日志方式,可以说五花八门,但总有一款适合你的项目

二、简单配置

1、日志的级别

关于日志的级别打印,需要搞清楚日志等级的优先级

  1. import lombok.extern.slf4j.Slf4j;
  2. import org.springframework.scheduling.annotation.Scheduled;
  3. import org.springframework.stereotype.Component;
  4. @Slf4j
  5. @Component
  6. public class LoggerTask {
  7. @Scheduled(cron = "0/30 * * * * ?")
  8. public void logTask(){
  9. // 日志级别,由低到高,trace < debug < info < warn < error
  10. log.trace("TRACE");
  11. log.debug("DEBUG日志");
  12. log.info("INFO日志");
  13. log.warn("WARN日志");
  14. log.error("ERROR日志");
  15. }
  16. }

在SpringBoot的yaml配置文件中,添加相关日志的配置文件

  1. # 日志配置
  2. logging:
  3. level:
  4. # 代表工程所有类的日志等级
  5. root: info

以下是日志的打印,发现比info级别低的debug和trace级别的日志没有打印出来。

在实际项目中,除了日志输出的规范,合理利用日志等级,也可以达到清晰日志的规范,排查问题会变得高效

除了logging.level.root,还可以指定对应包和类的日志级别

配置文件和测试代码

  1. # 日志配置
  2. logging:
  3. level:
  4. # 代表工程所有包的日志等级
  5. root: info
  6. # 指定包下的日志等级
  7. com.banmoon.spring_boot_logger.mapper: debug
  1. import com.banmoon.spring_boot_logger.mapper.UserMapper;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.scheduling.annotation.Scheduled;
  5. import org.springframework.stereotype.Component;
  6. @Slf4j
  7. @Component
  8. public class LoggerTask {
  9. @Autowired
  10. private UserMapper userMapper;
  11. /**
  12. * 定时去查询数据库表
  13. */
  14. @Scheduled(cron = "10 * * * * ?")
  15. public void dbDemonstration(){
  16. log.info("=====================");
  17. int count = userMapper.countByExample(null);
  18. log.info("用户条数:{}", count);
  19. log.info("=====================");
  20. }
  21. }

2、日志的打印格式

虽然springBoot的日志打印格式足够清晰明了,但它支持自定义打印格式,还是记录一波吧

配置文件指定格式

  1. # 日志配置
  2. logging:
  3. pattern:
  4. # 格式化控制台输出的日志
  5. console: "%red(%d{yyyy-MM-dd HH:mm:ss.SSS}) %green([%thread]) %blue([%-5level]) %cyan(%logger{36}:%line) %msg%n"

简单说明一下这段格式化的意思,学会大家就可以配置自己喜欢的格式了

  1. %red: 指定颜色,记得用小括号将内容包裹起来
  2. %d: 日期时间,后面的是日期格式化
  3. %thred: 线程名
  4. %-5level: 日志级别,%-5表示的是打印字符个数,如果个数不足则用空格补上
  5. %logger{36}: 输出日志的包名,最长36字符,超过则会简化,只会输出后面几个包名和类名
  6. %line: 输出日志的行数
  7. %msg: 输出的日志信息
  8. %n: 换行

3、日志的持久化输出

在日常的开发中,控制台输出的日志就满足开发的需求了。但是在测试生产环境下,日志的持久化保存就显得格外的重要,springBoot也考虑到了这一点,也拥有相对应的配置

  1. # 日志配置
  2. logging:
  3. # 输出日志文件的路径,log=相对路径,D:/log=绝对路径,文件名默认为spring.log
  4. path: D:/log
  5. # 输出到指定的文件中,同样可以指定相对路径
  6. file: log/spring-boot-logger.log
  7. pattern:
  8. # 持久化输出日志的格式,颜色不起作用,需要区别于控制台
  9. file: "%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%-5level] %logger{36}:%line %msg%n"

相对路径,指定logging.file输出

绝对路径,指定logging.path输出

注意:logging.pathlogging.file只需指定一个便可,两个都指定时,仅会输出logging.file的日志

三、高级配置

在创建springBoot项目后,简单的日志配置可以满足我们大部分的需求,但我们有时需要高度自定义的日志,比如说

  • 按天生成日志:一天一份日志,排查问题就方便的多
  • 按日志大小来切割日志:假如日志超过存储大小,它会自动将日志写入新的文件中
  • 按日志等级输出独立的日志:一般选择ERROR级别的日志单独输出

1、配置模板

resources目录下,创建文件logback/logback.xml,并在配置文件指定logback的配置文件

  1. logging:
  2. config: classpath:logback/logback.xml

logback.xml文件配置

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <configuration scan="true" scanPeriod="30 seconds" debug="true">
  3. <!-- 获取日志文件的输出路径 -->
  4. <springProperty scope="context" name="LOG_PATH" source="logging.log_path"/>
  5. <!-- 获取该应用的名称 -->
  6. <springProperty scope="context" name="APPLICATION_NAME" source="spring.application.name"/>
  7. <!-- 定义日志输出格式和颜色 -->
  8. <property name="LOG_FORMAT_ONE" value="%red(%d{yyyy-MM-dd HH:mm:ss.SSS}) %green([%thread]) %blue([%-5level]) %cyan(%logger{36}:%line) %msg%n" />
  9. <property name="LOG_FORMAT_TWO" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%-5level] %logger{36}:%line %msg%n" />
  10. <!-- 输出到控制台 -->
  11. <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
  12. <!-- 日志输出编码格式化 -->
  13. <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
  14. <Pattern>${LOG_FORMAT_ONE}</Pattern>
  15. <charset>UTF-8</charset>
  16. </encoder>
  17. <!-- 过滤器,此过滤器低于阈值的不再显示 -->
  18. <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
  19. <level>info</level>
  20. </filter>
  21. </appender>
  22. <!-- 时间日期滚动日志 -->
  23. <appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
  24. <!-- 输出的日志远程,当天的日志名称 -->
  25. <file>${LOG_PATH}/${APPLICATION_NAME}/${APPLICATION_NAME}.log</file>
  26. <!-- 策略配置 -->
  27. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  28. <!-- 保存归纳的日志 -->
  29. <fileNamePattern>${LOG_PATH}/${APPLICATION_NAME}/%d{yyyy-MM-dd}/${APPLICATION_NAME}.log</fileNamePattern>
  30. <!-- 日志保存的天数 -->
  31. <maxHistory>180</maxHistory>
  32. <!-- 总容量 -->
  33. <totalSizeCap>10GB</totalSizeCap>
  34. </rollingPolicy>
  35. <!-- 日志输出编码格式化 -->
  36. <encoder>
  37. <pattern>${LOG_FORMAT_TWO}</pattern>
  38. <charset>UTF-8</charset>
  39. </encoder>
  40. </appender>
  41. <!-- 时间日期滚动日志,只记录error级别的日志 -->
  42. <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
  43. <file>${LOG_PATH}/${APPLICATION_NAME}/${APPLICATION_NAME}_error.log</file>
  44. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  45. <fileNamePattern>${LOG_PATH}/${APPLICATION_NAME}/%d{yyyy-MM-dd}/${APPLICATION_NAME}_error.log</fileNamePattern>
  46. <maxHistory>180</maxHistory>
  47. <totalSizeCap>10GB</totalSizeCap>
  48. </rollingPolicy>
  49. <encoder>
  50. <pattern>${LOG_FORMAT_TWO}</pattern>
  51. <charset>UTF-8</charset>
  52. </encoder>
  53. <!-- 过滤器,日志级别过滤,仅输出error日志 -->
  54. <filter class="ch.qos.logback.classic.filter.LevelFilter">
  55. <level>ERROR</level>
  56. <onMatch>ACCEPT</onMatch>
  57. <onMismatch>DENY</onMismatch>
  58. </filter>
  59. </appender>
  60. <!-- 指定输出的日志等级,root代表工程所有包 -->
  61. <root level="INFO">
  62. <appender-ref ref="CONSOLE" />
  63. <appender-ref ref="FILE_INFO" />
  64. <appender-ref ref="FILE_ERROR" />
  65. </root>
  66. <!-- 指定输出的日志等级,指定包路径,此包下都以设置的等级输出 -->
  67. <!-- additivity表示日志是否向上传递,如果为true,日志在root可能会再次打印 -->
  68. <logger name="com.banmoon.spring_boot_logger.mapper" level="DEBUG" additivity="false">
  69. <appender-ref ref="CONSOLE" />
  70. <appender-ref ref="FILE_INFO" />
  71. <appender-ref ref="FILE_ERROR" />
  72. </logger>
  73. </configuration>

2、通过运行环境来指定对应的输出策略

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <configuration scan="true" scanPeriod="30 seconds" debug="true">
  3. <!-- 或者通过环境来指定输出的策略 -->
  4. <springProfile name="dev">
  5. <include resource="logback/logback-dev.xml" />
  6. </springProfile>
  7. <springProfile name="test | prod">
  8. <include resource="logback/logback-prod.xml" />
  9. </springProfile>
  10. </configuration>

logback-dev.xml文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <included>
  3. <!-- 开发环境,日志只至控制台 -->
  4. <root level="INFO">
  5. <appender-ref ref="CONSOLE" />
  6. </root>
  7. <logger name="com.banmoon.spring_boot_logger.mapper" level="DEBUG" additivity="false">
  8. <appender-ref ref="CONSOLE" />
  9. </logger>
  10. </included>

logback-prod.xml文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <included>
  3. <!-- 测试,生产环境,持久化日志文件 -->
  4. <root level="INFO">
  5. <appender-ref ref="CONSOLE" />
  6. <appender-ref ref="FILE_INFO" />
  7. <appender-ref ref="FILE_ERROR" />
  8. </root>
  9. <logger name="com.banmoon.spring_boot_logger.mapper" level="DEBUG" additivity="false">
  10. <appender-ref ref="CONSOLE" />
  11. <appender-ref ref="FILE_INFO" />
  12. <appender-ref ref="FILE_ERROR" />
  13. </logger>
  14. </included>

3、相关配置标签

标签名 属性 作用
configuration scan:是否扫描日志配置文件,默认为true
scanPeriod:扫描时间间隔,默认为60 seconds
debug:是否打印出logback的日志,默认为false
logback配置,当scan启用时,配置文件会定时检查并重新加载
property name:属性名
value:属性值
file:可以引入properties文件的属性
定义参数常量,可以使用${属性名}进行使用
springProperty name:属性名
source:取项目配置文件的属性源
scope:作用域
springBoot的扩展,将读取springBoot的配置文件,获取参数常量
appender name:自定义的策略名
class:指定输出策略的输出类,控制台输出或文件输出
输出策略
appender.file 此策略输出的文件路径,可以绝对路径,也可以相对路径
appender.rollingPolicy class:指定回滚策略类 日志输出回滚策略配置
appender.rollingPolicy.fileNamePattern 日志输出回滚的日志保存路径
appender.rollingPolicy.maxHistory 日志最大保存天数
appender.rollingPolicy.totalSizeCap 总日志最大的容量,指的不是单个文件
appender.encoder 编码策略
appender.encoder.pattern 指定输出的日志格式,控制台可以有颜色,但文件输出不行
appender.encoder.charset 编码格式,一般都取utf-8
appender.filter class:指定过滤器类
注意:每个过滤器,子节点都不完全相同,建议查看源码和官方文档,也可以实现自己的过滤器
日志输出的过滤策略
root level:指定日志等级 该项目所有包的等级,比此等级高的日志信息会显示
logger level:指定日志等级
name:指定的包名或类名
additivity:true/false,表示日志是否向上传递,如果为true,日志在root可能会再次打印
功能与root基本一致,区别在于
root是指定工程的所有包的,而logger需要自己指定包或类
root.appender-ref
logger.appender-ref
ref:指定定义的appender策略的名字 指定输出的策略
建议在最上层指定控制台,不然启动控制台就一个springBoot的Logo
springProfile springBoot的扩展,可以通过环境指定,实现标签内的内容

四、官方配置文档和git地址

功能:SpringBoot日志配置详情的更多相关文章

  1. SpringBoot Logback配置,SpringBoot日志配置

    SpringBoot Logback配置,SpringBoot日志配置  SpringBoot springProfile属性配置 ================================ © ...

  2. Springboot日志配置探索(主要看logback)(一)

    这篇博客是springboot日志配置探索的第一篇,主要讲默认配置下springboot的logback日志框架的配置(即直接使用是怎样的) 首先,是一个SpringBoot的有关日志的说明文档:ht ...

  3. (转)Springboot日志配置(超详细,推荐)

    Spring Boot-日志配置(超详细) 更新日志: 20170810 更新通过 application.yml传递参数到 logback 中. Spring Boot-日志配置超详细 默认日志 L ...

  4. springboot 日志配置

    maven依赖中添加了 spring-boot-starter-logging : <dependency> <groupId>org.springframework.boot ...

  5. springboot日志配置

    默认情况下,spring boot使用的是LogBack日志系统.在spring-boot-starter-web和spring-boot-starter中都已经默认依赖了logging的工具包. 如 ...

  6. SpringBoot日志配置(详解) 涉及控制台输出日志、生成日志文件、日志级别修改、hibernate日志不输出

    写在前面 本篇主要讲述日志配置,看完本篇可以解决下述问题, 控制台输出日志.生成日志文件.日志级别修改.hibernate日志不输出 Git Demo Path:https://github.com/ ...

  7. Springboot日志配置探索(主要看logback)(二)

    这篇博客主要是讲在Springboot中扩展的日志框架的配置,也是主要讲logback 8 继续看文档,这里讲到: springboot里面还有几个日志系统框架可以选择使用,你可以通过在classpa ...

  8. 微服务-springboot日志配置

    springboot 默认会加载classpath:logback-spring.xml文件. springProfile 中的name名字对应application-xx.properties 中的 ...

  9. ELK springboot日志收集

    一.安装elasticsearch 可以查看前篇博客 elasticsearch安装.elasticsearch-head 安装 二.安装 配置 logstash 1.安装logstash 下载地址: ...

随机推荐

  1. SpringBoot(七):SpringBoot中如何使用过滤器(Filter)?

    方式一: 通过注解方式实现: 1.编写一个Servlet3的注解过滤器(和上一章Servlet相似) 贴代码: package com.example.springbootweb.filter; im ...

  2. 大话Spark(6)-源码之SparkContext原理剖析

    SparkContext是整个spark程序通往集群的唯一通道,他是程序的起点,也是程序的终点. 我们的每一个spark个程序都需要先创建SparkContext,接着调用SparkContext的方 ...

  3. Spring-05 使用注解开发

    Spring-05 使用注解开发 使用注解开发 1.项目准备 在spring4之后,想要使用注解形式,必须得要引入aop的包5 <!-- https://mvnrepository.com/ar ...

  4. CVE-2017-7504-JBoss JMXInvokerServlet 反序列化

    漏洞分析 https://paper.seebug.org/312/ 漏洞原理 这是经典的JBoss反序列化漏洞,JBoss在/invoker/JMXInvokerServlet请求中读取了用户传入的 ...

  5. android分析之Parcel

    将数据打包,跨进程传输(通过Binder).看看这货究竟是啥玩意: Parcel.java : public final class Parcel { private static final boo ...

  6. MySQL入门(7)——表数据的增、删、改

    MySQL入门(7)--表数据的增.删.改 插入数据 使用INSERT···VALUES语句插入数据 INSERT语句最常用的格式是INSERT···VALUES: INSERT [LOW_PRIOR ...

  7. vue+element+oss实现前端分片上传和断点续传

    纯前端实现: 切片上传 断点续传 .断点续传需要在切上上传的基础上实现 前端之前上传OSS,无需后端提供接口.先上完整代码,直接复制,将new OSS里的参数修改成自己公司OSS相关信息后可用,如遇问 ...

  8. pgrep - 命令

    pgrep 命令格式:pgrep [选项] [模式] 选项 含义 -d <string> 指定输出分隔符 -l PID和进程名称 -a 列出PID和完整的命令行 -v 取反 -c 统计进程 ...

  9. Android Studio 报错:你的主机中的软件中止了一个已建立的连接

    •解决方案 关闭电脑的移动热点 关闭后,build 就不会报错了. 等 build 好了后,重新打开移动热点,再次 build 一就不会报错.

  10. 此博客使用的CSS样式详解!

    此博客使用的CSS样式详解! 页面使用的博客园模板为:LuxInteriorLight,可以在博客皮肤里找到. 页首屏蔽广告代码 <script>console.log("顶部标 ...