zoukankan      html  css  js  c++  java
  • 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上

    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

  • 相关阅读:
    修改 cmd 控制台字体、巧用 FontLink 使中英文独立设置
    非常棒的 「Sublime Text 配色/主题」与「编程字体」
    如何优雅地制作精排 ePub —— 个人电子书制作规范及基本样式表
    Simofox 2.7
    轻松绕过极域电子教室、和教师控制 Say GoodBye
    linux常用的命令
    Java Map按键(Key)排序和按值(Value)排序
    关于递归的理解以及实例
    如何去掉list里重复的数据
    快速排序的白话理解(拷贝)
  • 原文地址:https://www.cnblogs.com/june0816/p/6474569.html
Copyright © 2011-2022 走看看