欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

详解Springboot之Logback的使用学习

程序员文章站 2022-06-25 17:16:23
一、导入依赖普通项目 ch.qos.logback l...

一、导入依赖

普通项目

<dependency>
    <groupid>ch.qos.logback</groupid>
    <artifactid>logback-core</artifactid>
    <version>1.1.11</version>
</dependency>
<dependency>
    <groupid>ch.qos.logback</groupid>
    <artifactid>logback-classic</artifactid>
    <version>1.1.11</version>
</dependency>

springboot项目

<!--该依赖已经集成了logback-->
<dependency>
    <groupid>org.springframework.boot</groupid>
    <artifactid>spring-boot-starter-web</artifactid>
</dependency>

二、配置文件解析

logback默认会到类路径下找logback-test.xml and logback.xml

spring boot 会在 classpath 下查找是否有 logback-test.groovy、logback-test.xml、logback.groovy 或者 logback.xml,如果都找不到的话,才会加载项目路径下的 logback-spring.xml

三、配置文件结构

详解Springboot之Logback的使用学习

四、各个组件的作用

logger: 日志记录器,root是特殊的logger-顶层logger,因为logger具有继承关系,稍后介绍

appender: 配置日志文件输出目的地

encoder: 控制日志输出格式,它是借助于layout实现的

rollingpolicy: rollingfileappender具有该子元素,指定发生滚动时的行为

triggeringpolicy: rollingfileappender具有该子元素,指定何时发生滚动过程,一般不用配置该元素,因为最受欢迎的timebasedrollingpolicy ,它实现了rolling policy同时也实现了triggering policy。

filter: 对appender收到的日志进行过滤,只有满足filter条件的日志才输出到日志文件

五、logger组件

logger组件具有父子层级关系,root是最顶层的logger。logger记录器是命名实体。它们的名称区分大小写,并且遵循分层命名规则.

如果一个记录器的名称后跟一个点,则该记录器是另一个记录器的祖先,该后跟点的名称是其后代记录器名称的前缀。如果记录器与子记录器之间没有祖先,则称该记录器为子记录器的父项。
例如,名为"com.foo"的记录器是名为"com.foo.bar"的记录器的父项。同样, "java"是"java.util"和"java.util.vector"的祖先记录器。大多数开发人员都应该熟悉这种命名方案。

logger日志级别继承

如果未为给定的记录器分配一个级别,则它将从其最接近的祖先那里继承一个已分配的级别。例如:
给定记录器l的有效级别等于其层次结构中的第一个非空级别,从l本身开始, 然后在层次结构中向上寻找直到root logger。为了确保所有记录器最终都可以继承级别,root logger始终具有分配的级别,root logger默认级别是debug。

注意:如果日志记录请求的级别高于或等于记录器的有效级别,则该日志请求是有效的。日志级别按以下顺序排序: trace < debug < info < warn < error。

logger关联的appender继承

一个logger可以配置多个appender,logger输出的日志会输出到当前记录器绑定的appender和父级们logger(直到root logger)绑定的appender,可以设置additivity 属性为false,则logger输出的日志仅会输出到当前记录器绑定的appender

六、logger属性

  • name:指定全限定包名
  • level:日志输出级别,如果没有配置,则参考上面的级别继承
  • additivity:默认为true,参考上面的appender继承。

如果additivity为true,会存在重复输出日志情况,如下所示

<configuration>
  <appender name="stdout" class="ch.qos.logback.core.consoleappender">
    <encoder>
      <pattern>%d{hh:mm:ss.sss} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>
  <logger name="chapters.configuration">
    <appender-ref ref="stdout" />
  </logger>
  <root level="debug">
    <appender-ref ref="stdout" />
  </root>
</configuration>

那么chapters.configuration包下的日志会输出两遍到console控制台,如下所示

14:25:36.343 [main] info  chapters.configuration.myapp3 - entering application.
14:25:36.343 [main] info  chapters.configuration.myapp3 - entering application.
14:25:36.359 [main] debug chapters.configuration.foo - did it again!
14:25:36.359 [main] debug chapters.configuration.foo - did it again!
14:25:36.359 [main] info  chapters.configuration.myapp3 - exiting application.
14:25:36.359 [main] info  chapters.configuration.myapp3 - exiting application.

