logback异步日志

一、为什么使用异步日志Why

为提高程序性能,尽量默认都使用异步日志,如果不使用,可能日志在打包的时候,会占用大量磁盘IO和CPU,导致程序性能下降

 

二、依赖

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.20</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>log4j-over-slf4j</artifactId>
            <version>1.7.20</version>
        </dependency>

        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.1.7</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>1.1.7</version>
        </dependency>

 

注意:log4j-over-slf4j 和 slf4j-log4j12会循环引用,导致内存溢出。

 

三、logback配置文件结构,重点是<appender/> <logger/> <root/>

1、根节点<configuration>,scan重新加载,检查时间,打印logback状态信息,一般不设置属性

<configuration scan="true" scanPeriod="60 seconds" debug="false"></configuration>  

2. 设置上下文名称:<contextName>myAppName</contextName>,一般不设置

3. 设置变量: <property name="APP_Name" value="myAppName" />,通过<property>定义的值会被插入到logger上下文中

4. 获取时间戳字符串:<timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"/>,一般不设置

 

5. <appender>, 是负责写日志的组件,<appender>有两个必要属性name(名称)和class(如何打印日志)

常用class:ConsoleAppender(打印日志到控制台)/RollingFileAppender(滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件)

<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>${COMMON_PATTERN}</pattern>
</layout>
</appender>
<appender name="abc-log" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>logs/abc.log</File>
        <encoder>
            <pattern>${COMMON_PATTERN}</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>logs/abc.%d{yyyy-MM-dd}.log.zip</FileNamePattern>
            <MaxHistory>7</MaxHistory>
            <CleanHistoryOnStart>true</CleanHistoryOnStart>
        </rollingPolicy>
</appender>

 

6.<logger>,设置日志打印级别以及通过指定<appender>

name: 用来指定受此loger约束的某一个包或者具体的某一个类,是一个路径

level: 用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF

addtivity: 是否向上级loger传递打印信息。默认是true,如果传递有可能打印多次,一般设置为false

子节点<appender-ref>:实际指向<appender>

<logger name="aaa" level="TRACE" additivity="false">
        <appender-ref ref="trace-async-appender"/>
        <appender-ref ref="console"/>
</logger>

 

6. <root>,也是<logger>元素,但是它是根logger,只有一个level属性,一般是WARN级别往上

<root level="WARN">
        <appender-ref ref="console"/>
        <appender-ref ref="abc-log"/>
</root>

 

7. 异步打印日志,先把日志写入阻塞队列,然后才写到磁盘上

 

<appender-ref>实际指向<appender>,把原来的同步打日志的<appender>再包一层,因为异步日志并不自己打日志,而是提供一种方式,所以必须要具体到某个appender

<appender name="ASYNC_FILE" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
        <queueSize>512</queueSize>
        <!-- 添加附加的appender,最多只能添加一个 -->
        <appender-ref ref="FILE"/>
</appender>

<appender name="ASYNC_ERROR_FILE" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
        <queueSize>512</queueSize>
        <!-- 添加附加的appender,最多只能添加一个 -->
        <appender-ref ref="ERROR_FILE"/>
</appender>

<root level="DEBUG">
        <appender-ref ref="ASYNC_FILE"/>
        <appender-ref ref="ASYNC_ERROR_FILE"/>
</root>

 

 

8. 屏蔽某个包的日志

<logger name="packageName" level="OFF"></logger>

 

9. 例子

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <property name="LOG_DIR" value="logs"/>
    <property name="COMMON_PATTERN" value="%date{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{0} - %msg%n"/>

    <!-- - - - - - - - appender - - - - - - -  -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>${COMMON_PATTERN}</pattern>
        </layout>
    </appender>

    <appender name="abc-log" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>logs/abc.log</File>
        <encoder>
            <pattern>${COMMON_PATTERN}</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>logs/abc.%d{yyyy-MM-dd}.log.zip</FileNamePattern>
            <MaxHistory>7</MaxHistory>
            <CleanHistoryOnStart>true</CleanHistoryOnStart>
        </rollingPolicy>
    </appender>
    
    <appender name="trace-async-appender" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
        <queueSize>512</queueSize>
        <!-- 添加附加的appender,最多只能添加一个 -->
        <appender-ref ref="abc-log"/>
    </appender>
    
    <logger name="aaa" level="TRACE" additivity="false">
        <appender-ref ref="trace-async-appender"/>
        <appender-ref ref="console"/>
    </logger>

    <root level="WARN">
        <appender-ref ref="console"/>
        <appender-ref ref="abc-log"/>
    </root>
</configuration>

 

 

 

 

参考:

https://www.jianshu.com/p/86d04190304e

 

posted @ 2019-08-24 16:21  牧云文仔  阅读(8700)  评论(0编辑  收藏  举报