日志框架之Logback

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

  1. rollingPolicy:

当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名

  • FixedWindowRollingPolicy:
  • TimeBasedRollingPolicy。
  1. triggeringPolicy:

告知 RollingFileAppender 合适激活滚动。

  1. 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>

参考文档:

  1. Logback官方文档

  1. https://logback.qos.ch/reasonsToSwitch.html#fasterImpl ↩︎

  • 3
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值