使用logback配置日志打印策略

时间:2025-03-18 21:24:55

        

目录

配置详解

1、父标签configuration

2、两种属性标签

3、三个节点标签

3.1、append节点标签

3.2、root节点标签

3.3、logger节点标签

3.4、logger和root的关系

4、完整日志配置


        logback在springboot中有内置的存在,当然也可以再重新引用依赖,但是没必要。logback框架可以控制日志日志的打印级别、打印内容、还可以实现error级别日志报警,将其发送到指定邮箱或者钉钉。

配置详解

        在配置文件中,按标签的级别来分,有一个父标签,两种属性标签和和三种节点标签。分别是

 一个父标签:configuration
  两种属性:contextName和property
  三个节点:appender、root、logger

springboot配置文件的加载顺序->->

1、父标签configuration

configuration最外层标签,该标签有三个属性:

  • scan
    当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true
  • scanPeriod
    设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
  • debug
    当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
<configuration  scan="true" scanPeriod="10 seconds" debug="true">
</configuration>

2、两种属性标签

        contextName和property是处于第二层的标签。

contextName

        <contextName>标签用于指定日志上下文的名称。日志上下文是Logback框架中的一个重要概念,它表示一个独立的日志实例或日志环境。通过设置不同的上下文名称,您可以创建并配置多个独立的日志记录器,每个日志记录器可以有自己的日志级别、输出目标等配置。

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

<contextName>logback_demo</contextName>

</configuration>

property

        用来定义变量值的标签, 有两个属性,name和value;其中name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。

<property name="log-path" value="" />

3、三个节点标签

        三个节点标签分别是append、logger、root

3.1、append节点标签

        这个标签属于核心标签,用于定义日志的输出目标。它指定了日志消息将发送到哪里,例如控制台、文件、数据库等。

标签属性:

  • name:指定appender的名称,应该是唯一的。
  • class:指定appender的实现类。例如,表示控制台输出,表示文件输出。
  • 其他属性:具体取决于所选的appender类,例如文件路径、文件滚动策略等。

控制台输出时子标签:

  • <filter>:标签用于配置日志事件过滤器,可以根据特定的条件过滤和控制日志输出。
  • <encoder>:ancoder的意思是追加器,在这里可以理解为渲染器,用来指定日志输出的格式。
  • <rollingPolicy> :日志记录器的滚动策略,按日期,按大小记录,只有在输出到文本中时才需要配置这个。

控制台打印示例:

<!--0. 日志格式和颜色渲染 -->
<!-- 彩色日志依赖的渲染类 -->
<conversionRule conversionWord="clr" converterClass="" />
<conversionRule conversionWord="wex" converterClass="" />
<conversionRule conversionWord="wEx" converterClass="" />
<!-- 彩色日志格式 -->
<property name="CONSOLE_LOG_PATTERN" value="%green(%d{yyyy-MM-dd HH:mm:}) [%thread] %highlight(%-5level) %red(%logger{50}) - %yellow(%msg) %n"/>


<!--1. 输出到控制台-->
<appender name="CONSOLE" class="">
    <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
    <filter class="">
        <level>debug</level>
    </filter>
    <encoder>
        <!-- %d表示时间
            %thread表示线程名
            %-5level 表示日志级别,允许以五个字符长度输出
            %logger{50}表示具体的日志输出者,比如类名,括号内表示长度
            %msg表示具体的日志消息,就是("xxx")中的xxx
            %n表示换行 -->
        <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
        <!-- 设置字符集 -->
        <charset>UTF-8</charset>
    </encoder>
</appender>

输出到文本时示例:

<!--2. 输出到文档-->
<!-- 2.1 level为 DEBUG 日志,时间滚动输出  -->
<appender name="DEBUG_FILE" class="">
    <!-- 正在记录的日志文档的路径及文档名 -->
    <file>${}/web_debug.log</file>
    <!--日志文档输出格式-->
    <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:} [%thread] %-5level %logger{50} - %msg%n</pattern>
        <charset>UTF-8</charset> <!-- 设置字符集 -->
    </encoder>
    <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
    <rollingPolicy class="">
        <!-- 日志归档 -->
        <!--如果第二天输出日志,会将当天的日志记录在<file>${}/log_debug.log</file>,然后将昨天的日志归档到下面的文件中-->
        <!--以天切分  %d{yyyy-MM-dd}-->
        <fileNamePattern>${}/web-debug-%d{yyyy-MM-dd}.%</fileNamePattern>
        <timeBasedFileNamingAndTriggeringPolicy class="">
            <!--单个日志文件最大100M,到了这个值,就会再创建一个日志文件,日志文件的名字最后+1-->
            <maxFileSize>100MB</maxFileSize>
        </timeBasedFileNamingAndTriggeringPolicy>
        <!--日志文档保留天数-->
        <maxHistory>15</maxHistory>
        <!--所有的日志文件最大20G,超过就会删除旧的日志-->
        <totalSizeCap>20GB</totalSizeCap>
    </rollingPolicy>
    <!-- 此日志文档只记录debug级别的及以上 -->
    <filter class="">
        <!-- 此日志文件只记录debug级别的
            onMatch和onMismatch都有三个属性值,分别为Accept、DENY和NEUTRAL 
            onMatch="ACCEPT" 表示匹配该级别及以上 
            onMatch="DENY" 表示不匹配该级别及以上 
            onMatch="NEUTRAL" 表示该级别及以上的,由下一个filter处理,如果当前是最后一个,则表 示匹配该级别及以上 
            onMismatch="ACCEPT" 表示匹配该级别以下 
            onMismatch="NEUTRAL" 表示该级别及以下的,由下一个filter处理,如果当前是最后一个,则不匹配该级别以下的 
            onMismatch="DENY" 表示不匹配该级别以下的 -->
        <level>debug</level>
        <onMatch>ACCEPT</onMatch>
        <onMismatch>DENY</onMismatch>
    </filter>
</appender>

3.2、root节点标签

该标签的作用就是指定都启用那个append,可以指定多个

<!--root配置必须在appender下边-->
<!--root节点是对所有appender的管理,添加哪个appender就会打印哪个appender的日志--> 
<!--root节点的level是总的日志级别控制,如果appender的日志级别设定比root的高,会按照appender的日志级别打印日志,--> 
<!--如果appender的日志级别比root的低,会按照root设定的日志级别进行打印日志--> 
<!--也就是说root设定的日志级别是最低限制,如果root设定级别为最高ERROR,那么所有appender只能打印*别的日志-->
<root level="DEBUG"> 
<!--<appender-ref ref="append中的名字" /> -->
  <appender-ref ref="CONSOLE" /> 
  <appender-ref ref="DEBUG_FILE" /> 
  <appender-ref ref="INFO_FILE" /> 
  <appender-ref ref="WARN_FILE" /> 
  <appender-ref ref="ERROR_FILE" /> 
</root>

3.3、logger节点标签

        logger与root是相对的,作用范围不同,root相当于是对真个项目做配置,logger就是对项目下某个包或者某个类单独做配置的,

该标签有两个属性

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

addtivity:是否向上级loger传递打印信息。默认是true。

<!-- logback为  中的包 --> 
<logger name="" level="debug" additivity="false"> 
  <!-- 指定打印配置-->
  <appender-ref ref="CONSOLE" /> 
</logger> 
<!-- logback为  这个类 --> 
<logger name="" level="INFO" additivity="true"> 
  <appender-ref ref="STDOUT"/> 
</logger>

3.4、logger和root的关系

  • root和logger是父子的关系。

logger的appender根据参数additivity决定是否要叠加root的appender,logger的级别是其自身定义的级别,和root的级别没什么关系。

  • logger对单个包或类添加配置,相当于局部配置,root相当于全局配置

