文章目录
Logback简介
- Logback与Log4j是同一作者作品,完美继承了Log4j的优点并补足了Log4j的不足。
- Logback完美适用于不同的运行环境。
- Logback与SLF4J是同一作者,因此其天然的结合SLF4J框架。
- Logback实现了对于Tomcat、Jetty等服务器的集成,提供了HTTP访问日志的功能。
- Logback可以让开发人员很方便在其基础上搭建自己的模块。
Logback的组成
Logback由三个模块构成:
- logback-core:Logback核心包,开发人员可以以此为基础搭建自身模块。
- logback-classic:Logback对于SLF4J的实现
- logback-access:与Servlet容器的集成,实现HTTP访问日志的功能。
Logback与Log4j
前文说过Logback完美继承了Log4j,所以Logback基础使用方面与Log4j相同,如日志等级、三大组件等等,本文在此不再详述,请查看我的博文日志框架之Log4j。
Logback本质上是一个优化后的Log4j,但相比于Log4j有太多的有点,官方列举Logback具有以下几点优势1:
- 更快的实施:Logback重写了Log4j内部实现,在关键路径提升了十倍速度,减少了内存损耗。
- 更广泛的测试:Logback比Log4j进行了更长时间、更高级别的测试。
- 与SLF4J的完美结合.
- 更广泛的文档:Logback具有更详细并且不断更新的文档。
- Logback从0.9.22版本开始同时支持XML与Groovy语法的配置文件。
- Logback可以自动扫描并加载修改后的配置文件,并且不启用新的线程资源。
- Logback在I/O失败的情况下,不需要重新应用即可在server正常后恢复正常输出。
- Logback通过对于maxHistory属性的设置可以自动删除旧的日志文件。
- Logback的RollingFileAppender可以异步的对旧的日志文档进行压缩。
- Logback的谨慎模式下多个FileAppender可以写入同一个日志文件。
- Logback具有Lilith可以查看大数据量级的日志与访问事件查看器工具。
- Logback配置文件中支持条件判断语句的写法,从而实现不同环境个别配置自动替换。
- Logback中支持对于特定用户显示较低与配置日志等级的日志。
- Logback提供了可以通过给定的属性对日志进行分离的SiftingAppender
- Logback的异常堆栈信息将会打印出相应包的信息。
- Logback的Logback-access提供了HTTP访问日志功能。
Logback组件
logger context
各个logger 都被关联到一个 LoggerContext,LoggerContext负责制造logger,也负责以树结构排列各 logger。其他所有logger也通过org.slf4j.LoggerFactory 类的静态方法getLogger取得。 getLogger方法以 logger 名称为参数。用同一名字调用LoggerFactory.getLogger 方法所得到的永远都是同一个logger对象的引用。
Appender
Logback对于Appender进行了一定的优化改进,我在这里讲几个常用的:
ConsoleAppender
示例:
<!-- consoleAppender:控制台输出 -->
<appender name="STDOUT"
class="ch.qos.logback.core.ConsoleAppender">
<!-- encoder:对日志日期格式化,类似于layout,除了将时间转化为数组,还会将转换后的数组输出到相应的文件中 -->
<encoder>
<!-- 定义日志的输出格式 -->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}-%msg%n</pattern>
<!-- 设置信息编码 -->
<charset>UTF-8</charset>
</encoder>
</appender>
新增标签:
encoder:对日志日期格式化,类似于layout,除了将时间转化为数组,还会将转换后的数组输出到相应的文件中.
RollingFileAppender
- rollingPolicy:
当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名
- FixedWindowRollingPolicy:
- TimeBasedRollingPolicy。
- triggeringPolicy:
告知 RollingFileAppender 合适激活滚动。
- prudent:
当为true时,不支持FixedWindowRollingPolicy。支持TimeBasedRollingPolicy,但是有两个限制,1不支持也不允许文件压缩,2不能设置file属性,必须留空。日志会被安全的写入文件,即使其他的FileAppender也在向此文件做写入操作,效率低。
Filter
<!-- 过滤器,过滤掉不是指定日志水平的日志 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 设置日志级别 -->
<level>DEBUG</level>
<!-- 如果跟该日志水平相匹配,则接受 -->
<onMatch>ACCEPT</onMatch>
<!-- 如果跟该日志水平不匹配,则过滤掉 -->
<onMismatch>DENY</onMismatch>
</filter>
- level: 输出消息级别
- onMatch:符合限制条件
- onMismatch:不符合限制条件
onMatch和onMismatch的值:
- ACCEPT:打印
- DENY:中立
- NEUTRAL:中立
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 设置过滤级别 -->
<level>ERROR</level>
<!-- 用于配置符合过滤条件的操作 -->
<onMatch>ACCEPT</onMatch>
<!-- 用于配置不符合过滤条件的操作 -->
<onMismatch>DENY</onMismatch>
</filter>
Logback配置文件加载
Logback的配置文件名有两种:
logback-test.xml
logback.groovy
logback.xml
与Log4j相同,其首先会在classpath下搜寻配置文件,但在搜寻不到的情况下Logback会自动调用BasicConfigurator默认配置,输出到控制台。
Logback配置文件详解
<?xml version="1.0" encoding="UTF-8"?>
<!--
scan属性:默认为true,Logback将会扫描配置文件,如果配置文件发生改变时,会自动加载
scanPeriod:Logback扫描配置文件时间间隔,默认单位为毫秒,可配置单位为毫秒、秒、分、时 milliseconds, seconds, minutes or hours
debug:默认为false,是否打印Logback内部信息,当为true时可以查看Logback的运行信息
packagingData:默认false,在打印异常堆栈时是否打印相关包信息
-->
<configuration
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://www.padual.com/java/logback.xsd"
scan="true" scanPeriod="60 seconds" debug="false" packagingData="true">
<!-- 定义参数变量 -->
<property name="APP_NAM" value="logback_demo" />
<!-- 日志级别参数 -->
<property name="log.level" value="debug" />
<!-- 文件保留时间 -->
<property name="log.maxHistory" value="30" />
<!-- 文件大小 -->
<property name="log.maxSize" value="4MB"/>
<!-- 日志文件是否覆盖 -->
<property name="log.append" value="true"/>
<!-- 日志输出编码 -->
<property name="log.encode" value="UTF-8" />
<!-- 日志存储路径 -->
<property name="log.filePath" value="F:/logs" />
<!-- 日志的显式格式 -->
<property name="log.pattern"
value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}-%msg%n"></property>
<!--配置logger上下文名称,默认名称为default,用于区分不同应用程序的日志记录-->
<contextName>${APP_NAM}</contextName>
<!--获取时间戳字符串 key为名称 datePattern为将解析配置文件的时间作为当前时间格式化的标准-->
<timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"/>
<!-- consoleAppender:控制台输出 -->
<appender name="STDOUT"
class="ch.qos.logback.core.ConsoleAppender">
<!-- encoder:对日志日期格式化,类似于layout,除了将时间转化为数组,还会将转换后的数组输出到相应的文件中 -->
<encoder>
<!-- 定义日志的输出格式 -->
<pattern>${log.pattern}</pattern>
<!-- 设置信息编码 -->
<charset>${log.encode}</charset>
</encoder>
</appender>
<!-- 文件输出策略设置 -->
<appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 文件路径 -->
<file>${log.filePath}/logback_debug.log</file>
<!-- 日志输出格式设置-->
<encoder>
<!-- 输出格式设置 -->
<pattern>${log.pattern}</pattern>
<!-- 编码设置 -->
<charset>${log.encode}</charset>
</encoder>
<!--TimeBasedRollingPolicy:配置日志所生成的目录以及生成文件名的规则 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 设置文件名称 -->
<fileNamePattern>
${log.filePath}/logback/logback_debug-%d{yyyy-MM-dd}.%i.log.zip
</fileNamePattern>
<!-- 写入文件方式 -->
<append>${log.append}</append>
<!-- 设置最大保存周期 -->
<MaxHistory>${log.maxHistory}</MaxHistory>
<!-- 日志总保存量为10GB -->
<totalSizeCap>10GB</totalSizeCap>
<!-- 策略触发器:告知 RollingFileAppender 合适激活滚动 -->
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!--文件达到 最大值时会被压缩和切割 -->
<maxFileSize>${log.maxSize}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<!-- 过滤器,过滤掉不是指定日志水平的日志 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 设置日志级别 -->
<level>DEBUG</level>
<!-- 如果跟该日志水平相匹配,则接受 -->
<onMatch>ACCEPT</onMatch>
<!-- 如果跟该日志水平不匹配,则过滤掉 -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 文件输出策略设置 -->
<appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 文件路径 -->
<file>${log.filePath}/logback_info.log</file>
<!-- 日志输出格式设置-->
<encoder>
<!-- 输出格式设置 -->
<pattern>${log.pattern}</pattern>
<!-- 编码设置 -->
<charset>${log.encode}</charset>
</encoder>
<!--TimeBasedRollingPolicy:配置日志所生成的目录以及生成文件名的规则 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 设置文件名称 -->
<fileNamePattern>
${log.filePath}/logback/logback_info-%d{yyyy-MM-dd}.%i.log.zip
</fileNamePattern>
<!-- 写入文件方式 -->
<append>${log.append}</append>
<!-- 设置最大保存周期 -->
<MaxHistory>${log.maxHistory}</MaxHistory>
<!-- 日志总保存量为10GB -->
<totalSizeCap>10GB</totalSizeCap>
<!-- 策略触发器:告知 RollingFileAppender 合适激活滚动 -->
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!--文件达到 最大值时会被压缩和切割 -->
<maxFileSize>${log.maxSize}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<!-- 过滤器,过滤掉不是指定日志水平的日志 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 设置日志级别 -->
<level>DEBUG</level>
<!-- 如果跟该日志水平相匹配,则接受 -->
<onMatch>ACCEPT</onMatch>
<!-- 如果跟该日志水平不匹配,则过滤掉 -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 文件输出策略设置 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 文件路径 -->
<file>${log.filePath}/logback_fixed.log</file>
<!-- 日志输出格式设置-->
<encoder>
<!-- 输出格式设置 -->
<pattern>${log.pattern}</pattern>
<!-- 编码设置 -->
<charset>${log.encode}</charset>
</encoder>
<!--FixedWindowRollingPolicy:设置为按照索引的方式滚动,定义文件名称的时候使用%i作为占位符,滚动后会会用角标替换 -->
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>${log.filePath}/logback_fixed-%i.log</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>3</maxIndex>
</rollingPolicy>
<!-- 指定文件最大尺寸,达到该尺寸,就触发rollingPolicy对应的策略,maxFileSize属性指定文件大小 -->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>${log.maxSize}</maxFileSize>
</triggeringPolicy>
<!-- 过滤器,过滤掉不是指定日志水平的日志 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 设置日志级别 -->
<level>INFO</level>
<!-- 如果跟该日志水平相匹配,则接受 -->
<onMatch>ACCEPT</onMatch>
<!-- 如果跟该日志水平不匹配,则过滤掉 -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 子节点logger:用来设置某一个包或具体的某一个类的日志打印级别、以及指定Appender -->
<!--
name:指定此logger管理的包或者类
level:指定此logger的消息输出级别
additivity:默认为true,是否向上级logger传递消息
-->
<logger name="demo1" level="${log.level}" additivity="false">
<appender-ref ref="STDOUT" />
<appender-ref ref="DEBUG" />
</logger>
<logger name="demo2" level="${log.level}" additivity="false">
<appender-ref ref="STDOUT" />
<appender-ref ref="INFO" />
</logger>
<logger name="demo3" level="${log.level}" additivity="false">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</logger>
<!-- 根Logger节点,最顶级-->
<root level = "DEBUG">
<appender-ref ref="STDOUT" />
<appender-ref ref="DEBUG" />
<appender-ref ref="INFO" />
<appender-ref ref="FILE" />
</root>
</configuration>
Logback使用
新建项目
引入依赖
Logback使用依赖于SLF4J API和logback-core.jar
<dependencies>
<!-- logback-core -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
<!-- 引入logback对SLF4J的实现 logback-classic -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
<scope>test</scope>
</dependency>
<!-- 引入SLF4J -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.26</version>
</dependency>
</dependencies>