Java日志框架(第六章)

7 篇文章 0 订阅

6.第六章Logback

6.1Logback简介

        Logback是由Log4j创始人设计的又一个开源日志组件。

        Logback当前分成三个模块:logback-core,logback-classic和logback-access。

        Logback-core是其他两个模块的基础模块,Logback-classic是Log4j的一个改良版本,此外logback-classic完整实现了Slf4j API,使你可以很方便地更换成其他日志系统如Log4j或JUL。

6.2Logback的组件

        Logger:日志记录器,主要用于存放日志对象,也可以定义日志类型、级别。
        Appender:用于指定日志输出的目的地,目的地可以是控制台、文件、数据库等等。
        Layout:负责把事件转换成字符串,格式化的日志信息的输出,在Logback中Layout对象被封装在encoder中,也就是说我们未来使用的encoder其实就是Layout。

6.3 Logback配置文件

        logback提供了3种配置文件:logback.groovy、logback-test.xml、logback.xml,如果都不存在,则使用默认配置。

6.4Logback日志输出格式

        日志输出格式:
            %-10level 级别 案例为设置10个字符,左对齐
            %d{yyyy-MM-dd HH:mm:ss.SSS} 日期
            %c 当前类全限定名
            %M 当前执行日志的方法
            %L 行号
            %thread 线程名称
            %m或者%msg 信息
            %n 换行

6.5案例分析

        首先我们创建一个maven项目,引入相关依赖,因为logback-core是logback-classic的基础模块,logback-classic已经涵盖logback-core这个依赖,根据maven依赖的传递性,不需要导入,只需要导入logback-classic就可以了。

        <!-- 单元测试依赖 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <!-- slf4j日志门面依赖 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.25</version>
        </dependency>
        <!-- logback依赖 -->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
        </dependency>

        logback有5种级别的日志输出,分别是tace < debug < info < warn < error,通过信息打印,我们了解到logback默认的日志级别是debug。

         目前我们使用的是slf4j+logback组合来对日志信息进行记录,通过上一章Slf4j源码执行原理的分析我们了解到Slf4j在根据已添加日志实现框架来初始化LoggerFactory时,会去加载日志实现框架中的静态日志绑定类,如下图:

         因为本次我们只引入了Logback日志实现依赖,我们来根据源码去找到Loback中的StaticLoggerBinder类,该类中进行了StaticLoggerBinder的初始化,并且我们从中可以看到getLoggerFactory()方法,该方法获取了Logback的日志工厂,通过Logback的日志工厂获取Logger对象进行日志记录操作,如下:

         接下来,我们通过配置文件来对Logback日志进行配置管理,在resources路径下创建logback.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <!--  
        配置文件通用属性
        <property name="" value=""></property>
        所谓配置文件中的通用属性是为了让接下来的配置更加方便
        通过以${name}的形式,方便的取得value值
        通过取得的value值可以做文件的其他配置而使用
      -->
    <!-- 
        我们在此可以先做日志输出格式的相关配置
        %-10level 级别 案例为设置10个字符,左对齐
        %d{yyyy-MM-dd HH:mm:ss.SSS} 日期
        %c 当前类全限定名
        %M 当前执行日志的方法
        %L 行号
        %thread 线程名称
        %m或者%msg 信息
        %n 换行
        
        以property的形式将日志输出格式配置成为文件的通用属性
        那么我们配置的输出方式中,就可以重复的引用改配置(以下的配置,对于输出格式就不用配置多次了)
       -->
    <property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L %thread %m%n"></property>
    <property name="htmlPattern" value="[%-5level]%d{yyyy-MM-dd HH:mm:ss.SSS}%c%M%L%thread%m%n"></property>
    
    <!-- 配置文件输出路径 -->
    <property name="logDir" value="D://my-projects//log-framework-study//logs"></property>
    
    <!-- 配置控制台appender -->
    <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
        <!-- 
            表示对于日志输出目标的配置
            默认:System.out 表示以黑色字体输出日志
            设置:System.err 表示以红色字体输出日志
         -->
        <target>
            System.err
        </target>
        
        <!--
            配置日志的输出格式
            手动配置格式的方式
            直接引用上述通用属性即可 
          -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!-- 格式引用通用属性配置 -->
            <pattern>${pattern}</pattern>
        </encoder>
    </appender>
    
    <!-- 配置文件输出appender -->
    <appender name="fileAppender" class="ch.qos.logback.core.FileAppender">
        <!-- 引入文件的位置 -->
        <file>${logDir}/logback.log</file>
        
        <!-- 设置输出格式 -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!-- 格式引用通用属性配置 -->
            <pattern>${pattern}</pattern>
        </encoder>
    </appender>
    
    <!-- 配置html文件appender -->
    <appender name="htmlFileAppender" class="ch.qos.logback.core.FileAppender">
        <!-- 引入文件的位置 -->
        <file>${logDir}/logback.html</file>
        <!-- 设置输出格式 -->
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="ch.qos.logback.classic.html.HTMLLayout">
                <!-- 格式引用通用属性配置 -->
                <pattern>${htmlPattern}</pattern>
            </layout>
        </encoder>
    </appender>

    <!-- 配置文件appender 可拆分归档的文件 -->
    <appender name="rollAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 设置输出格式 -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
                <pattern>${pattern}</pattern>
        </encoder>
        <!-- 引入文件的位置 -->
        <file>${logDir}/roll_logback.log</file>
        <!-- 指定拆分规则 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 按照时间和压缩格式声明文件名 压缩格式gz -->
            <fileNamePattern>${logDir}/roll.%d{yyyy-MM-dd}.log%i.gz</fileNamePattern>
            <!-- 按照文件大小来进行拆分 -->
            <maxFileSize>1KB</maxFileSize>
        </rollingPolicy>
    </appender>
    
    <!-- 配置控制台appender 使用过滤器 -->
    <appender name="consoleFilterAppender" class="ch.qos.logback.core.ConsoleAppender">
        <target>
            System.err
        </target>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
        </encoder>
        <!-- 配置过滤器 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 设置日志的输出级别 -->
            <level>ERROR</level>
            <!-- 高于level中设置的级别,则打印日志 -->
            <onMatch>ACCEPT</onMatch>
            <!-- 低于level中设置的级别,则屏蔽日志 -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 配置异步日志Appender -->
    <appender name="asyncAppender" class="ch.qos.logback.classic.AsyncAppender">
        <appender-ref ref="consoleAppender"/>
    </appender>
    
    <!-- 
        日志记录器
        配置root logger
        level:配置日志级别
        
        可以同时引入多个appender,做日志的多方向输出
     -->
    <root level="ALL">
        <!-- 引入appender -->
        <appender-ref ref="consoleAppender"/>
