日志框架(4) : LogBack介绍、相关使用


Logback简介

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

Logback中的组件

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

Logback配置文件

Logback提供了3种配置文件

  • logback.groovy
  • logback-test.xml
  • logback.xml
  • 如果都不存在则采用默认的配置

日志输出格式

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

LogBack知识点

<dependencies>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.25</version>
    </dependency>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.3</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
</dependencies>
@Test
public void test01() {
    /*
    入门案例
        logback有5种级别的日志输出
        分别是
        trace < debug < info < warn < error

        通过信息打印,默认的日志级别是debug,trace信息没有打印出来
     */
    // 一般LogBack都和slf4j门面结合使用,LoggerFactory是slf4j中的类
    Logger logger = LoggerFactory.getLogger(LogBackTest.class);

    logger.error("error信息");
    logger.warn("warn信息");
    logger.info("info信息");
    logger.debug("debug信息");
    logger.trace("trace信息");
}
22:32:45.869 [main] ERROR com.guizy.LogBackTest - error信息
22:32:45.871 [main] WARN com.guizy.LogBackTest - warn信息
22:32:45.871 [main] INFO com.guizy.LogBackTest - info信息
22:32:45.871 [main] DEBUG com.guizy.LogBackTest - debug信息

使用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>

    <!-- 配置日志位置: 配置到控制台appender -->
    <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">

        <!--
            表示对日志输出目标的配置
            默认: System.out 表示以黑色字体输出日志
            设置: System.err 表示以红色字体输出日志
         -->
        <target>
            System.err
        </target>

        <!--
            配置日志输出格式
            手动配置格式的方式
            直接引入上面的通用属性<property>标签中的
        -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!-- 格式引用通用属性配置 -->
            <pattern>${pattern}</pattern>
        </encoder>
    </appender>

    <!--
        配置日志记录器
        默认配置的是 root logger
        level: 配置日志级别
     -->
    <root level="ALL">
        <appender-ref ref="consoleAppender"/>
    </root>
</configuration>
@Test
public void test02() {

    /*
    Logback配置文件的使用
        在resources下面,创建一份配置文件,命名为logback.xml

        一切配置都是在根标签中进行操作的
        <configuration>
        </configuration>
     */
    Logger logger = LoggerFactory.getLogger(LogBackTest.class);

    logger.error("error信息");
    logger.warn("warn信息");
    logger.info("info信息");
    logger.debug("debug信息");
    logger.trace("trace信息");
}
[ERROR] 2022-03-30 22:35:35.935 com.guizy.LogBackTest test02 49 main error信息
[WARN ] 2022-03-30 22:35:35.936 com.guizy.LogBackTest test02 50 main warn信息
[INFO ] 2022-03-30 22:35:35.937 com.guizy.LogBackTest test02 51 main info信息
[DEBUG] 2022-03-30 22:35:35.937 com.guizy.LogBackTest test02 52 main debug信息
[TRACE] 2022-03-30 22:35:35.937 com.guizy.LogBackTest test02 53 main trace信息
输出到文件
    <!-- 配置文件的输出的路径-->
    <property name="logDir" value="/Users/guizhaoyang/Desktop"></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>

    <!--
        配置日志记录器
        默认配置的是 root logger
        level: 配置日志级别
     -->
    <root level="ALL">
        <!-- 引入appender, 同时可以配置多个appender,多方向输出日志 -->
        <appender-ref ref="fileAppender"/>
        <appender-ref ref="consoleAppender"/>
    </root>
 @Test
 public void test03() {

     /*
         在实际的生产环境中,我们更希望将日志信息保留在文件中
         在文件中,默认是以追加日志的形式做记录
      */
     Logger logger = LoggerFactory.getLogger(LogBackTest.class);

     logger.error("error信息");
     logger.warn("warn信息");
     logger.info("info信息");
     logger.debug("debug信息");
     logger.trace("trace信息");
 }
 // 指定文件也会输出内容,多次则会追加
[ERROR] 2022-03-30 22:48:55.654 com.guizy.LogBackTest test03 63 main error信息
[WARN ] 2022-03-30 22:48:55.657 com.guizy.LogBackTest test03 64 main warn信息
[INFO ] 2022-03-30 22:48:55.657 com.guizy.LogBackTest test03 65 main info信息
[DEBUG] 2022-03-30 22:48:55.657 com.guizy.LogBackTest test03 66 main debug信息
[TRACE] 2022-03-30 22:48:55.657 com.guizy.LogBackTest test03 67 main trace信息
以html的格式输出到文件
    <!-- ***********************************************以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>${pattern}</pattern>
            </layout>
        </encoder>
    </appender>

    <!--
        配置日志记录器
        默认配置的是 root logger
        level: 配置日志级别
     -->
    <root level="ALL">
        <!-- 引入appender, 同时可以配置多个appender,多方向输出日志 -->
<!--        <appender-ref ref="fileAppender"/>-->
        <appender-ref ref="htmlFileAppender"/>
        <appender-ref ref="consoleAppender"/>
    </root>

在这里插入图片描述

    @Test
    public void test04() {

        /*

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

                初始测试:样式不是很好看,需要将换行,空格都去除掉

                在实际生产环境中,如果日志不是很多,建议使用html的方式去进行日志的记录
         */
        Logger logger = LoggerFactory.getLogger(LogBackTest.class);

        logger.error("error信息");
        logger.warn("warn信息");
        logger.info("info信息");
        logger.debug("debug信息");
        logger.trace("trace信息");
    }
日志拆分和归档压缩
    <!-- **************************配置文件的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>

    <!--
        配置日志记录器
        默认配置的是 root logger
        level: 配置日志级别
     -->
    <root level="ALL">
        <!-- 引入appender, 同时可以配置多个appender,多方向输出日志 -->
