SpringBoot+logback

  • 一、日志简介
    • 1、SLF4J介绍
  • 二、SpringBoot集成logback
    • 1、配置文件详解
      • 1、彩色日志
      • 2、appender
      • 3、root和logger详解
      • 4、logback中的springProfile

一、日志简介

1、SLF4J介绍

slf4j 全称 Simple Logging Facade for Java,是日志框架的一种抽象,那么也就是说 slf4j 是不能单独使用的必须要有其他实现日志框架来配合使用,slf4j 支持的日志框架的包。比如log4j、log4j2、logback等。

通俗的讲: 把SLF4J理解成一个接口,log4j、log4j2、logback分别为接口的实现类,我们能简单的切换使用各种实现。 举例,如果我现在使用的是slf4j+log4j。再不改变源代码的情况下,我们切换成slf4j+logback。


本文采取的是SpringBoot+slf4j+logback实现日志记录。也是现在最流行的方式。


二、SpringBoot集成logback

查看依赖可知,SpringBoot默认支持slf4j+logback

1、配置文件详解

1、 在resource下创建logback-spring.xml文件

注:配置文件我已经配置的很完善了,可以拿来直接用,切换生产模式和开发模式。

<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration scan="true" scanPeriod="10 seconds"><!--用于区分不同应用程序的记录--><contextName>logback</contextName><!-- name的值是变量的名称,value -的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 --><property name="log.path" value="./logbak_log"/><!-- 彩色日志 --><!-- 彩色日志依赖的渲染类 --><conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/><conversionRule conversionWord="wex"converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/><conversionRule conversionWord="wEx"converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/><!-- 彩色日志格式 --><property name="CONSOLE_LOG_PATTERN"value="${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}}"/><!--    # %d-时间格式、%thread-线程、%-5level-从左5字符宽度、%logger{50}-日志50个字符、%msg-信息、%n-换行--><!--    # 修改在控制台输出的日志格式--><!--    logging.pattern.console=%d{yyyy-MM-dd} [%thread] %-5level %logger{50} -%msg%n--><!--    # 修改输出到文件的日志格式--><!--    logging.pattern.file=%d{yyyy/MM/dd} === [%thread] == %-5level == %logger{50} == %msg%n--><!--输出到控制台--><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息--><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>debug</level></filter><encoder><Pattern>${CONSOLE_LOG_PATTERN}</Pattern><!-- 设置字符集 --><charset>UTF-8</charset></encoder></appender><!--输出到文件--><!-- 时间滚动输出 level为 DEBUG 日志 --><appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 正在记录的日志文件的路径及文件名 --><file>${log.path}/log_debug.log</file><!--日志文件输出格式--><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern><charset>UTF-8</charset> <!-- 设置字符集 --></encoder><!-- 日志记录器的滚动策略,按日期,按大小记录 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 日志归档 --><fileNamePattern>${log.path}/debug/log-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern><timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><maxFileSize>500MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy><!--日志文件保留天数--><maxHistory>30</maxHistory></rollingPolicy><!-- 此日志文件只记录debug级别的 --><!--https://blog.csdn.net/qq_36066039/article/details/100584785DENY,日志将立即被抛弃不再经过其他过滤器;NEUTRAL,有序列表里的下个过滤器过接着处理日志;ACCEPT,日志会被立即处理,不再经过剩余过滤器。--><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>debug</level><!--用于配置符合过滤条件的操作--><onMatch>ACCEPT</onMatch><!--用于配置不符合过滤条件的操作--><onMismatch>DENY</onMismatch></filter></appender><!-- 时间滚动输出 level为 INFO 日志 --><appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 正在记录的日志文件的路径及文件名 --><file>${log.path}/log_info.log</file><!--日志文件输出格式--><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern><charset>UTF-8</charset></encoder><!-- 日志记录器的滚动策略,按日期,按大小记录 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 每天日志归档路径以及格式 --><fileNamePattern>${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern><timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><maxFileSize>500MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy><!--日志文件保留天数--><maxHistory>30</maxHistory></rollingPolicy><!-- 此日志文件只记录info级别的 --><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>info</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter></appender><!-- 时间滚动输出 level为 WARN 日志 --><appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 正在记录的日志文件的路径及文件名 --><file>${log.path}/log_warn.log</file><!--日志文件输出格式--><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern><charset>UTF-8</charset> <!-- 此处设置字符集 --></encoder><!-- 日志记录器的滚动策略,按日期,按大小记录 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${log.path}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern><timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><maxFileSize>10MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy><!--日志文件保留天数--><maxHistory>2</maxHistory></rollingPolicy><!-- 此日志文件只记录warn级别的 --><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>warn</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter></appender><!-- 时间滚动输出 level为 ERROR 日志 --><appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 正在记录的日志文件的路径及文件名 --><file>${log.path}/log_error.log</file><!--日志文件输出格式--><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern><charset>UTF-8</charset> <!-- 此处设置字符集 --></encoder><!-- 日志记录器的滚动策略,按日期,按大小记录 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern><timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><maxFileSize>10MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy><!--日志文件保留天数--><maxHistory>2</maxHistory></rollingPolicy><!-- 此日志文件只记录ERROR级别的 --><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>ERROR</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter></appender><!--<logger>用来设置某一个包或者具体的某一个类的日志打印级别、以及指定<appender>。<logger>仅有一个name属性,一个可选的level和一个可选的addtivity属性。name:用来指定受此logger约束的某一个包或者具体的某一个类。level:用来设置打印级别(日志级别),大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。如果未设置此属性,那么当前loger将会继承上级的级别。additivity:是否向上级logger传递打印信息。默认是true;additivity=true  logger没有appender: 这种情况下logger包的日志会继承父节点的appender打印,如果自己没设置level,继承父节点的level。 logger包日志只打印一次additivity=true  logger有appender: 这种情况下logger包用自己的appender打印,父节点也会打印logger包的日志。 也就是logger包日志打印两次additivity=false  logger没有appender: 这种情况下,logger包日志不会打印additivity=false  logger有appender: 这种情况下logger包打印一次,用自己的appender打印。如果自己没设置level,继承父节点的level。root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF, 不能设置为INHERITED或者同义词NULL。默认是DEBUG可以包含零个或多个元素,标识这个appender将会添加到这个logger。--><!--开发环境:打印控制台--><springProfile name="dev"><!--打印sql日志--><logger name="cn.yx.zg.mappers" level="DEBUG" additivity="false"><appender-ref ref="CONSOLE"/></logger><root level="info"><appender-ref ref="CONSOLE"/></root></springProfile><!--测试环境:输出到文件--><springProfile name="test"><root level="info"><appender-ref ref="CONSOLE"/><appender-ref ref="INFO_FILE"/><appender-ref ref="ERROR_FILE"/><appender-ref ref="WARN_FILE"/></root></springProfile><!--生产环境:输出到文件--><springProfile name="prd"><root level="info"><appender-ref ref="CONSOLE"/><appender-ref ref="INFO_FILE"/><appender-ref ref="ERROR_FILE"/><appender-ref ref="WARN_FILE"/></root></springProfile>
</configuration>

