logback日志框架

logback日志框架


一、Logback简介

Logback分为三个模块:logback-core,logback-classic,logback-access
logback-core是其他两个模块的基础模块。
logback-classic是log4j的改良版本,比log4j更强大。

二、Logback中的组件

Logger:日志的记录器,主要用于存放日志对象,也可以定义日志类型,级别等。
Appender:用于指定日志输出的目的地,比如你可以通过Appender指定日志输出到控制台,数据库,或者文件中。
Layout:这个组件就是用来格式化日志输出的,但是在logback中,Layout组件时被封装到了encoder组件中了,也就是说我们使用encoder时其实就是layout;

三、Logback的配置文件

Logback提供了三种配置文件:
1.logback.groovy
2.logback-test.xml
3.logback.xml
我们一般都是采用logback.xml作为配置文件,注意如果这三个配置文件都不存在时,logback就会采用默认的配置;

四、Logback的日志输出格式

在这里插入图片描述

五、依赖

注意:logback的依赖,一般都是搭配着slf4j-api,还有junit一起引入的;

<dependency>
	//logback的日志门面依赖
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
</dependency>
	//logback-classic模块中已经包含了logback-core模块
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
</dependency>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
</dependency>

六、logback配置文件的书写

在resources目录下,新建logback.xml即可;
配置文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!--
    配置文件通用属性
    -->
    <!--
    日志输出格式的配置
    -5表示左对齐(5就表示右对齐),level表示日志的级别;
    -->
    <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>
    <!-- 配置日志文件的输出路径,也就是说你想把日志输入到文件中时,具体输出到哪里;然后name是随便取的,方便下面引用,value="D://test"表示将配置文件输出到D盘下的test文件夹中-->
    <property name="logDir" value="D://test"></property>

    <!--配置控制台的appender-->
   <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
        <!--
        target表示对于日志输出目标的配置
        默认:System.out表示以黑色字体输出日志
             System.err表示以红色字体输出日志
        -->
       <!--target中输入System.err后,就会以红色字体输出所有日志-->
       <target>
           System.err
       </target>

       <!--指定日志在控制台的输出格式-->
       <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!-- 表示就用上面的property指定的格式"[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L %thread %m%n"输出日志  -->
            <pattern>${pattern}</pattern>
       </encoder>
   </appender>

    <!--配置‘普通文件’的appender,也就是将日志信息输出到普通的文件中-->
    <appender name="fileAppender" class="ch.qos.logback.core.FileAppender">
        <!--
        通过file标签引入文件的位置,也就是把上面property中指定的value="D://test"引入到fileAppender中;
        ${logDir}/logback.log这句话的意思就是:指定了日志文件的输出位置为"D://test/logback.log",也就是日志被记录在D盘下的test文件夹下的logback.log文件中
        -->
        <file>${logDir}/logback.log</file>
        <!--指定日志在文件中的输出格式-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
        </encoder>
    </appender>

    <!--配置html文件的appender,因为logback可以将日志输出到html文件中,
    我们需要用appender指定html的位置,这个html的样式是由logback自己进行维护的,
    里面的内容,日志输出到html中的格式由我们自己指定;
    -->
    <appender name="htmlFileAppender" class="ch.qos.logback.core.FileAppender">
        <!--这里你在指定html文件的位置时,你需要指定为html格式的文件,否则会出问题,毕竟是要以html格式输出-->
        <file>{logDir}/logback.html</file>
        <encoder class="ch.qos.logback.classic.encoder.LayoutWrappingEncoder">
            <!--当你要输出日志到html文件中时,你要通过layout标签来指定"ch.qos.logback.classic.html.HTMLLayout"-->
            <layout class="ch.qos.logback.classic.html.HTMLLayout">
                <!--这里表示还是以上面的"[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L %thread %m%n"格式输出日志到html文件中-->
                <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>
            <charset>utf8</charset>
        </encoder>
        <!--引入文件的输出位置,也就是在${logDir}目录下生成一个roll_logback.log日志文件,
        这个日志文件是没有拆分的,这一步是不能少的,roll_logback.log这个文件就相当于是一个母文件,
        下面通过rollingPolicy标签指定的,生成的拆分出来的日志文件就是子文件,只有先有了母文件,才能有子文件
        -->
        <file>${logDir}/roll_logback.log</file>
        <!--指定文件的拆分规则,SizeAndTime表示按照文件大小跟时间来拆分,比如日志文件保存多少天,保留多少G-->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--
            指定日志文件的压缩格式为gz(也可以指定为.zip),  注意:这里也要使用"${logDir}/",你要告诉系统,你要把日志文件输出到路径下。
            同时在后面指定文件名,这里就是按照日期来生成文件名,也就是每天都生成一个日志文件,每个日志的文件名称中带有当天日期。
            %i表示不同文件的标号,相当于文件与文件之间的区分,比如2022年9月22日当天生成的第一个日志文件满了50MB,
            就会生成第二个日志文件roll.2022-9-22.log2.gz这样一个日志压缩文件,
            当然第一个日志文件叫roll.2022-9-22.log1.gz,单词log后面的1跟2就是文件的标号,
            因为同一天可能生成多个日志文件,要用标号做区分,否则文件会重名。
            -->
            <fileNamePattern>${logDir}/roll.%d{yyyy-MM-dd}.log%i.gz</fileNamePattern>
            <!--按照文件大小进行拆分,也就是说只要日志文件满了50MB,就会再生成第二个日志文件-->
            <maxFileSize>50MB</maxFileSize>
            <!--日志文件保留天数-->
            <maxHistory>180</maxHistory>
            <totalSizeCap>20GB</totalSizeCap>
        </rollingPolicy>
    </appender>

    <!--给appender配置过滤器,也就是给某个appender中加上过滤器,以便实现更细粒度的打印,
    说的很高大上,其实很简单,比如我不想打印ERROR级别以下的日志,就是可以通过给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>
        <!--给当前的appender配置过滤器-->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!--设置日志的输出级别-->
            <level>ERROR</level>
            <!--这里ACCEPT的意思表示:只要是高于level标签中设置的ERROR级别的日志,就打印,否则不打印-->
            <onMatch>ACCEPT</onMatch>
            <!--这里DENYT的意思表示:只要是低于level标签中设置的ERROR级别的日志,则屏蔽,也就是不打印出来-->
            <onMismatch>DENY</onMismatch>

        </filter>
    </appender>

    <!--(重要)
    配置异步日志,
    第一步:创建出一个异步appender——asyncAppender
    第二步:在异步appender中,使用appender-ref标签引入你想要使用的appender,比如我现在想使用控制台appender,我就引入consoleAppender;
    第二步:在最下面的root标签中,引入刚才创建好的异步appender——asyncAppender。
    这样配置后,就能将控制台appender的日志打印跟业务逻辑代码并行执行,不会出现阻塞;如果你不配异步日志的话,日志打印跟业务逻辑之间是单线程在处理的,
    效率较低,当你配置成异步日志后,就可以一边向控制台打印日志,或者向文件打印日志,一边执行业务逻辑;
    -->
    <appender name="asyncAppender" class="ch.qos.logback.classic.AsyncAppender">
        <appender-ref ref="consoleAppender"/>
    </appender>

