本人学习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>