七、appender组件

配置日志输出的目的地,常用的有consoleappender、fileappender 、rollingfileappender

consoleappender

 <appender name="stdout" class="ch.qos.logback.core.consoleappender">
    <!--默认system.out,也可以指定system.error -->
    <target>system.out</target>
    <!-- encoders 默认类型ch.qos.logback.classic.encoder.patternlayoutencoder -->
    <encoder>
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
    </encoder>
  </appender>

写日志到标准输出流,可以配置target属性为system.out,也可以指定system.error,默认system.out

fileappender

包含的子元素有

  • append:如果为true,则追加到已存在的日志文件,否则截断现有文件,默认为true
  • file: 指定日志写入文件的名字。如果文件不存在,则创建包括父级目录。windows系统要避开“\”,正确例子可以指定为c:/temp/test.log或c:\\temp\\test.log
  • encoder: 输出的格式 rollingfileappender

rollingfileappender

扩展了fileappender,具有滚动更新日志文件的功能;例如,rollingfileappender可以登录到一个名为log.txt的文件,一旦满足某个条件,就可以保存当前日志文件,并滚动输出到新的日志文件。

包含的子元素有

  • append:如果为true,则追加到已存在的日志文件,否则截断现有文件,默认为true
  • file: 指定日志写入文件的名字。如果文件不存在,则创建包括父级目录。windows系统要避开“\”,正确例子可以指定为c:/temp/test.log或c:\\temp\\test.log
  • encoder:输出的格式
  • rollingpolicy: 指定rollingfileappender发生滚动时的行为
  • triggeringpolicy:指定rollingfileappender何时发生滚动过程

 rollingpolicy

rollingpolicy常用的有timebasedrollingpolicy、sizeandtimebasedrollingpolicy

timebasedrollingpolicy

timebasedrollingpolicy是最受欢迎的滚动策略。它基于时间进行滚动,可以是按月或按天等。timebasedrollingpolicy承担滚动以及触发所述滚动的责任。它实现了rolling policy同时也实现了triggering policy。
包含的子元素有

  • filenamepattern:必选;它的值应包括文件名以及适当放置的%d转换说明符。所述 %d由指定的转换说明可包含日期和时间模式 java.text.simpledateformat类。如果省略了日期和时间模式,则采用默认模式 yyyy-mm-dd;可以指定多个%d,但是只有一个主要的,其他的都要使用‘aux'标记,多个%d允许你组织对日志文件归类,例如按照年月分文件夹/var/log/%d{yyyy/mm, aux}/myapplication.%d{yyyy-mm-dd}.log
  • maxhistory:设置存档文件保存时间,日志文件至少保存 15 天,因为有些异常具备以“周”为频次发生的特点。
  • totalsizecap:控制归档文件的大小

sizeandtimebasedrollingpolicy

支持按照时间拆分后,再按文件大小拆分

<appender name="rolling" class="ch.qos.logback.core.rolling.rollingfileappender">
    <file>mylog.txt</file>
    <rollingpolicy class="ch.qos.logback.core.rolling.sizeandtimebasedrollingpolicy">
      <!-- rollover daily -->
      <filenamepattern>mylog-%d{yyyy-mm-dd}.%i.txt</filenamepattern>
       <!-- each file should be at most 100mb, keep 60 days worth of history, but at most 			20gb -->
       <maxfilesize>100mb</maxfilesize>    
       <maxhistory>60</maxhistory>
       <totalsizecap>20gb</totalsizecap>
    </rollingpolicy>
    <encoder>
      <pattern>%msg%n</pattern>
    </encoder>
</appender>

"%i"表示当日志文件达到“maxfilesize”它将按照递增序列(以0开始)归档日志。

triggering policy

sizebasedtriggeringpolicy

该triggering policy通过配置一个maxfilesize参数,当日志文件超过该阈值,会通知rollingfileappender 触发日志翻滚。但一般triggering policy可以不用配置,timebasedrollingpolicy 已经完美集成了。

补充:以上appender都是本地记录日志,logback也支持网络输出日志、本地数据、邮件等;后续如果有需要再来研究。logback还可以使用asyncappender异步记录日志。

