蓝易云

Logback 使用和配置

94次阅读
没有评论

共计 11421 个字符,预计需要花费 29 分钟才能阅读完成。

一、简介

之前介绍过Java 的日志框架体系以及 slf4j 的整合logback 则是具体实现,官网地址:http://logback.qos.ch/

Logback 共定义了8个级别的,除去OFF和ALL,可以说分为6个级别。优先级从高到低依次为:OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、 ALL。目前官方推荐的共四个级别:ERROR、WARN、INFO、DEBUG。

OFF-第8级,最高等级,虚拟级别,用于关闭所有日志记录。

FATAL-第7级,不可用的致命级别,已被slf4j弃用,官方解释是和ERROR没有绝对的界限。

ERROR-第6级,可用的错误级别,很常用,推荐级别,用于捕获错误事件。

WARN-第5级,可用的告警级别,用得相对较少但位置很关键,表示潜在的可能错误。

INFO-第4级,可用的信息级别,最常用,推荐级别,用于打出程序的关键信息、阶段性的历程碑信息。

DEBUG-第3级,可用的调试级别,详尽的、可用于程序调试的级别,看日志类似看代码的执行过程。

TRACE-第2级,可用的追踪级别,但一般不建议使用,用于极为详尽的step-by-step日志追踪。

ALL-第1级,最低等级,虚拟级别,用于打开所有日志记录。

二、配置文件

1. 配置文件查找顺序

Logback 查找配置文件的先后顺序是:

  1. logback-test.xml

  2. logback.groovy

  3. logback.xml

如果上述三个配置文件都没有找到,则使用默认配置打印到控制台。

Logback 优先读取测试环境配置,后读取生产环境配置。此外,相比于 XML,Groovy 风格的配置文件更加直观,当前已有工具支持自动把 logback.xml 文件迁移至 logback.groovy,但当前使用较少,因此本文的讲述,都基于 logback.xml。

2. 配置文件结构

<configuration>
    <property name="LOG_HOME" value="./logs"/>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <filter>
            ...
        </filter>
        <rollingPolicy>
            ....
        </rollingPolicy>
        <encoder>
            ...
        </encoder>
    </appender>

    <logger>
        ...
    </loggers> 

     <root>
        ...
     </root>
</configuration>   

2.1 configuration

configuration 元素作为根节点,有 debug、scan、scanPeriod 属性。

2.2 property

property 用于定义变量,方便使用。有两个属性:name,value。定义变量后,可以使用${}来使用变量。如下:

<property name="LOG_HOME" value="./logs"/>

2.3 appender

appender 是日志输出目标,如文件、控制台、数据库等。有2个必填属性 name 和 class。name 为节点的名称,class 为的全限定类名,也就是日志输出目的地的处理类。其中,encoder 子节点用来控制日志的输出格式。

2.3.1 ConsoleAppender

ch.qos.logback.core.ConsoleAppender 用于将日志输出到控制台。

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">  
    <encoder>  
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} %msg%n</pattern>
    </encoder>  
</appender>

encoder:用于格式化日志输出。

2.3.2 FileAppender

ch.qos.logback.core.FileAppender 用于将日志输出到具体的磁盘文件中。


<appender name="INFO" class="ch.qos.logback.core.FileAppender">  
    <file>${LOG_HOME}/info.log</file>
    <append>true</append>  
    <prudent>false</prudent>
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <level>info</level>
    </filter>
    <encoder>  
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} %msg%n</pattern>
    </encoder>  
</appender>

append:新增的日志是否以追加到文件结尾的方式写入到 info.out 文件中,true 为追加,fasle 为清空现存文件再写入。

prudent:日志是否被安全的写入磁盘文件,默认为 false。如果为 true,则效率低下。

filter:过滤日志,只写入 info 级别以上的日志。

2.3.3 RollingFileAppender

ch.qos.logback.core.rolling.RollingFileAppender 为滚动记录日志,当符合rollingPolicy 节点中设置的条件时,会将现有日志移到新的文件中去。

rollingPolicy 节点中可设置的条件为:文件的大小、时间等。

<appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${LOG_HOME}/info.log</file>  
    <append>true</append>  
    <prudent>false</prudent>
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <level>info</level>
    </filter>
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
        <fileNamePattern>info-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
        <maxHistory>5</maxHistory>
        <maxFileSize>1MB</maxFileSize>
        <totalSizeCap>10MB</totalSizeCap>
    </rollingPolicy>
    <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} %msg%n</pattern>
    </encoder>
</appender>

rollingPolicy:用于定义日志滚动策略。可以指定的类如下:

1.TimeBasedRollingPolicy:基于时间的滚动策略,可以按照天、月、周等时间单位来滚动日志文件。
2.SizeAndTimeBasedRollingPolicy:同时基于时间和文件大小的滚动策略,允许日志文件达到一定大小后进行滚动,并且可以设置时间单位来进一步归档日志文件。
3.FixedWindowRollingPolicy:基于固定窗口算法的滚动策略,可以设置最大和最小的窗口索引,配合 triggeringPolicy 可以实现根据文件大小进行滚动的需求。
4.SizeBasedTriggeringPolicy:基于文件大小的触发策略,通常与 FixedWindowRollingPolicy 一起使用,用于控制日志文件在达到特定大小时触发滚动。