<!--        <appender-ref ref="fileAppender"/>-->
<!--        <appender-ref ref="htmlFileAppender"/>-->
        <appender-ref ref="roll"/>
        <appender-ref ref="consoleAppender"/>
    </root>
@Test
public void test05() {
    /*
    日志拆分和归档压缩

        重要标签来源:
        查看源码
        RollingFileAppender类中找到rollingPolicy属性
        SizeAndTimeBasedRollingPolicy类中找到maxFileSize属性
        这些属性在类中都是以set方法的形式进行的赋值
        我们在配置文件中配置的信息,其实找到的都是这些属性的set方法

        在TimeBasedRollingPolicy找到
        static final String FNP_NOT_SET =
        "The FileNamePattern option must be set before using TimeBasedRollingPolicy. ";

        只要我们要使用到日志的拆分
        FileNamePattern属性是必须要使用到了
     */

    for (int i = 0; i < 1000; i++) {

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

        logger.error("error信息");
        logger.warn("warn信息");
        logger.info("info信息");
        logger.debug("debug信息");
        logger.trace("trace信息");
    }
}
appender添加过滤器
    <!-- **************************使用过滤器,对日志进行更细粒度的划分**************************************************** -->
    <!-- 配置控制台的appender 使用过滤器-->
    <appender name="consoleFilterAppender" class="ch.qos.logback.core.ConsoleAppender">
        <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>


    <!--
        配置日志记录器
        默认配置的是 root logger
        level: 配置日志级别
     -->
    <root level="ALL">
        <!-- 引入appender, 同时可以配置多个appender,多方向输出日志 -->
<!--        <appender-ref ref="fileAppender"/>-->
<!--        <appender-ref ref="htmlFileAppender"/>-->
<!--        <appender-ref ref="roll"/>-->
<!--        <appender-ref ref="consoleAppender"/>-->
        <appender-ref ref="consoleFilterAppender"/>
    </root>
@Test
public void test06() {

    /*
        我们可以在appender中添加过滤器
        以此对日志进行更细粒度的打印
     */
    Logger logger = LoggerFactory.getLogger(LogBackTest.class);

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

}
[ERROR] 2022-03-30 23:29:36.221 com.guizy.LogBackTest test06 133 main error信息
异步打印日志
    <!-- **************************配置异步日志**************************************************** -->
    <appender name="asyncAppender" class="ch.qos.logback.classic.AsyncAppender">
        <appender-ref ref="consoleAppender"/>
    </appender>

    <!--
        配置日志记录器
        默认配置的是 root logger
        level: 配置日志级别
     -->
    <root level="ALL">
        <!-- 引入appender, 同时可以配置多个appender,多方向输出日志 -->
<!--        <appender-ref ref="fileAppender"/>-->
<!--        <appender-ref ref="htmlFileAppender"/>-->
<!--        <appender-ref ref="roll"/>-->
<!--        <appender-ref ref="consoleAppender"/>-->
<!--        <appender-ref ref="consoleFilterAppender"/>-->
        <appender-ref ref="asyncAppender"/>
    </root>
@Test
public void test07() {

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

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

        所以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----------------------");
}
自定义logger
<!-- **************************自定义logger**************************************************** -->
<!--

    additivity="false"
    表示不继承rootlogger

-->
<logger name="com.bjpowernode" level="info" additivity="false">

    <!-- 在自定义logger中配置appender -->
    <appender-ref ref="consoleAppender"/>

</logger>
@Test
public void test08() {

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

    logger.error("error信息");
    logger.warn("warn信息");
    logger.info("info信息");
    logger.debug("debug信息");
    logger.trace("trace信息");
}
[ERROR] 2022-03-30 23:45:07.931 com.guizy.LogBackTest test08 204 main error信息
[WARN ] 2022-03-30 23:45:07.933 com.guizy.LogBackTest test08 205 main warn信息
[INFO ] 2022-03-30 23:45:07.933 com.guizy.LogBackTest test08 206 main info信息
logback配置文件转换
    @Test
    public void test09() {

    /*
    关于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没有,或者是有这个技术但是并不兼容转义
                那么这个工具则不会为我们进行翻译

                如果是遇到简单的配置,我们可以使用工具
         */
    }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在应用程序中初始化Logback是为了在程序运行过程中记录日志信息。在初始化过程中,通常会指定一个配置文件来配置Logback的行为和输出方式。在这个回答中提到的配置文件是logback.xml,它通常位于应用程序的classpath中的logback目录下。 Logback是一个功能强大的日志框架,具有很多特性和灵活的配置选项。初始化Logback的过程包括以下几个步骤: 1. 确定logback.xml的位置:在[classpath:logback/logback.xml]中,指定了配置文件的相对路径。其中,classpath表示在应用程序的类路径中搜索文件,logback目录表示配置文件位于应用程序的根目录下的logback目录中。 2. 加载配置文件:一旦确定了配置文件的位置,Logback会加载这个配置文件,读取其中的配置信息并进行解析。 3. 配置Logback:通过解析配置文件,Logback会设置日志打印级别、输出格式、目标等。这些配置决定了日志会以何种方式被记录和输出。 4. 启动Logback:在配置完成后,Logback会启动并开始记录日志。一旦启动,Logback会根据配置文件中的规则和条件来决定是否记录某条日志,并将其输出到指定的目标(如控制台、文件)。 通过初始化Logback,我们可以在程序运行时捕获和记录关键信息,以用于调试、故障排查和性能优化等目的。同时,通过灵活的配置选项,我们可以根据实际需求来定制日志的输出方式和级别,以控制日志的输出量和质量。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

white camel

感谢支持~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值