1、彩色日志

配置彩色日志:彩色日志只是为了让日志再idea上打印的好看点而已。即使不安装彩色日志插件,也不需要删除彩色日志配置,只是不显示彩色而已。
idea安装插件Grep Console即可显示彩色日志

彩色效果如下图


2、appender

appender里定义了日志的打印规则,比如日志打印级别,日志格式,日志文件存储的方式

3、root和logger详解

logger用来设置某一个包或者具体的某一个类的日志打印级别、以及指定appender。 logger仅有一个name属性,一个可选的level和一个可选的addtivity属性。
name : 用来指定受此logger约束的某一个包或者具体的某一个类。
level : 用来设置打印级别(日志级别),大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。如果未设置此属性,那么当前loger将会继承上级的级别。
addtivity : 是否向上级logger传递打印信息。默认是true。
root的也是一个loger元素,但是它是根loger。只有一个level属性,应为已经被命名为root。
level : 用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能设置为INHERITED或者同义词NULL。默认是DEBUG。

代码演示效果一:


<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="10 seconds"><contextName>logback</contextName><!--输出到控制台--><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息--><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>debug</level></filter><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern><!-- 设置字符集 --><charset>UTF-8</charset></encoder></appender><root level="info"><appender-ref ref="CONSOLE"/></root>
</configuration>
package cn.yx.zg.controller;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class TestController {private static Logger log = LoggerFactory.getLogger(TestController.class);@RequestMapping("/test")public String test() {log.debug("debug");log.info("info");log.warn("warn");log.error("error");return "success";}
}

