logback.xml配置(详解)

本文深入解析Logback日志框架的配置与使用,涵盖日志级别、依赖配置、logback.xml配置细节,包括appender、logger、root节点及滚动策略,辅以实例说明。

本人学习springboot 时有学习并使用logback,就此记录logback相关知识。(持续更新)

1.简要概述一下logback相关信息

日志框架的本质工作:既是System.out.printin(“日志信息”);
日志框架的主导思想:能将日志信息进行分门别类
logback日志级别:ALL(全部)<TRACE(相关)<DEBUG(调试)<INFO(程序运行状态)<WARN(警告)<ERROR(错误)<OFF(全无)

关于logback的依赖

<!--slf4j -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.20</version>
</dependency>
<!-- logback -->
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.1.7</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-core</artifactId>
    <version>1.1.7</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-access</artifactId>
    <version>1.1.7</version>
</dependency>
2. 简要介绍默认logback.xml的配置情况

1,默认的日志输出方式是“输出在控制台上”,使用的appender是ConsoleAppender
2.默认的门限等级是DEBUG,即等级高于等于DEBUG的日志进行输出

3.logback.xml配置文件的大致框架(自定义logback.xml)
<?xml version="1.0" encoding="UTF-8" ?>
<!--configuration根节点-->
<configuration>
    <appender >
        <!--其他配置省略-->       
    </appender>
    <logger>
         <!--其他配置省略-->
    </logger>
    <root>
         <!--其他配置省略-->
    </root>
</configuration>

appender: 主要负责日志信息的输出(打印)工作
logger: 主要负责日志信息的的接受,过滤以及委托appender进行输出工作root为其父类
root: 主要负责日志信息的的接受,过滤以及委托appender进行输出工作logger为其子类

在这里插入图片描述

  • (1)cnfiguration>根节点的属性配置

scan: 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
scanPeriod: 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
debug: 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。

<configuration scan="true" scanPeriod="60 seconds" debug="false"> 
    <!--其他配置省略--> 
</configuration> 

补充资料:
标签<property>

<configuration scan="true" scanPeriod="60" debug="false">
    <property name="pattern" value="%d{HH:mm:ss.SSS} [%-5level] [%logger] %msg%n" ></property> </configuration>  

name:变量的名称,可以随意起名,但建议名字要简明直译;

value:变量的值;

在配置文件中,我们可以用 ${} 的方式来使用,将变量引入到其他节点中去。如果有多处使用相同的内容,便可使用属性变量的方式进行统一,减少很多不必要的代码;
  • (2)appender子标签的属性配置
    **name(必要):**为<appender>节点的名称
    **class(必要):**为<appender>的全限定类名,也就是日志输出目的地的处理类
    例:
<appender name = "fileErrorLog" class = "ch.qos.logback.core.rolling.RollingFileAppender"></appender>

在这里插入图片描述

<appender>下的filter和layout将在下面实例里面详细介绍时提及
<filter>:日志过滤器
<layout>: 控制日志输出格式

  • (3)<loger>子节点

详细解释:
用来设置某一个包或具体的某一个类的日志打印级别、以及指定appender。loger仅有一个name属性,一个可选的level和一个可选的addtivity属性。
可以包含零个或多个appender-ref元素,标识这个appender将会添加到这个loger

name(必要): 用来指定受此loger约束的某一个包或者具体的某一个类。
level(可选): 用来设置门限级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。 如果未设置此属性,那么当前loger将会继承上级的级别。
addtivity: 是否向上级loger传递打印信息。默认是true。同一样,可以包含零个或多个元素,标识这个appender将会添加到这个loger。
补充资料:

logger分为2种,一种是普通日志对象,另一种是根日志对象。对于大部分应用来说,只设置根日志对象即可。
在java日志系统中,无论是log4j还是logback,他们的日志对象体系都是呈现“树”的形式,根日志对象为最顶层节点,其余包或者类中的日志对象都继承于根日志节点;

对于普通日志对象来说,我们可以设置某一个包或者某一个类的日志级别,还可以单独设置日志的输出目的地;

<configuration scan="true" scanPeriod="60" debug="false">   
    <logger name="java.sql" level="debug" addtivity="true">
        <appender-ref ref="CONSOLE" />
    </logger>   
</configuration>  

name:用来指定此logger属于哪个包或者哪个类;

level:用来指定此logger的日志打印级别;