如果logger里面配置了additivity=“false”,就会覆盖root的,只打印一遍;但是additivity=“true”,就会向上层再次传递,不会覆盖,而是打印两遍!

4、完整日志配置

将error日志打印到一个文件中,将其他日志打印到另一个文件夹中

<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文档如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文档是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。
                         当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration  scan="true" scanPeriod="10 seconds">
    <!--    -->
    <contextName>util_demo</contextName>
    <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义后,可以使“${}”来使用变量。 -->
    <property name="" value="" />
    <!-- scope="context",指定作用范围是整个上下文,name变量的名字,source从配置文件读取值作为变量的值-->
    <springProperty scope="context" name="springAppName" source=""/>
    <!--0. 日志格式和颜色渲染 -->
    <!-- 彩色日志依赖的渲染类 -->
    <conversionRule conversionWord="clr" converterClass="" />
    <conversionRule conversionWord="wex" converterClass="" />
    <conversionRule conversionWord="wEx" converterClass="" />
    <!-- 彩色日志格式 -->
    <property name="CONSOLE_LOG_PATTERN" value="%green(%d{yyyy-MM-dd HH:mm:}) [%thread] %highlight(%-5level) %red(%logger{50}) - %yellow(%msg) %n"/>
    <!--1. 输出到控制台-->
    <appender name="CONSOLE" class="">
        <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
        <filter class="">
            <level>debug</level>
        </filter>
        <encoder>
            <!-- %d表示时间
                %thread表示线程名
                %-5level 表示日志级别,允许以五个字符长度输出
                %logger{50}表示具体的日志输出者,比如类名,括号内表示长度
                %msg表示具体的日志消息,就是("xxx")中的xxx
                %n表示换行 -->
            <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
            <!-- 设置字符集 -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    <!--2. 输出到文档-->
    <!-- 2.1 level为 ERROR 日志,时间滚动输出  -->
    <appender name="ERROR_FILE" class="">
        <!-- 正在记录的日志文档的路径及文档名 -->
<!--        <file>${}/web_error.log</file>-->
        <!--日志文档输出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="">
            <fileNamePattern>${}/${springAppName}-error-%d{yyyy-MM-dd}.log</fileNamePattern>
            <!--日志文档保留天数-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <!-- 此日志文档只记录ERROR级别的 -->
        <filter class="">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!-- 2.2 level为 除error的日志,时间滚动输出  -->
    <appender name="INFO_FILE" class="">
        <!-- 正在记录的日志文档的路径及文档名 -->
<!--        <file>${}/web_info.log</file>-->
        <!--日志文档输出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
        </encoder>
        <!--滚动策略-->
        <rollingPolicy class="">
            <!--路径-->
            <fileNamePattern>${}/${springAppName}-info-%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <!-- 此日志文档只记录除ERROR级别以外的 -->
        <filter class="">
            <level>ERROR</level>
            <onMatch>DENY</onMatch>
            <onMismatch>ACCEPT</onMismatch>
        </filter>
    </appender>
    <!-- 异步输出 -->
    <appender name="ASYNC-INFO" class="">
        <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
        <queueSize>256</queueSize>
        <!-- 添加附加的appender,最多只能添加一个 -->
        <appender-ref ref="INFO_FILE"/>
    </appender>
    <appender name="ASYNC-ERROR" class="">
        <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
        <queueSize>256</queueSize>
        <!-- 添加附加的appender,最多只能添加一个 -->
        <appender-ref ref="ERROR_FILE"/>
    </appender>


    <!-- 4. 最终的策略 -->
    <root level="info">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="ASYNC-ERROR" />
        <appender-ref ref="ASYNC-INFO" />
    </root>
</configuration>

更详细的介绍参看这两篇博客,我也是看的这两个

配置文件标签(超详解) - 掘金 ()

logback整合Springboot及配置说明_logback-spring和logback同时存在_shanvlang的博客-****博客