当执行test方法时,root将大于等于info级别的日志信息交给已经配置好的名为“CONSOLE”的appender处理,大于等于info级别的日志打印出来。


代码演示效果二:

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="10 seconds"><contextName>logback</contextName><!--输出到控制台--><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息--><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>debug</level></filter><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern><!-- 设置字符集 --><charset>UTF-8</charset></encoder></appender><!-- logback为java中的包 --><logger name="cn.yx.zg.controller"/><root level="info"><appender-ref ref="CONSOLE"/></root>
</configuration>

logger name=“cn.yx.zg.controller” :表示将cn.yx.zg.controlle包下的所有类的日志打印,但是并没用设置打印级别,所以继承他的上级的日志级别info;
没有设置addtivity,默认为true,将此loger的打印信息向上级传递。
没有设置appender,此loger本身不打印任何信息。
root level=“info” :接收到logger传来的日志,开始打印。

当执行test方法时,首先执行 cn.yx.zg.controller的logger ,将级别为INFO及大于INFO的日志信息传递给root,本身没有配置appender并不打印;
root接到下级传递的信息,把info和大于info的日志打印出来;

代码演示效果三:

<?xml version="1.0" encoding="UTF-8"?><configuration scan="true" scanPeriod="10 seconds"><contextName>logback</contextName><!--输出到控制台--><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息--><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>debug</level></filter><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern><!-- 设置字符集 --><charset>UTF-8</charset></encoder></appender><!-- logback为java中的包 --><logger name="cn.yx.zg.controller" /><!--cn.yx.zg.controller.TestController:类的全路径 -->    <logger name="cn.yx.zg.controller.TestController" level="INFO" additivity="false"><appender-ref ref="CONSOLE"/></logger><root level="info"><appender-ref ref="CONSOLE"/></root>
</configuration>

cn.yx.zg.controller包下的所有类的日志的打印,但是并没用设置打印级别,所以继承他的上级root的日志级别info;
没有设置addtivity,默认为true,将此loger的打印信息向上级传递;
没有设置appender,此loger本身不打印任何信息。

cn.yx.zg.controller.TestController的类日志打印
additivity属性为false,表示此loger的打印信息不再向上级传递,
level属性为INFO。

当执行test方法时,先执行cn.yx.zg.controller.TestController的logger,将大于等于info级别的日志打印。additivity是false,日志信息不向 cn.yx.zg.controller传递,cn.yx.zg.controller没接收到日志,自然也不向root传递任何打印信息。所以控制台只打印大于等于info级别的日志

如果把cn.yx.zg.controller.TestController的additivity属性改为true,那么大于等于info级别的日志会打印两次。 因为logger本身打印一次,root打印一次

注意:cn.yx.zg.controller 是cn.yx.zg.controller.TestController的上级
root是cn.yx.zg.controller的上级

4、logback中的springProfile

springProfile是为了切换开发环境和生产环境的配置。

开发环境

application.properties文件中配置spring.profiles.active=dev

<springProfile name="dev"><root level="info"><appender-ref ref="CONSOLE"/></root>
</springProfile>

生产环境
application.properties文件中配置spring.profiles.active=prd

<springProfile name="prd"><root level="info"><appender-ref ref="CONSOLE"/></root>
</springProfile>