encoder

encoder负责转换事件为字节数组并将字节数组写入输出流中。patternlayoutencoder 是最常用的encoder,该类通过使用patternlayout来格式化日志事件。我们可以直接配置patternlayoutencoder ,而不用配置patternlayout,它默认使用patternlayout进行格式输出。

layout

负责转换事件成字符串,我们可以自定义layout,然后通过encoder引用

 <encoder class="ch.qos.logback.core.encoder.layoutwrappingencoder">
      <layout class="chapters.layouts.mysamplelayout" />
    </encoder>

patternlayout

它将日志事件转换成字符串,但是可以自定义字符串通过调整patternlayout的转换模式。

patternlayout的转换模式跟c语言的printf()函数紧密相关。
常用的模式有:

% d{pattern}: 日期

% level 日志级别

%thread 线程名称

%class 全限定类名,日志请求记录所在的类

%method 日志请求记录所在的方法

%line 日志请求记录的行号

%n 换行

%logger{length} 输出日志logger记录器的名字,length指定输出名字长度,logback会智能缩写而不丢失语义。

%msg 输出日志记录器记录的消息

<encoder class="ch.qos.logback.classic.encoder.patternlayoutencoder">
    <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
    <pattern>%d{yyyy-mm-dd hh:mm:ss.sss,ctt} %-5level [%thread] [%class:%line] %logger{50} - %msg%n</pattern>
</encoder>

多个模式之间分隔符,在大多数情况下,文字需包含空格或其他分隔字符('[',']','-'),这样就不会与转换词混淆

filter

对appender收到的日志调用decide方法进行过滤,只有满足filter条件的日志才输出到日志文件,decide方法有三个返回值,deny、accept、neutral

  • 如果返回的值为deny,则立即删除日志事件,而不咨询其余的筛选器;
  • 如果返回的值是neutral中性的,则查询列表中的下一个筛选器,如果没有其他筛选器可供查询,则日志事件将正常处理;
  • 如果返回值为accept,则会立即处理日志事件,跳过其余筛选器的调用。

 levelfilter

该过滤器对日志的级别过滤,如果事件日志级别等于配置的级别,过滤器接受或者拒绝该事件日志,依赖于onmatch 和 onmismatch属性

<appender name="console" class="ch.qos.logback.core.consoleappender">
    <filter class="ch.qos.logback.classic.filter.levelfilter">
      <level>info</level>
      <onmatch>accept</onmatch>
      <onmismatch>deny</onmismatch>
    </filter>
    <encoder>
      <pattern>
        %-4relative [%thread] %-5level %logger{30} - %msg%n
      </pattern>
    </encoder>
</appender>

thresholdfilter

过滤低于指定阈值的事件。对于等于或高于阈值的事件,将在调用其()方法时响应neutral 。但是,级别低于阈值的事件将被拒绝。

 <!-- deny all events with a level below info, that is trace and debug -->
    <filter class="ch.qos.logback.classic.filter.thresholdfilter">
      <level>info</level>
    </filter>

evaluatorfilter

evaluatorfilter 是封装了的通用过滤器 eventevaluator。顾名思义, 评估对象是否满足给定事件的给定条件。在匹配和不匹配时,托管将分别返回由onmatch 或onmismatch属性指定的值。
geventevaluator 实现了eventevaluator,通过子元素采用任意groovy语言布尔表达式作为评估标准的具体实现
janinoeventevaluator实现了eventevaluator,通过子元素采用任意java语言块返回布尔值作为评估标准。

uatorfilter

evaluatorfilter 是封装了的通用过滤器 eventevaluator。顾名思义, 评估对象是否满足给定事件的给定条件。在匹配和不匹配时,托管将分别返回由onmatch 或onmismatch属性指定的值。
geventevaluator 实现了eventevaluator,通过子元素采用任意groovy语言布尔表达式作为评估标准的具体实现
janinoeventevaluator实现了eventevaluator,通过子元素采用任意java语言块返回布尔值作为评估标准。

evaluatorfilter 也可通过子元素支持正则匹配。

到此这篇关于详解springboot之logback的使用学习的文章就介绍到这了,更多相关logback详解内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

相关标签: Springboot Logback