首先,推荐一篇优秀的介绍slf4j的优秀文章 https://juejin.im/post/5c7e2445f265da2de71370f2
springboot的默认日志依赖为slf4j+logback,本文也是主要讲slf4j+logback
本文的特点是会举很多通俗易懂的例子,让大家通过例子来学习使用slf4j。
刚刚接触slf4j,对这个名词的全称惊到了,Simple Logging Facade for Java,简称SLF4J。翻译为 简单的日志Facade对于java,就是说明这个日志依赖是为java而生的。
相信很多人听说过slf4j,log4j,logback,JDK Logging等跟日志框架有关的词语,所以这里也简单介绍下他们之间的关系。
首先slf4j可以理解为规则的制定者,是一个抽象层,定义了日志相关的接口。
log4j,logback,JDK Logging都是slf4j的实现层,只是出处不同,当然使用起来也就各有千秋,这里放一张网上的图更明了的解释了他们之间的关系:
可以看到logback是直接实现的slf4j,而其他的中间还有一个适配层,至于原因也很简单,因为logback和slf4j的作者是一个人。
在Spring boot使用是非常方便的,不需要我们有什么额外的配置,因为Spring boot默认支持的就是slf4j+logback的日志框架,想要灵活的定制日志策略,只需要我们在src/main/resources下添加配置文件即可,只是默认情况下配置文件的命名需要符合以下规则:
logback.xml
logback-spring.xml
其中logback-spring.xml是官方推荐的,并且只有使用这种命名规则,才可以配置不同环境使用不同的日志策略这一功能。
随便建一个springboot项目,以下6个案例每个案例一个配置哦
注: Springboot默认日志格式
时间日期 -> 日志级别 -> 线程ID -> 分隔符 -> 线程名 -> Logger名(通常对应的是类名) -> 日志内容
1 输出到程序的同一个目录下 log/log-can.log
2 自定义日志格式
3 日志水平的level=info
4 日志大小为10m
logging.file=log/log-can.log
logging.level.root=info
logging.file.max-size=20MB
logging.pattern.console=%boldRed(%d{yyyy-MM-dd HH:mm:ss}) | %highlight(%-5level) | %boldYellow(%thread) | %boldGreen(%logger) | %boldCyan(%msg%n)
logging.pattern.file=%d{yyyy/MM/dd-HH:mm} [%thread] %-5level %logger- %msg%n
创建一个 logback-spring.xml,放置到src/main/resources下,不需要另外配置
<configuration scan="true" scanPeriod="10 seconds">
<property name="CONSOLE_LOG_PATTERN"
value="%highlight(%date{yyyy-MM-dd HH:mm:ss}) | %highlight(%-5level) | %highlight(%thread) | %highlight(%logger) | %msg%n"/>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder charset="UTF-8">
<pattern>${CONSOLE_LOG_PATTERN}pattern>
encoder>
appender>
<root level="INFO">
<appender-ref ref="CONSOLE"/>
root>
configuration>
创建一个 logback-spring.xml,放置到src/main/resources下,不需要另外配置
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<contextName>logbackcontextName>
<property name="log.path" value="log" />
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%highlight(%date{yyyy-MM-dd HH:mm:ss}) | %highlight(%-5level) | %highlight(%thread) | %highlight(%logger) | %msg%npattern>
encoder>
appender>
<appender name="file" class="ch.qos.logback.core.FileAppender">
<file>${log.path}/log-can.logfile>
<append>trueappend>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
encoder>
appender>
<root level="info">
<appender-ref ref="console" />
<appender-ref ref="file" />
root>
configuration>
创建一个 logback-spring.xml,放置到src/main/resources下,不需要另外配置
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<contextName>logbackcontextName>
<property name="log.path" value="log" />
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%highlight(%date{yyyy-MM-dd HH:mm:ss}) | %highlight(%-5level) | %highlight(%thread) | %highlight(%logger) | %msg%npattern>
encoder>
appender>
<appender name="file" class="ch.qos.logback.core.FileAppender">
<file>${log.path}/log-can.logfile>
<append>trueappend>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
encoder>
appender>
<discardingThreshold >0discardingThreshold>
<queueSize>512queueSize>
appender>
<root level="info">
<appender-ref ref="console" />
<appender-ref ref="ASYNC" />
root>
configuration>
创建一个 logback-spring.xml,放置到src/main/resources下,不需要另外配置
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<contextName>logbackcontextName>
<property name="log.path" value="log" />
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%highlight(%date{yyyy-MM-dd HH:mm:ss}) | %highlight(%-5level) | %highlight(%thread) | %highlight(%logger) | %msg%npattern>
encoder>
appender>
<appender name="ROL-FILE-LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/log-can.%d{yyyy-MM-dd}.logfileNamePattern>
<maxHistory>7maxHistory>
<totalSizeCap>1GBtotalSizeCap>
rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
encoder>
appender>
<discardingThreshold >0discardingThreshold>
<queueSize>512queueSize>
appender>
<root level="info">
<appender-ref ref="console" />
<appender-ref ref="ASYNC" />
root>
configuration>
并且会随着spring.profiles.active=dev的变化,dev时打印到控制台,prod时数据持久化到本地
创建一个 logback-spring.xml,放置到src/main/resources下,不需要另外配置
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<contextName>logbackcontextName>
<property name="log.path" value="log" />
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%highlight(%date{yyyy-MM-dd HH:mm:ss}) | %highlight(%-5level) | %highlight(%thread) | %highlight(%logger) | %msg%npattern>
encoder>
appender>
<appender name="ROL-SIZE-FILE-LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.path}/log-can.%d{yyyy-MM-dd}.%i.logfileNamePattern>
<maxFileSize>100MBmaxFileSize>
<maxHistory>7maxHistory>
<totalSizeCap>1GBtotalSizeCap>
rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFOlevel>
filter>
appender>
<discardingThreshold >0discardingThreshold>
<queueSize>512queueSize>
appender>
<springProfile name="dev">
<root level="DEBUG">
<appender-ref ref="STDOUT" />
root>
springProfile>
<springProfile name="prod">
<root level="INFO">
<appender-ref ref="ASYNC" />
root>
springProfile>
configuration>
使用slf4j+logback在application.yml可以不进行任何配置,直接在src/main/resources添加logback-spring.xml
< appender >:定义日志策略的节点,一个日志策略对应一个,一个配置文件中可以有零个或者多该节点,但一个配置文件如果没有定义至少一个,虽然程序不会报错,但就不会有任何的日志信息输出,也失去了意义,该节点有两个必要的属性:
< logger >:用来设置某个包或者类的日志打印级别,并且可以引用绑定日志策略,有三个属性:
在该节点内可以添加子节点,该节点有一个必填的属性ref,值为我们定义的节点的name属性的值。
< root >:根< logger >一个特殊的< logger >,即默认name属性为root的< logger >,因为是根< logger >,所以不存在向上传递一说,故没有additivity属性,所以该节点只有一个level属性。
介绍了根节点的三个主要的子节点,下面再介绍两个不那么重要但可以了解的子节点:
< contextName >:设置上下文名称,每个都关联到上下文,默认上下文名称为default,但可以使用设置成其他名字,用于区分不同应用程序的记录,一旦设置,不能修改,可以通过 %contextName 来打印日志上下文名称,一般来说我们不用这个属性,可有可无。
< property >:用来定义变量的节点,定义变量后,可以使${}来使用变量,两个属性,当定义了多个< appender >的时候还是很有用的: