本文初衷为自己学习logback总结,参考书籍为陈华翻译的《logback中文手册》。
笔友愿意奉献积分的,可到优快云下载:
https://download.youkuaiyun.com/download/smarttxp/11097957下载,积分为系统设置,知道怎么修改设置的请留言,谢谢。
没有积分的可到我的网盘下载:
链接:https://pan.baidu.com/s/1OQ9VDIzM9qOST5_aFCU53Q 提取码:j7pk
言归正传,本文将从三个方面阐述个人学习logback的开发知识。如果想更系统学习,可阅读 logback_中文手册(译者陈华)
一、级别继承性、基本选择规则 、Appender叠加性
-
有效级别(Level)即级别继承
1)命名层次
Logger 是命名了的实体。它们的名字大小写敏感且遵从下面的层次化的命名规则:
如果 logger的名称带上一个点号后是另外一个 logger的名称的前缀,那么,前者就被 称为后者的祖先。如果 logger与其后代 logger之间没有其他祖先,那么,前者就被称为子 logger 之父。
2)有效级别(Level)即级别继承
- logger L的有效级别等于其层次等级里的第一个非 null 级别,顺序是从 L开始,向上 直至根 logger。
- 举例:L级别为debug,不管父类为啥级别,L的有效级别就是debug
L级别为null,第一个追溯到的父类级别为trace,则L的有效级别就是trace,不管再往上的父类是啥级别。
- 举例:L级别为debug,不管父类为啥级别,L的有效级别就是debug
- 为确保所有 logger 都能够最终继承一个级别,根 logger 总是有级别,默认情况下,这 个级别是 DEBUG。
3) 打印方法和基本选择规则
- 打印方法:根据定义,打印方法决定记录请求的级别。例如,如果 L 是一个 logger 实例,那么, 语句 L.info("..")是一条级别为 INFO 的记录语句。
- 基本选择规则 :记录请求级别为 p,其 logger的有效级别为 q,只有则当 p>=q时,该请求才会被执行。
该规则是 logback 的核心。级别排序为:TRACE < DEBUG < INFO < WARN < ERROR。
4)Appender叠加性
- appender 叠加性:Logger L的记录语句的输出会发送给 L及其祖先的全部 appender。
- additivity 属性能够中断叠加性:如果 logger L的某个祖先 P设置叠加性标识(additivity 属性)为 false,那么,L的输出会发送给L 与 P 之间(含 P)的所有 appender,但不会发送给 P 的任何祖先的 appender。
- additivity 默认为true:Logger 的叠加性默认为 true
综上所述,对于某个logger对象:
- 第一步:确认logger对象的有效级别(级别继承规则),
- 第二步:根据appender叠加性看logger有哪些日志组件
- 第三步:根据基本选择规则确定哪个日志组件生效(打印级别和有效级别比较,跟appender所关联的logger 的级别无关)
- 如上图所示,root(根logger)是error级别,组件为file,com.example.demo这个logger的级别为trace,组件为控制台输出。根据上述步骤:demo的有效级别为trace,组件为file和stdout(appender的name属性为stdout,类型是控制台输出组件),
- 打印为trace,和有效级别trace为相等关系,因此执行两个组件,在控制台和文件中都生效了
- 附原文:
- 注意,基本选择规则依赖于被调用的logger的有效级别,而不是 appender所关联的logger 的级别。Logback 首先判断记录语句是否被启用,如果启用,则调用logger 等级里的appender, 无视 logger 的级别。配置文件 sample4.xml 演示了这一点
二、配置文件详解
-
Configuration标签,根标签 属性: scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。 scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。 当scan为true时,此属性生效。默认的时间间隔为1分钟。 單位: milliseconds、seconds、minutes 和 hours debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
<configuration scan="true" scanPeriod="60 seconds" debug="false"> </configuration>
-
appender标签,日志组件 属性: name:指定appender名称,必须 class:指定appender的全限定名,必须 appender组件分类: ConsoleAppender:控制台组件类,全类名:ch.qos.logback.core.ConsoleAppender FileAppender:文件输出组件类,全类名:ch.qos.logback.core.FileAppender RollingFileAppender:滚动输出组件,全类名:ch.qos.logback.core.RollingFileAppender
-
logger标签,日志对象 属性: name:logger对象名称,一般为包名,必须 level:可选值:TRACE、DEBUG、INFO、WARN、ERROR、ALL 和 OFF,可不选,若设置为null或者INHERITED表示强制继承父级级别 additivity:控制appender的叠加性,默认为true 注意:<logger>元素可以包含零个或多个<appender-ref>元素,表示这个 appender 会被添加到该 logger。强调一下,每个用<logger>元素声明的 logger,首先会移除所有 appender,然后才添加引用了的 appender,所以如果 logger 没有引用任何 appender,就会失去所有 appender。
-
root标签,根日志对象 属性: level:可不选,默认为debug 注意:Level 属性的值大小写无关,其值为下面其中一个字符串:TRACE、DEBUG、INFO、 WARN、ERROR、ALL 和 OFF。注意不能设置为“INHERITED” 或“NULL”。<logger>元素可以包含零个或多个<appender-ref>元素。与<logger>元素类似,声明<root>元素后,会先关闭然后移除全部当前 appender,只引用声明了的 appender。如果 root 元素没有引用任何 appender,就会失去所有appender。
-
其他标签 contextName标签,设置日志上下文名称,可以用来区分不同应用程序的日志,将%contextName 放入日志格式即可 <contextName>myAppName</contextName> property标签,用来设置常量值,以便后面用作变量替换,替换是使用${},下面例子即为:${USER_HOME} <property name="USER_HOME" value="/home/sebastien" /> timestamp标签:获取当前系统时间,datePattern属性为日期格式,遵循java.text.SimpleDateFormat 里的约定 <timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss" /> maxFileSize 单位 bytes、KB、MB 或 GB include标签,文件包含
案例:下面通过实际案例来配置常用的appender
控制台打印
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!--ConsoleAppender为控制台输出打印-->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!--设置输出格式-->
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
</encoder>
<target>System.out</target>
</appender>
<!--设置根logger-->
<root level="TRACE">
<appender-ref ref="STDOUT" />
</root>
<!--com.example.demo为包名-->
<logger name="com.example.demo" level="DEBUG">
<appender-ref ref="STDOUT" />
</logger>
</configuration>
文件输出
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<!-- <file>C:\Users\pc\Desktop\笔记\testFile.log</file>-->绝对路径
<file>../testFile.log</file> <!--相对目录下生成日志文件,./:src同级目录下 ../:src上级的同级目录-->
<append>true</append> //默认为true
<!--prudent标签是是否安全写入,默认false,开启时是非开启状态三倍的性能消耗-->
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
滚动输出
概念:
RollingFileAppender 能先记录到文件“log.txt”,然后当符合某个条件时,变成记录到其他文件。
窗口滚动 FixedWindowRollingPolicy
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<contextName>myApp</contextName>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>testFile.log</file>
<!--滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>testFile.%i.log.zip</fileNamePattern>
<minIndex>1</minIndex>
<!--最大值为12,超过会默认设置为12-->
<maxIndex>3</maxIndex>
</rollingPolicy>
<!--滚动条件-->
<triggeringPolicy
class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>1M</maxFileSize>
</triggeringPolicy>
<encoder>
<pattern>%contextName %-4relative [%thread] %-5level %logger{35} - %msg%n
</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="FILE" />
</root>
</configuration>
过程示例:
时间滚动 TimeBasedRollingPolicy
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logFile.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 按每天归档 -->
<fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 保存30个周期日志,如果是每月归档就是30个月 -->
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%contextName %-4relative [%thread] %-5level %logger{35} - %msg%n
</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="FILE" />
</root>
</configuration>
时间和文件大小滚动 SizeAndTimeBasedFNATP
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>mylog.txt</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 按天滚动 -->
<fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- 设置文件大小 -->
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--设置保存的最大周期数-->
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%contextName %-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
<root level="debug">
<appender-ref ref="ROLLING" />
</root>
</configuration>
三、spring boot 配置logback
使用时,将配置文件命名为 logback-spring.xml、logback.groovy、logback.xml;三者的加载顺序也是依次类推
四、不同包下日志输出到不同位置
只要设置不同的logger和appender即可,此处不再赘述
综上为个人总结,参考自logback_中文手册(译者陈华),想更系统学习logback,可下载学习,如有错误,请批评指正。