rollingPolicy节点还包含一些子节点:

fileNamePattern:必要节点,用于定义滚动后新日志文件的命名规则。文件名中必须包含 %d 转换符,用于表示时间元素,例如:info-%d{yyyy-MM-dd}.log

maxHistory:用于定义日志文件保留的时间长度。(通常与 TimeBasedRollingPolicy 一起使用,SizeAndTimeBasedRollingPolicy 中可能不生效。)

totalSizeCap:用于定义所有日志文件的总大小上限。

maxFileSize:用于定义单个日志文件的最大大小。

用于触发滚动日志的策略如: TimeBasedTriggeringPolicySizeBasedTriggeringPolicy
TimeBasedTriggeringPolicy:基于时间的滚动策略,可以设置 interval 属性来指定多久滚动一次,默认是1小时。modulate 属性用来调整时间,使得滚动时间更加均匀分布。
SizeBasedTriggeringPolicy:基于文件大小的滚动策略,size 属性用来定义每个日志文件的大小。

DefaultRolloverStrategy:用来指定同一个文件夹下最多可以有多少个日志文件时开始删除最旧的,创建新的日志文件,通过 max 属性来设置。

2.3.4 AsyncAppender

​异步记录日志,内部通过使用缓存的方式来实现异步打印,将日志打印事件event放入缓存中。具体数据结构为BlockingQueue。

<appender name ="ASYNC" class= "ch.qos.logback.classic.AsyncAppender">  
    <discardingThreshold>0</discardingThreshold>  
    <queueSize>512</queueSize>  
    <appender-ref ref ="FILE"/>  
</appender>

queueSize:指的是 BlockingQueue 的队列容量大小,默认为256个。
discardingThreshold:如果 BlockingQueue 中还剩余 20% 的容量,那么程序会丢弃 TRACE、DEBUG 和 INFO 级别的日志打印事件 event,只保留 WARN 和 ERROR 级别的。为了保留所有的日志打印事件,可以将该值设置为0。

2.4 root

root 节点可以说是特殊的 logger,用来指定最基础的日志输出级别,只能配置一个。只有一个 level 属性,用于设置打印级别,可选如下:TRACE,DEBUG,INFO,WARN,ERROR,ALL,OFF

<root level="info">
    <appender-ref ref="CONSOLE" />
</root>

2.5 logger

logger 可以给特定的包定义日志级别和行为,且可以配置多个。

比如想让 com.amjun.logback 单独使用 debug 日志级别,配合只输出 debug 日志的输出目标达到只输出 com.amjun.logback 包下的 debug 日志的效果。

additivity 的作用在于当前 logger 是否使用上级 logeer 输出,设置为 false 则自己必须指定 appender-ref 输出目标。

<appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${LOG_HOME}/debug.log</file>
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>DEBUG</level>
        <onMatch>ACCEPT</onMatch>
        <onMismatch>DENY</onMismatch>
    </filter>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!-- 每天生成一个日志文件 -->
        <fileNamePattern>${LOG_HOME}/debug-%d{yyyy-MM-dd}.log</fileNamePattern>
        <maxHistory>30</maxHistory>
    </rollingPolicy>
    <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
</appender>

<logger name="com.amjun.logback" level="DEBUG" additivity="true">
    <appender-ref ref="DEBUG"/>
</logger>

三、logback使用

这里只介绍 springboot 中使用,首先引入依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-logging</artifactId>
    </dependency>

    <!-- 如果是其他项目,单独引入以下包,且不能使用 application.yaml 作为配置文件-->
    <!-- SLF4J 门面 -->
    <!-- <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.30</version>
    </dependency> -->
    <!-- Logback 日志具体实现 -->
    <!-- <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.3</version>
    </dependency> -->
</dependencies>

简单使用,直接在 application.yaml 编写配置:

logging:
  file:
    # 配置日志存放路径,日志文件名为:spring.log
    path: ./log
    # 设置日志文件大小
    max-size: 20MB
  level:
    # root日志以info级别输出
    root: info
    # 此包下所有class以DEBUG级别输出
    com:
      amjun:
        logback: info

xml 配置文件方式 logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <property name="LOG_HOME" value="./logs"/>

    <!-- 定义控制台输出的日志级别 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>info</level>
        </filter>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/debug.log</file>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 每天生成一个日志文件 -->
            <fileNamePattern>${LOG_HOME}/debug-%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 配置根日志器的输出 -->
    <root level="DEBUG">
        <!-- 控制台只输出 INFO 及以上 -->
        <appender-ref ref="CONSOLE"/>
        <!-- 文件中仅保存 DEBUG -->
        <appender-ref ref="DEBUG"/>
    </root>
</configuration>

测试类:

public class Test {

    private static final Logger log = LoggerFactory.getLogger(Test.class);