addtivity:是否向上传递日志打印信息。之前说了,logger对象呈现一个树的结构,根logger是树的顶端,下面的子logger的addtivity属性如果设置为true则会向上传递打印信息,出现日志重复打印的现象;

appender-ref:日志输出目的地,将此logger所打印的日志交给此appender;

值得注意的是,上面的例子中,如果此logger没有指定appender,而且addtivity也设置为true,那么此logger对应的日志信息只会打印一遍,是由root来完成的;但是如果addtivity设置成false,那么此logger将不会输出任何日志信息;
  • (4)root子标签

详细解释:
也是loger元素,但是它是根loger,是所有loger的上级。只有一个level属性,因为name已经被命名为"root",且已经是最上级了。

level: 用来设置门限等级
补充资料:

<root>也是日志对象中的一种,但它位于logger体系中的最顶层。当一个类中的logger对象进行打印请求时,如果配置文件中没有为该类单独指定日志对象,那么都会交给root根日志对象来完成;

<root>节点中只有一个level属性,还可以单独指定日志输除目的地<apender-ref>;

<configuration scan="true" scanPeriod="60" debug="false">   
    <root level="DEBUG">
        <appender-ref ref="CONSOLE" />
    </root>
</configuration>  
4.详细介绍appender 标签的内部结构

1.关于控制台的appender(ConsoleAppender)


 <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
		<!--name:主要用来区分不同的appender 
		class:       指定输出(打印)日志信息的全限定类名
		 ch.qos.logback.core.ConsoleAppender  //对应日志输出到控制台的appender
		 -->
     <layout class="ch.qos.logback.classic.PatternLayout">
      <!--
     Layout:  负责把事件转换成字符串,格式化的日志信息的输出(这种方式已经不被官方推荐)
     class     :全限定类名
          -->
            <pattern>
         <!-- 
         %d表示日期,格式为:yyyy-MM-dd HH:mm:ss.SSS ;
        %msg:日志消息;
        %n:换行-->
                %d-%msg%n
            </pattern>
        </layout>
    </appender>

当使用默认的logback.xml时,输出格式如下
%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
%d{HH: mm:ss.SSS}——日志输出时间 %thread——输出日志的进程名字,这在Web应用以及异步任务处理中很有用 %-5level——日志级别,并且使用5个字符靠左对齐 %logger{36}——日志输出者的名字 %msg——日志消息 %n——平台的换行符

2.把日志添加到文件的appender(FileAppender)

<file>:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。
<append>:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。
<encoder>:对记录事件进行格式化。
<prudent>:如果是 true,日志会被安全的写入文件,即使其他的FileAppender也在向此文件做写入操作,效率低,默认是 false。
例:

<appender name="FILE" class="ch.qos.logback.core.FileAppender"> 
    <file>testFile.log</file> 
    <append>true</append> 
    <encoder> 
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern> 
    </encoder> 
  </appender> 

3.滚动记录文件(RollingFileAppender){额外注解:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。}

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>e:/log.out</file>
    <!--日志存储位置-->
    <append>true</append>  
    <prudent>false</prudent>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    <!--时间滚动策略,每天生成一个.log文件-->
        <fileNamePattern>testLog-%d{yyyy-MM-dd}.log</fileNamePattern>
        <!--.log文件名称设置,例:testLog-2019-7-30.log-->
        <maxHistory>30</maxHistory>
        <!--设置最大保存时间-->
    </rollingPolicy>
    <!--下面设置输出格式-->
    <encoder>
        <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
    </encoder>
</appender>
  • <rollingPolicy>滚动策略

日志文件的滚动策略,与RollingFileAppender搭配使用,当日志文件发生变动时决定RollingFileAppender的行为;

class属性取值:TimeBasedRollingPolicy、FixedWindowRollingPolicy;

第一种:TimeBasedRollingPolicy
ch.qos.logback.core.rolling.TimeBasedRollingPolicy表示根据时间制定日志文件的滚动策略;

例:

<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    <fileNamePattern>testLog-%d{yyyy-MM-dd}.log</fileNamePattern>
    <!--可以直接指定文件存储位置
     例:D:\Documents\Desktop\日志文件夹\info.%d{yyyy-MM-dd}.log
   -->
    <maxHistory>30</maxHistory>
    <!--保存30天-->
</rollingPolicy>

第二种:FixedWindowRollingPolicy
ch.qos.logback.core.rolling.FixedWindowRollingPolicy表示如果日志文件大小超过指定范围时,会根据文件名拆分成多个文件;

例:

<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">   
   <fileNamePattern>tests.%i.log.zip</fileNamePattern>   
   <!--%i即是下标值,下面两个配置指定下标范围1~3-->
   <minIndex>1</minIndex>   
   <maxIndex>3</maxIndex>   
 </rollingPolicy>   
  • <triggeringPolicy>

日志触发器策略,常用的是日志的大小的控制,当日志达到对应的大小的时候,就会触发。生成新的日志文件。日志大小的控制配合rollingPlicy使用的时候,不同的rollingPolicy会有所不同。

ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy表示根据日志文件大小,超过制定大小会触发日志滚动;

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
      <file>test.log</file> 

      <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> 
          <fileNamePattern>tests.%i.log.zip</fileNamePattern> 
          <minIndex>1</minIndex> 
          <maxIndex>3</maxIndex> 
      </rollingPolicy> 

      <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> 
          <maxFileSize>5MB</maxFileSize> 
      </triggeringPolicy> 
      <encoder> 
         <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern> 
      </encoder> 
   </appender> 

4.异步记录日志
补充材料:

异步记录日志,内部通过使用缓存的方式来实现异步打印,将日志打印事件event放入缓存中。具体数据结构为BlockingQueue;

例子:
<appender name="FILE" class="ch.qos.logback.core.FileAppender">  
    <file>e:/log.out</file>  
    <append>true</append>  
    <prudent>false</prudent>
    <encoder>  
        <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>  
    </encoder>  
</appender> 
<appender name ="ASYNC" class= "ch.qos.logback.classic.AsyncAppender">  
    <discardingThreshold>0</discardingThreshold>  
    <queueSize>512</queueSize>  
    <appender-ref ref ="FILE"/>  
</appender>  

子节点<queueSize>:指的是BlockingQueue的队列容量大小,默认为256个;
子节点<discardingThreshold>:如果BlockingQueue中还剩余20%的容量,那么程序会丢弃TRACE、DEBUG和INFO级别的日志打印事件event,只保留WARN和ERROR级别的。为了保留所有的日志打印事件,可以将该值设置为0。

5. <encoder>

日志格式化节点,负责格式化日志信息。只负责了两件事情,第一负责将日志信息转换成字节数组,第二将字节数组写到输出流当中去;

%logger:表示输出logger名称,后面跟一个{0}表示:只输出logger最右边点符号之后的字符串;例如:com.jiaboyan.test —> test;

%d{HH:mm:ss.SSS}:表示格式化日期输出,14:06:49.812;

%line:输出执行日志请求的行号。

%thread:表示产生日志的线程名;

%level:输出日志级别;

%method:输出执行日志请求的方法名;

%class:输出日志打印类的全限定名,后面跟{0}表示,含义为全限定类名最右边点符号之后的字符串。例如:com.jiaboyan.test —> test;

%-4relative含义:符号减号“-”是左对齐 标志,接着是可选的最小宽度 修饰符,用十进制数表示。relative是输出从程序启动到创建日志记录的时间,单位是毫秒;

%msg:表示应用程序提供需要打印的日志信息;

%n:表示换行符;
以上主要是关于logback.xml文件的配置解析
关于log back中的过滤器:
此篇参考博客https://cloud.tencent.com/developer/article/1121242

下面是本人的在一实战中使用配置的logback.xml文件

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <!--控制台配置-->
    <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>
                %d-%msg%n
            </pattern>
        </layout>
    </appender>
    <!--日志文件配置-->
    <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--filter用于过滤信息-->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>DENY</onMatch>
            <onMismatch>ACCEPT</onMismatch>
        </filter>
        <encoder>
            <pattern>
               %d-%msg%n
            </pattern>
        </encoder>
        <!--TimeBasedRollingPolicy滚动策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--路径-->
            <fileNamePattern>D:\Documents\Desktop\日志文件夹\info.%d{yyyy-MM-dd}.log</fileNamePattern>
        </rollingPolicy>
    </appender>
    <appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--filter用于过滤信息-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <level>ERROR</level>
        </filter>
        <encoder>
            <pattern>
                %msg%n
            </pattern>
        </encoder>
        <!--滚动策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--路径-->
            <fileNamePattern>D:\Documents\Desktop\日志文件夹\error.%d{yyyy-MM-dd}.log</fileNamePattern>
        </rollingPolicy>
    </appender>
    <root level="info">
        <appender-ref ref="consoleLog"/>
        <appender-ref ref="fileInfoLog"/>
        <appender-ref ref="fileErrorLog"/>
    </root>
</configuration>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值