<!--        <appender-ref ref="fileAppender"/>-->
<!--        <appender-ref ref="htmlFileAppender"/>-->
<!--        <appender-ref ref="rollAppender"/>-->
<!--        <appender-ref ref="consoleFilterAppender"/>-->
<!--        <appender-ref ref="asyncAppender"/>-->
    </root>
    
    <!-- 
        additivity="false"
        表示不继承rootlogger
     
     -->
    <logger name="com.lsh" level="info" additivity="false">
        <!-- 在自定义logger中配置appender -->
        <appender-ref ref="consoleAppender"/>
    </logger>
    
</configuration>

        在配置文件中所有的配置都在根标签<configuration>下,其中配置了Appender以及日志记录器,Appender中包含了控制台输出、日志文件输出、html文件输出、拆分归档文件输出、异步日志输出,并且还包含了过滤器的配置和使用,以及Logback中日志记录器引入Appender的配置方式。

关于Logback的补充:

        1.异步日志:

                可配置属性:

<discardingThreshold>0</discardingThreshold>
<queueSize>256</queueSize>

        discardingThreshold表示当队列剩余容量小于这个阈值的时候,那么当前日志的级别 trace、debug、info这3个级别的日志将被丢弃,设置为0,说明永远都不会丢弃trace、debug、info这3个级别的日志。

        queueSize表示队列的深度,这个值会影响记录日志的性能,默认256

        关于这两个属性,一般情况下,我们使用默认值即可,不要乱配置,会影响系统的性能,了解功能即可。

        2.关于不同的日志实现,配置文件也不同

        例如:

                log4j经常使用的是properties属性文件

                logback经常使用的是xml配置文件

                如果我们遇到一种情况,就是需要将以前的Log4j,改造为使用Logback,应该如何处理

                我们可以使用Logback官网提供的工具log4j.properties转换器

                只有是二者兼容的技术,才会被翻译,如果是Log4j独有的技术,Logback没有,或者是有这个技术,但是并不兼容转义,那么这个工具不会为我们进行翻译,如果遇到简单的配置,我们可以使用工具进行翻译。

6.6总结

        1.Logback日志框架实现了Slf4j的接口,因此可以与日志门面Slf4j完美衔接,在使用过程中,只需要引入Logback的日志框架依赖即可,无需通过其他组件进行适配。

        2.相较于Log4j,Logback与其非常相似,但是在性能方面,Logback优于Log4j,并且Logback还具备了一些新的特性,例如过滤器、日志文件压缩等。

        3.Logback的配置文件我们一般经常使用logback.xml,并且Logback的配置文件是默认自动加载的,因此无需我们对文件的加载进行配置,如果在我们没有对logback.xml或者logback-test.xml进行配置时,系统会使用默认配置进行日志的记录操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值