SpringBoot+logback实现日志打印相关推荐

  1. java lombok logback 配置日志打印

    一.maven 引入 <dependency><groupId>org.projectlombok</groupId><artifactId>lombo ...

  2. Springboot中进行日志打印需要的信息

  3. springboot配置sql日志打印

    application.properties:logging.level.com.alibaba.grow.repository.mapper=debug在yml文件中: logging:level: ...

  4. java agent开发 日志打印

    简介 目前java 打印日志用的比较多的就是slf4j配合log4j/logback进行日志打印,但是呢agent是独立的jar包, 使用slf4j就需要将包引入agent中,这样就可能和业务自身的s ...

  5. logback - 自定义日志脱敏组件,一种不错的脱敏方案

    前言 在我们书写代码的时候,会书写许多日志代码,但是有些敏感数据是需要进行安全脱敏处理的. 对于日志脱敏的方式有很多,常见的有①使用conversionRule标签,继承MessageConverte ...

  6. springboot aop + logback + 统一异常处理 打印日志

    springboot aop + logback + 统一异常处理 打印日志 参考文章: (1)springboot aop + logback + 统一异常处理 打印日志 (2)https://ww ...

  7. 记录druid整合springboot+logback配置打印sql日志

    [记录druid整合springboot+logback配置打印sql日志] 整合记录 整合记录 首先看 druid 的LogFilter 为我们准备的四种logger类型 这些logger分别对应打 ...

  8. springboot 打印乱码_Springboot中使用logback输出日志中文乱码

    在Springboot中使用logback输出日志时,中文变成了?乱码,第一反应是编码问题. 解决方法: 设置charset, 在encoder 中增加一行 UTF-8,重新启动系统,日志中中文显示正 ...

  9. SpringBoot 项目使用 SLF4J+logback 进行日志记录,来增强可维护性

    点击上方 好好学java ,选择 星标 公众号重磅资讯,干货,第一时间送达 今日推荐:推荐19个github超牛逼项目!个人原创100W +访问量博客:点击前往,查看更多 作者:云深不知处 blog. ...

最新文章

  1. Kubernetes Helm入门指南
  2. 运行shell命令并捕获输出
  3. PTA6、输出10个不重复的英文字母 (10 分)
  4. java shiro做页面显示_Java-Shiro(八):Shiro集成SpringMvc、Themeleaf,如何实现Themeleaf视图引擎下解析*.html中shiro权限验证...
  5. 徐汉字java字符_汉字徐的拼音部首-汉字徐的笔画和解释-汉字徐在线查新华字典...
  6. 保证可见性_十年程序员浅谈并发的原子性、可见性、有序性
  7. 软件工程期末设计(校园教务系统)
  8. 如何高效阅读英文数据手册?
  9. 深圳有多强?2928家专精特新中小企业 和 2.1万家高新技术企业!
  10. VUE时间范围选择的组件
  11. SQL Server Table Spool优化
  12. Error:A problem occurred configuring project ‘:app‘. > Failed to find target with hash string ‘andro
  13. InteractiveGovernor调频策略
  14. 文本溢出显示省略号,鼠标浮动查看全部内容
  15. 双线机房选择 数据中心托管需谨慎
  16. springboot预约挂号小程序毕业设计毕设作品开题报告开题答辩PPT
  17. 加息在即、螺纹需求证伪大跌,沪铝认沽涨3倍,TA09-01继续回撤2022.6.13
  18. Python将SVG转换成PNG图像
  19. 微软协助谷歌开发Chrome浏览器,高通或有参与
  20. [python][pandas] excel 批量转 csv 格式

热门文章

  1. 成为一个Java的架构师要学习哪些知识?
  2. java 抢购代码_Java生鲜电商平台-生鲜电商限时抢购功能设计与代码实战(小程序/APP)...
  3. Linux:查看时区和修改时区
  4. laya3d版本的捕鱼源码
  5. HEVC学习(二) —— HM的整体结构及一些基本概念
  6. 怎么修改服务器图片存储路径,linux服务器存储图片路径
  7. List使用stream流转成map的几种方式
  8. POI操作word填充数据,合并多个word为一个,遇到一些问题的解决
  9. Android Studio 实现四则运算+平方开方简易计算器
  10. node+express+http-proxy-middleware代理转发