springboot使⽤logback⽇志框架超详细教程
前⾔
项⽬中⽇志系统是必不可少的,⽬前⽐较流⾏的⽇志框架有log4j、logback等,可能⼤家还不知道,这两个框架的作者是同⼀个
⼈,Logback旨在作为流⾏的log4j项⽬的后续版本,从⽽恢复log4j离开的位置。另外 slf4j(Simple Logging Facade for Java) 则是⼀个⽇志门⾯框架,提供了⽇志系统中常⽤的接⼝,logback 和 log4j 则对slf4j 进⾏了实现。我们本⽂将讲述如何在spring boot 中应⽤logback+slf4j实现⽇志的记录。
为什么使⽤logback
1. 是log4j 框架的作者开发的新⼀代⽇志框架,它效率更⾼、能够适应诸多的运⾏环境,同时天然⽀持SLF4J
2. Logback的定制性更加灵活,同时也是spring boot的内置⽇志框架
开始使⽤
⼀:添加依赖:maven依赖中添加了spring-boot-starter-logging
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
但是呢,实际开发中我们不需要直接添加该依赖,你会发现spring-boot-starter其中包含了 spring-boot-starter-logging,该依赖内容就是 Spring Boot 默认的⽇志框架 Logback+SLF4J。⽽ spring-boot-starter-web 包含了spring-boot-starte,所以我们只需要引⼊web 组件即可:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
⼆:默认配置:默认情况下Spring Boot将⽇志输出到控制台,不会写到⽇志⽂件。如果要编写除控制
台输出之外的⽇志⽂件,则需在application.properties中设置logging.file或logging.path属性
注:⼆者不能同时使⽤,如若同时使⽤,则只有logging.file⽣效
logging.file=⽂件名
logging.path=⽇志⽂件路径
logging.level.包名=指定包下的⽇志级别
sole=⽇志打印规则
logging.file,设置⽂件,可以是绝对路径,也可以是相对路径。如:logging.file=my.log
logging.path,设置⽬录,会在该⽬录下创建spring.log⽂件,并写⼊⽇志内容,如:logging.path=/var/log
注:⼆者不能同时使⽤,如若同时使⽤,则只有logging.file⽣效,可以看到这种⽅式配置简单,但是能实现的功能也⾮常有限,如果想要更复杂的需求,就需要下⾯的定制化配置了。
三:l详解
Spring Boot官⽅推荐优先使⽤带有-spring的⽂件名作为你的⽇志配置(如使⽤l,⽽不是l),命名为l的⽇志配置⽂件,将xml放⾄ src/main/resource下⾯。
也可以使⽤⾃定义的名称,⽐如l,只需要在application.properties⽂件中使⽤
在讲解 l之前我们先来了解三个单词:Logger, Appenders and Layouts(记录器、附加器、布局):Logback基于三个主要类:Logger,Appender和Layout。 这三种类型的组件协同⼯作,使开发⼈员能够根据消息类型和级别记录消息,并在运⾏时控制这些消息的格式以及报告的位置。⾸先给出⼀个基本的xml配置如下:
<configuration>
<appender name="STDOUT" class="ch.ConsoleAppender">
<!-- encoders are assigned the type
ch.qos.der.PatternLayoutEncoder by default -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<logger name="figuration" level="INFO"/>
<!-- Strictly speaking, the level attribute is not necessary since -->
<!-- the level of the root level is set to DEBUG by default. -->
<root level="DEBUG">
<appender-ref ref="STDOUT" />
</root>
</configuration>
3.1:<configuration>元素
3.2:<logger>元素
<logger>元素只接受⼀个必需的name属性,⼀个可选的level属性和⼀个可选的additivity属性,允许值为true或false。 level属性的值允许⼀个不区分⼤⼩写的字符串值TRACE,DEBUG,INFO,WARN,ERROR,ALL或OFF。特殊于⼤⼩写不敏感的值INHERITED或其同义词NULL将强制记录器的级别从层次结构中的较⾼级别继承,<logger>元素可以包含零个或多个<appender-ref>元素; 这样引⽤的每个appender都被添加到指定的logger中,(注:additivity属性下⾯详说),logger元素级别具有继承性。
例1:⽰例中,仅为根记录器分配了级别。 此级别值DEBUG由其他记录器X,X.Y和X.Y.Z继承
Logger name Assigned level Effective level
root DEBUG DEBUG
X none DEBUG
X.Y none DEBUG
X.Y.Z none DEBUG
例2:所有记录器都有⼀个指定的级别值。 级别继承不起作⽤
Logger name Assigned level Effective level
root ERROR ERROR
X INFO INFO
X.Y DEBUG DEBUG
X.Y.Z WARN WARN
例3:记录器root,X和X.Y.Z分别被分配了DEBUG,INFO和ERROR级别。 Logger X.Y从其⽗X继承其级别值。
Logger name Assigned level Effective level
root DEBUG DEBUG
X INFO INFO
X.Y none INFO
X.Y.Z ERROR ERROR
例4:在⽰例4中,记录器root和X分别被分配了DEBUG和INFO级别。 记录器X.Y和X.Y.Z从其最近的⽗X继承其级别值,该⽗级具有指定的级别。
Logger name Assigned level Effective level
root DEBUG DEBUG
X INFO INFO
X.Y none INFO
X.Y.Z none INFO
3.3:<root>元素
<root>元素配置根记录器。 它⽀持单个属性,即level属性。 它不允许任何其他属性,因为additivity标志不适⽤于根记录器。 此外,由于根记录器已被命名为“ROOT”,因此它也不允许使⽤name属性。 level属性的值可以是不区分⼤⼩写的字符串
TRACE,DEBUG,INFO,WARN,ERROR,ALL或OFF之⼀<root>元素可以包含零个或多个<appender-ref>元素; 这样引⽤的每个appender都被添加到根记录器中(注:additivity属性下⾯详说)。
3.4:<appender>元素
appender使⽤<appender>元素配置,该元素采⽤两个必需属性name和class。 name属性指定appender的名称,⽽class属性指定要实例化的appender类的完全限定名称。 <appender>元素可以包含零个或⼀个<layout>元素,零个或多个<encoder>元素以及零个或多个<filter>元素,下图说明了常见的结构:
重要:在logback中,输出⽬标称为appender,addAppender⽅法将appender添加到给定的记录器logger。给定记录器的每个启⽤的⽇志记录请求都将转发到该记录器中的所有appender以及层次结构中较⾼的appender。换句话说,appender是从记录器层次结构中附加地继承的。例如,如果将控制台appender添加到根记录器,则所有启⽤的⽇志记录请求将⾄少在控制台上打印。如果另外将⽂件追加器添加到记录器(例如L),则对L和L的⼦项启⽤的记录请求将打印在⽂件和控制台上。通过将记录器的additivity标志设置为false,可以覆盖此默认⾏为,以便不再添加appender累积。
Appender是⼀个接⼝,它有许多⼦接⼝和实现类,具体如下图所⽰:
其中最重要的两个Appender为:ConsoleAppender 、RollingFileAppender。
3.4.1:ConsoleAppender
ConsoleAppender,如名称所⽰,将⽇志输出到控制台上。
3.4.2:RollingFileAppender
RollingFileAppender,是FileAppender的⼀个⼦类,扩展了FileAppender,具有翻转⽇志⽂件的功能。 例如,RollingFileAppender 可以记录到名为⽂件的⽂件,并且⼀旦满⾜某个条件,就将其⽇志记录⽬标更改为另⼀个⽂件。
有两个与RollingFileAppender交互的重要⼦组件。 第⼀个RollingFileAppender⼦组件,即 RollingPolicy 负责执⾏翻转所需的操作。RollingFileAppender的第⼆个⼦组件,即 TriggeringPolicy 将确定是否以及何时发⽣翻转。 因此,RollingPolicy 负责什么和TriggeringPolicy 负责什么时候。
作为任何⽤途,RollingFileAppender 必须同时设置 RollingPolicy 和 TriggeringPolicy。 但是,如果其 RollingPolicy 也实现了TriggeringPolicy 接⼝,则只需要显式指定前者。
3.4.3:滚动策略
TimeBasedRollingPolicy:可能是最受欢迎的滚动策略。 它根据时间定义翻转策略,例如按天或按⽉。 TimeBasedRollingPolicy承担滚动和触发所述翻转的责任。 实际上,TimeBasedTriggeringPolicy实现了RollingPolicy和TriggeringPolicy接⼝。
SizeAndTimeBasedRollingPolicy:有时您可能希望按⽇期归档⽂件,但同时限制每个⽇志⽂件的⼤⼩,特别是如果后处理⼯具对⽇志⽂件施加⼤⼩限制。 为了满⾜此要求,logback 提供了 SizeAndTimeBasedRollingPolicy ,它是TimeBasedRollingPolicy的⼀个⼦类,实现了基于时间和⽇志⽂件⼤⼩的翻滚策略。
3.5:<encoder>元素
encoder中最重要就是pattern属性,它负责控制输出⽇志的格式,这⾥给出⼀个我⾃⼰写的⽰例:springboot框架的作用
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight(%-5level) --- [%15.15(%thread)] %cyan(%-40.40(%logger{40})) : %msg%n</pattern>
使⽤后的输出格式如下图所⽰
其中:%d{yyyy-MM-dd HH:mm:ss.SSS}:⽇期
%-5level:⽇志级别
%highlight():颜⾊,info为蓝⾊,warn为浅红,error为加粗红,debug为⿊⾊
%thread:打印⽇志的线程
%15.15():如果记录的线程字符长度⼩于15(第⼀个)则⽤空格在左侧补齐,如果字符长度⼤于15(第⼆个),则从开头开始截断多余的字符
%logger:⽇志输出的类名
%-40.40():如果记录的logger字符长度⼩于40(第⼀个)则⽤空格在右侧补齐,如果字符长度⼤于40(第
⼆个),则从开头开始截断多余的字符
%cyan:颜⾊
%msg:⽇志输出内容
%n:换⾏符
3.6:<filter>元素
filter中最重要的两个过滤器为:LevelFilter、ThresholdFilter。
LevelFilter 根据精确的级别匹配过滤事件。 如果事件的级别等于配置的级别,则筛选器接受或拒绝该事件,具体取决于onMatch和onMismatch属性的配置。 例如下⾯配置将只打印INFO级别的⽇志,其余的全部禁⽌打印输出:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论