    public static void main(String[] args) throws InterruptedException {
        int i = 0;
        while (true){
            i++;
            // 防止打印太快
            if(i % 1000 == 0){
                Thread.sleep(500l);
            }
            log.error("error...");
            log.warn("warn...");
            log.info("info...");
            log.debug("debug...");
            log.trace("trace...");
        }
    }
}

四、自用配置

效果:开发环境 debug 级别以上日志输出到控制台,生产环境只输出 info 级别以上日志到控制台,debug 日志单独输出到文件。

<?xml version="1.0" encoding="UTF-8"?>
<!--
scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒当scan为true时,此属性生效。默认的时间间隔为1分钟。
debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
-->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <!--自定义颜色配置 此处converterClass引用的是日志颜色类的路径, 此匹配的是第二种控制台色彩输出方式-->
    <conversionRule conversionWord="customcolor" converterClass="com.unipower.common.log4j.LogbackColorful"/>
    <!-- 定义日志的要保存的根目录 -->
    <springProperty scope="context" name="spring.application.name" source="spring.application.name"/>
    <property name="LOG_HOME" value="log/${spring.application.name}"/>
    <!-- 定义日志文件名称-->
    <springProperty scope="context" name="appName" source="spring.application.name" defaultValue="localhost.log"/>

    <!-- 控制台输出 -->
    <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
        <!--
        日志输出格式:
            %d表示日期时间,
            %thread表示线程名,
            %-5level:级别从左显示5个字符宽度
            %logger{50} 表示logger名字最长50个字符,否则按照句点分割。
            %msg:日志消息,
            %n是换行符
        -->
        <encoder>
            <!--<pattern>%d %p (%file:%line\)- %m%n</pattern>-->
            <!--格式化输出:%d:表示日期    %thread:表示线程名     %-5level:级别从左显示5个字符宽度  %msg:日志消息    %n:是换行符-->
            <pattern>%yellow(%date{yyyy-MM-dd HH:mm:ss}) [%highlight(%-5level)] [%blue(%thread)] [%blue(%logger{50}:%line)]
                %cyan(%msg%n)
            </pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 过滤掉 debug 日志的控制台输出 -->
    <appender name="consoleDenyDebugAppender" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <onMatch>DENY</onMatch>
        </filter>
        <encoder>
            <pattern>%yellow(%date{yyyy-MM-dd HH:mm:ss}) [%highlight(%-5level)] [%blue(%thread)] [%blue(%logger{50}:%line)]
                %cyan(%msg%n)
            </pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件   -->
    <!--该配置表示每天生成一个日志文件,保存30天的日志文件。-->
    <appender name="appLogAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 指定日志文件的名称 -->
        <file>${LOG_HOME}/${appName}.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/${appName}-%d{yyyy-MM-dd}-%i.zip</fileNamePattern>
            <MaxHistory>30</MaxHistory>
            <maxFileSize>50MB</maxFileSize>
            <totalSizeCap>2GB</totalSizeCap>
        </rollingPolicy>
        <!-- 日志输出格式: -->
        <!--        <layout class="ch.qos.logback.classic.PatternLayout">-->
        <!--            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [ %thread ] - [ %-5level ] [ %logger{50} : %line ] - %msg%n</pattern>-->
        <!--        </layout>-->
        <encoder>
            <!--<pattern>%d %p (%file:%line\)- %m%n</pattern>-->
            <!--格式化输出:%d:表示日期    %thread:表示线程名     %-5level:级别从左显示5个字符宽度  %msg:日志消息    %n:是换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 仅输出业务包下的 debug 日志 -->
    <appender name="debugOnlyAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/${appName}-debug.log</file>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/${appName}-debug-%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 开发、测试环境 -->
    <springProfile name="default,dev,test">
        <logger name="org.springframework.web" level="INFO"/>
        <logger name="org.springboot.sample" level="INFO"/>
        <logger name="RocketmqRemoting" level="OFF"/>
        <logger name="com.alibaba.nacos" level="OFF"/>
        <logger name="org.springframework.data.mongodb.core" level="INFO"/>

        <logger name="com.unipower" level="DEBUG"/>
        <root level="info">
            <appender-ref ref="consoleAppender"/>
            <!-- 可能不需要,暂时关闭 -->
<!--            <appender-ref ref="appLogAppender"/>-->
        </root>
    </springProfile>

    <!--生产环境-->
    <springProfile name="pro">
        <!-- 将debug日志输出到文件 -->
        <logger name="com.unipower" level="DEBUG" additivity="true">
            <appender-ref ref="debugOnlyAppender"/>
        </logger>

        <root level="info">
            <appender-ref ref="consoleDenyDebugAppender"/>
<!--            <appender-ref ref="appLogAppender"/>-->
        </root>
    </springProfile>

</configuration>
AD:【腾讯云服务器大降价】2核4G 222元/3年 1核2G 38元/年
正文完
 0
阿蛮君
版权声明:本站原创文章,由 阿蛮君 于2024-12-17发表,共计11421字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
Copyright © 2022-2024 阿蛮君博客 湘ICP备2023001393号
本网站由 亿信互联 提供云计算服务 | 蓝易云CDN 提供安全防护和加速服务
Powered by Wordpress  Theme by Puock