<!--
    root这里表示rootlogger;
    level表示配置日志级别,All表示所有级别的日志都会被输出,如果你不配置为All,trace级别的日志是不会被输出的;
-->
    <root level="All">
        <!--
            ref表示引入上面的定义好的appender,
            上面定义好了两个appender,fileAppender表示将日志输出到文件中,consoleAppender表示将日志输出到控制台中,
            当你在这里ref指定为fileAppender,日志就会输出到文件中,而不会输出到控制台;
            当你在这里ref指定为consoleAppender,日志就会输出到控制台中,而不会输出到文件;
        <appender-ref ref="fileAppender"/>
            但是如果我在root标签中指定了两个appender-ref标签,那么我们就既可以在控制台输出日志,也可以在文件中输出日志了
        <appender-ref ref="consoleAppender"/>
        <appender-ref ref="htmlFileAppender"/>
        -->
        <appender-ref ref="asyncAppender"/>
    </root>
    <!--
    自定义logger,说实话:我至今不知道自定义logger有什么用,但是这里还是把自定义logger的方法写出来了;
    additivity="false"表示不继承rootlogger,因为我们要自定义logger,所以不继承rootlogger,
    上面root标签就是logback自带的rootlogger,我们平时就是用的它
    -->
    <logger name="com.bjpowernode" level="info" additivity="false">
        <!--同样,我们也可以自己自定义的logger中引入appender-->
        <appender-ref ref="consoleAppender"/>
    </logger>
</configuration>

七. 注意事项

线程池的队列中配置了一个阈值,当队列的剩余容量小于这个阈值时,日志的trace,debug,Info这三个几倍的日志将会被丢弃,我们这里要将discardingThreschold标签的值设置为0才不会默认丢弃;
    <discardingThreschold>0</discardingThreschold>
    配置队列的容量,默认是256
    <queueSize>256</queueSize>
    还要注意:discardingThreschold,queueSize这两个标签的值,就使用0256就好,不要自己乱配置,否则会影响记录日志的性能。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值