LogBack

Logback是由log4j创始人设计的又一个开源日志组件。
Logback当前分成三个模块:logback-core,logback- classic和logback-access。
logback-core是其它两个模块的基础模块。
logback-classic是log4j的一个改良版本。此外logback-classic完整实现SLF4J API。使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging。
logback-access访问模块与Servlet容器集成提供通过Http来访问日志的功能

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

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

logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <!--
        配置文件通用属性
        <property name="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="pattern1" value="[%-5level]%d{yyyy-MM-dd HH:mm:ss.SSS}%c%M%L%thread%m%n"></property>

    <!-- 配置文件的输出路径 -->
    <property name="logDir" value="D://test"></property>

    <!-- 配置文件的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>

    <!-- 配置控制台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 html文件 -->
    <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>${pattern1}</pattern>
            </layout>
        </encoder>
    </appender>

    <!-- 配置文件的appender 可拆分归档的文件 -->
    <appender name="roll" 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 name="asyncAppender" class="ch.qos.logback.classic.AsyncAppender">
        <appender-ref ref="consoleAppender"/>
    </appender>

    <!--日志记录器
        配置root logger
        level:配置日志级别

        可以同时配置多个appender,做日志的多方向输出
    -->
    <root level="ALL">
        <!-- 引入appender -->
        <!-- 通过引入来启动上面的配置-->
        <!--<appender-ref ref="roll"/>-->
        <!--<appender-ref ref="consoleFilterAppender"/>-->
        <appender-ref ref="consoleAppender"/>
        <!--<appender-ref ref="asyncAppender"/>-->
    </root>

    <!--
        additivity="false"
        表示不继承rootlogger
    -->
    <logger name="com.bjpowernode" level="info" additivity="false">
        <!-- 在自定义logger中配置appender -->
        <appender-ref ref="consoleAppender"/>
    </logger>

</configuration>

package com.log.logBack;


import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LogBackTest {
    @Test
    public void test01(){

        /*

            入门案例
                logback有5种级别的日志输出
                分别是
                trace < debug < info < warn < error

                通过信息打印,默认的日志级别是debug,trace信息没有打印出来

         */

        /*----------------配置文件的输出路径-----------------------------
            在实际的生产环境中,我们更希望将日志信息保留在文件中
            在文件中,默认是以追加日志的形式做记录

            <!-- 配置文件的输出路径 -->
            <property name="logDir" value="D://test"></property>
            <file>${logDir}/logback.log</file>
        */

        /*----------------将日志输出成为一个html文件-----------------------------
                将日志输出成为一个html文件
                这个html文件是由logback来帮我们控制样式以及输出的格式
                内容由我们自己来指定

                初始测试:样式不是很好看
                在实际生产环境中,如果日志不是很多,建议使用html的方式去进行日志的记录
                <!-- 配置文件的appender html文件 -->
                <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>${pattern1}</pattern>
                        </layout>
                    </encoder>
                </appender>
         */

        /*----------------日志拆分和归档压缩-----------------------------
                <!-- 配置文件的appender 可拆分归档的文件 -->
                <appender name="roll" 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中添加过滤器
            以此对日志进行更细粒度的打印

             <!-- 配置控制台的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-->
                <filter class="ch.qos.logback.classic.filter.LevelFilter">
                    <!-- 设置日志的输出级别  打印ERROR级别高的日志,包括ERROR-->
                    <level>ERROR</level>
                    <!-- 高于level中设置的级别,则打印日志 -->
                    <onMatch>ACCEPT</onMatch>
                    <!-- 低于level中设置的级别,则屏蔽日志 -->
                    <onMismatch>DENY</onMismatch>
                </filter>
            </appender>
         */

        /*----------------自定义logger-----------------------------
                自定义logger
                <!--
                    additivity="false"
                    表示不继承rootlogger
                    name 有父子级别
                     level="info"  输出 info 级别及其以上的log
                -->
                <logger name="com.log" level="info" additivity="false">
                    <!-- 在自定义logger中配置appender -->
                    <appender-ref ref="consoleAppender"/>
                </logger>

         */
        Logger logger = LoggerFactory.getLogger(LogBackTest.class);

        logger.error("error信息");
        logger.warn("warn信息");
        logger.info("info信息");
        logger.debug("debug信息");
        logger.trace("trace信息");

    }





    @Test
    public void test02(){

        /*----------------异步日志的功能-----------------------------

            按照我们当前的代码执行顺序
            代码肯定是按照从上向下的顺序执行
            上面的代码完全执行完毕后,才会执行下面的代码

            由此得出会出现的问题:
                只要是在记录日志,那么系统本身的功能就处于一种停滞的状态
                当日志记录完毕后,才会执行其他的代码
                如果日志记录量非常庞大的话,那么我们对于系统本身业务代码的执行效率会非常低

                所以logback为我们提供了异步日志的功能

                配置方式:
                    1.配置异步日志
                        在异步日志中引入我们真正需要输出的appender
                        <appender name="asyncAppender" class="ch.qos.logback.classic.AsyncAppender">
                            <appender-ref ref="consoleAppender"/>
                        </appender>
                    2.在rootlogger下引入异步日志
                        <appender-ref ref="asyncAppender"/>

                所谓异步日志的原理是:
                    系统会为日志操作单独的分配出来一根线程,主线程会继续向下执行
                    线程1:系统业务代码执行
                    线程2:打印日志
                    两根线程争夺CPU的使用权

                在实际项目开发中,越大的项目对于日志的记录就越庞大
                为了保证项目的执行效率,异步日志是一个很好的选择
         */

        Logger logger = LoggerFactory.getLogger(LogBackTest.class);

        //日志打印操作
        for (int i = 0; i < 100; i++) {

            logger.error("error信息");
            logger.warn("warn信息");
            logger.info("info信息");
            logger.debug("debug信息");
            logger.trace("trace信息");

        }

        //系统本身业务相关的其他操作
        System.out.println("1----------------------");
        System.out.println("2----------------------");
        System.out.println("3----------------------");
        System.out.println("4----------------------");
        System.out.println("5----------------------");


          /*  关于logback补充:

                1.异步日志:
                    可配置属性
                    配置了一个阈值
                    当队列的剩余容量小于这个阈值的时候,当前日志的级别 trace、debug、info这3个级别的日志将被丢弃
                    设置为0,说明永远都不会丢弃trace、debug、info这3个级别的日志
                    <discardingThreshold>0</discardingThreshold>
                    配置队列的深度,这个值会影响记录日志的性能,默认值就是256
                    <queueSize>256</queueSize>
                    关于这两个属性,一般情况下,我们使用默认值即可
                    不要乱配置,会影响系统性能,了解其功能即可

                2.关于不同的日志实现,配置文件也是不同的
                    例如:
                        log4j经常使用的是properties属性文件
                        logback使用的是xml配置文件

                        如果我们遇到了一种情况,就是需要将以前的log4j,改造为使用logback
                        应该如何处理
                        我们可以使用工具(如果是遇到简单的配置,我们可以使用工具)
                            访问logback官网
                            找到log4j.properties转换器

                        只要是二者兼容的技术,才会被翻译
                        如果是log4j独立的技术,logback没有,或者是有这个技术但是并不兼容转义
                        那么这个工具则不会为我们进行翻译
         */
    }
}

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值