• Spring Boot|logback


    在了解logback之前,可以先了解下slf4j、log4j、logback、java.util.logging等日志框架间的关系,会对整个日志体系有更深入的理解,链接:https://www.cnblogs.com/hanszhao/p/9754419.html

    如果使用Spring boot,我们推荐自带的日志框架logback,默认是不需要单独配置 logback 依赖的。

    在使用Spring boot创建好项目以后,已经默认配置了日志的一些信息,如果需要配置更详细的信息,使用logback-spring.xml来自定义日志的配置。

    在类上方使用@Slf4j注解以后就可以不用创建logger对象,直接使用log即可。

    一、logback标签

    主要介绍一些常用的标签:

    1、根节点:<configuration>

    <?xml version="1.0" encoding="UTF-8"?>
    <!-- scan: 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
    scanPeriod: 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
    debug: 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
    
    <configuration debug="false" scan="true" scanPeriod="60 seconds" >
    <property name="" value="" />
    <appender name="" class=""></appender> <logger name="" level=""/>
    <root level="INFO"></root> </configuration>

    主要子节点:<property>、<appender>、<logger>、<root>

    2、<property>

    用来定义参数常量,它有两个属性name和value,通过<property>定义的值会被插入到logger上下文中,可以使“${}”来使用变量。

        <!-- <property> :用来定义参数常量,它有两个属性name和value,通过<property>定义的值会被插入到logger上下文中,可以使“${}”来使用变量。 -->
        <!-- 日志输出有五个级别:trace - debug - info - warn - error -->
        <property name="log.level" value="debug" />
        <!-- 文件最多保留30天 -->
        <property name="log.maxHistory" value="30" />
        <!-- 文件存放路径 -->
        <property name="log.filePath" value="" />
        <!-- 输出格式:d%表示时间格式,%thread表示运行线程,%-5level表示缩进5位显示级别,%logger{50} - %msg表示哪一个类输出的信息,%n为换行 -->
        <property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n" />

    3、<appender>

    负责写日志的组件,它有两个必要属性name和class。name指定appender名称,class指定appender的类型。

    <!-- 控制台输出日志 -->
    <appender name ="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
    </appender>
    <!-- 文件输出日志 -->
    <appender name="infoAppender" class="ch.qos.logback.core.FileAppender">
    </appender>
    <!-- 文件滚动输出日志 -->
    <appender name="errorAppender" class="ch.qos.logback.core.RollingFileAppender">
    </appender>
    <!-- 异步输出日志 -->
    <appender name="asyncAppender" class="ch.qos.logback.classic.AsyncAppender">
    </appender>

    ConsoleAppender、RollingFileAppender、AsyncAppender较为常用。

        <!-- 控制台输出日志设置 -->
        <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
            <!-- encoder:既对日志进行格式化,还复制将日志输出到相应的载体中 -->
            <encoder>
                <pattern>${log.pattern}</pattern>
            </encoder>
        </appender>
        <!-- 文件输出:ERROR级别日志 -->
        <!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 -->
        <appender name="errorAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!-- TimeBaseRollingPolicy :最常用的滚动策略,根据时间来制定滚动策略,即负责滚动也负责触发滚动。 -->
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!-- <fileNamePattern> 必要节点,包含文件及“%d” 转换符,“%d”可以包含一个java.text.SimpleDateFormat 制定的时间格式,如:%d{yyyy-MM},如果直接使用 %d ,默认格式是 yyyy-MM-dd -->
                <!-- <filenamePattern> 必须包含“%i” 例如:命名模式为 log%i.log,会产生归档文件log1.log和log2.log,还可以指定文件压缩选项,例如:log%i.log.gz 或者 log%i.log.zip -->
                <fileNamePattern>${log.filePath}/hpms_error.%d.%i.log</fileNamePattern>
                <!-- SizeBasedTriggeringPolicy : 如果超过指定大小会告知 RollingFileAppender , 触发当前活动滚动 , 只有一个节点 , 用来规定文件大小 -->
                <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <!-- 超过150MB时,触发滚动策略 -->
                    <maxFileSize>10MB</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
                <!--最多保留30天log-->
                <maxHistory>30</maxHistory>
            </rollingPolicy>
            <append>true</append>
            <!--
             ThresholdFilter:临界值过滤器,过滤掉低于指定临界值的日志。当日志级别等于或高于临界值时,
                              过滤器返回NEUTRAL;当日志级别低于临界值时,日志会被拒绝。
                        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                            <level>INFO</level>
                        </filter>
    
             LevelFilter:级别过滤器,根据日志级别进行过滤。如果日志级别等于配置级别,过滤器会根据onMath
                         (用于配置符合过滤条件的操作) 和 onMismatch(用于配置不符合过滤条件的操作)接收或拒绝日志。
            -->
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>ERROR</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>
            <encoder>
                <pattern>${pattern}</pattern>
                <charset>${charset}</charset>
            </encoder>
        </appender>
        <!-- 异步输出ERROR日志 -->
        <appender name="asyncAppender" class="ch.qos.logback.classic.AsyncAppender">
            <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志,如果不希望丢弃日志(既每次都是全量保存),那可以设置为0 -->
            <discardingThreshold>0</discardingThreshold>
            <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
            <queueSize>256</queueSize>
            <!-- 添加附加的appender,最多只能添加一个 -->
            <appender-ref ref="errorAppender"/>
        </appender> 

    目前所有的日志记录采用的都是同步的方式,即直接将日志写入文件。在多应用的时候,这种效果会导致一定的线程运行延迟,所以可以采用异步的方式处理。

    4、<logger>

    用来设置某一个包或者具体的某一个类的日志打印级别、以及指定使用哪个<appender>

        <!-- name:用来指定受此logger约束的某一个包或者具体的某一个类 -->
        <logger name="com.uuunl.o2o" level="${log.level}" additivity="true">
            <!-- appender-ref使用定义的appender输出日志 -->
            <appender-ref ref="debugAppender"/>
            <appender-ref ref="infoAppender"/>
            <appender-ref ref="errorAppender"/>
        </logger>

    5、<root>

    类似于<logger>的元素,只不过是根logger,所以不需要指定name属性。

        <root level="INFO">
            <appender-ref ref="consoleAppender"/>
            <appender-ref ref="errorAppender"/>
            <appender-ref ref="asyncAppender"/>
        </root>

    二、logback-spring.xml

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
        <!-- 从springboot配置文件中读取log.path属性值 -->
        <springProperty scope="context" name="logPath" source="log.path" defaultValue="logs"/>
    
        <contextName>hpms</contextName>
        <property name="charset" value="UTF-8"/>
        <property name="pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg %n"/>
        <property name="pattern-color" value="%yellow(%d{yyyy-MM-dd HH:mm:ss.SSS}) [%thread] %highlight(%-5level) %green(%logger{50}) - %highlight(%msg) %n"/>
        <property name="LOG_HOME" value="${logPath}"/>
    
        <!-- 控制台输出 -->
        <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
            <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
                <pattern>${pattern}</pattern>
                <charset>${charset}</charset>
            </encoder>
        </appender>
    
        <!-- 控制台输出-带颜色 -->
        <appender name="CONSOLE-WITH-COLOR" class="ch.qos.logback.core.ConsoleAppender">
            <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
                <pattern>${pattern-color}</pattern>
                <charset>${charset}</charset>
            </encoder>
        </appender>
    
        <!-- 文件输出:INFO级别日志 -->
        <appender name="INFO_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${LOG_HOME}/hpms_info.%d.%i.log</fileNamePattern>
                <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <maxFileSize>10MB</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
                <!-- 保存10天 -->
                <maxHistory>10</maxHistory>
            </rollingPolicy>
            <append>true</append>
            <encoder>
                <pattern>${pattern}</pattern>
                <charset>${charset}</charset>
            </encoder>
        </appender>
    
        <!-- 文件输出:INFO级别日志 -->
        <appender name="ERROR_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${LOG_HOME}/hpms_error.%d.%i.log</fileNamePattern>
                <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <maxFileSize>10MB</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
                <maxHistory>30</maxHistory>
            </rollingPolicy>
            <append>true</append>
            <!--
             ThresholdFilter:临界值过滤器,过滤掉低于指定临界值的日志。当日志级别等于或高于临界值时,
                              过滤器返回NEUTRAL;当日志级别低于临界值时,日志会被拒绝。
                        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                            <level>INFO</level>
                        </filter>
    
             LevelFilter:级别过滤器,根据日志级别进行过滤。如果日志级别等于配置级别,过滤器会根据onMath
                         (用于配置符合过滤条件的操作) 和 onMismatch(用于配置不符合过滤条件的操作)接收或拒绝日志。
            -->
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>ERROR</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>
            <encoder>
                <pattern>${pattern}</pattern>
                <charset>${charset}</charset>
            </encoder>
        </appender>
    
        <!-- 异步输出INFO日志 -->
        <appender name="ASYNC_INFO_LOG" class="ch.qos.logback.classic.AsyncAppender">
            <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
            <discardingThreshold>0</discardingThreshold>
            <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
            <queueSize>256</queueSize>
            <!-- 添加附加的appender,最多只能添加一个 -->
            <appender-ref ref="INFO_LOG"/>
        </appender>
    
        <!-- 异步输出ERROR日志 -->
        <appender name="ASYNC_ERROR_LOG" class="ch.qos.logback.classic.AsyncAppender">
            <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
            <discardingThreshold>0</discardingThreshold>
            <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
            <queueSize>256</queueSize>
            <!-- 添加附加的appender,最多只能添加一个 -->
            <appender-ref ref="ERROR_LOG"/>
        </appender>
    
            <!-- 记录 mapper 目录下的日志 -->
            <logger name="com.gy.hpms.mapper" level="DEBUG"/>
    <root level="INFO"> <appender-ref ref="CONSOLE-WITH-COLOR"/> <appender-ref ref="ASYNC_INFO_LOG"/> <appender-ref ref="ASYNC_ERROR_LOG"/> </root> </configuration>
  • 相关阅读:
    System Idle Process SYSTEM占用CPU
    apache和nginx的rewrite的区别
    解决file_get_contents failed to open stream: HTTP request failed! 错误
    个人总结大型高并发高负载网站的系统架构(转)
    代码的抽象三原则
    mysqldump导入某库某表的数据
    mysql中insert into和replace into以及insert ignore用法区别
    【原创】学习日记4:nginx负载均衡(二)2012.01.08
    【原创】学习日记1:redis安装以及lnmp环境搭建2012.01.06
    mysql优化 mysql.ini优化
  • 原文地址:https://www.cnblogs.com/maikucha/p/14046971.html
Copyright © 2020-2023  润新知