手把手教你SpringBoot整合日志框架,并附录Log4j2的常用标签大全

news2024/7/11 2:46:50

前言:

日志是平时在项目中必不可少的东西,下面是SpringBoot3整合日志框架的一些基本要领,主要分为一下几步:

  1. 导入日志相关依赖
  2. 配置日志相关功能
  3. 实际使用日志

导入日志相关依赖

如果是SpringBoot项目,只要导入 spring-boot-starter依赖就不用自己再去整理日志相关依赖了。因为spring-boot-starter依赖包含了日志相关的依赖。
下面是常用的日志接口,以及日志实现的一些框架:
image.png
日志门面:只提供日志相关的接口定义,即相应的 API,而不提供具体的接口实现。日志门面在使用时,可以动态或者静态地指定具体的日志框架实现,解除了接口和实现的耦合,使用户可以灵活地选择日志的具体实现框架。
日志系统:与日志门面相对,它提供了具体的日志接口实现,应用程序通过它执行日志打印的功能。
SpringBoot默认使用了logback + slf4j 组合作为默认底层日志。
在SpringBoot的起步依赖(指spring-boot-starter-xxx)中基本都基本都会包含一个spring-boot-starter依赖。
比如我们需要开发一个web项目,那么只需要添加下面依赖就可以了:

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

该依赖内部包含了spring-boot-starter依赖,如图1-1:
图1-1
再点进spring-boot-starter的内部就会发现有一个叫做spring-boot-starter-logging的依赖,如图1-2。
图1-2
这就是SpringBoot为我们整合好的日志框架,开箱即用。

配置日志相关功能

记录日志

Logger logger = LoggerFactory.getLogger(getClass());

或者使用Lombok@Slf4j注解

日志级别

既然已经导入了日志相关依赖,那现在就需要看看和日志相关的都有哪些配置,首先我们先来了解一下日志的输出级别。
日志的输入级别由低到高分别为:TRACE, DEBUG, INFO, WARN, ERROR
日志级别可以设置配置有以下几种:

  • ALL:打印所有日志(但是sf4j没有这个配置)
  • TRACE:追踪框架详细流程日志,一般不使用
  • DEBUG:开发调试细节日志
  • INFO:关键、感兴趣信息日志(也是默认的日志级别)
  • WARN:警告但不是错误的信息日志,比如:版本过时
  • ERROR:业务错误日志,比如出现各种异常
  • FATAL:致命错误日志,比如jvm系统崩溃
  • OFF:关闭所有日志记录

比如当我们把日志级别设置为INFO时,那么就只会打印指定级别及以上级别的日志。

example:

# 配置日志打印级别
logging.level.root=info
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
    private Logger logger =  LoggerFactory.getLogger(getClass());

    @RequestMapping("/")
    public String hello(){
        logger.trace("trace 日志打印......");
        logger.debug("debug 日志打印......{}");
        logger.info("info 日志打印......");
        logger.warn("warn 日志打印......");
        logger.error("error 日志打印......");
        return "Hello World!";
    }
}

因为这里没有配置项目端口号,所以默认是8080,当我访问 http://localhost:8080/ 时控制台输出结果如图1-3,但是如果我们不显式配置日志级别为INFO,默认的日志级别也是INFO
图1-3

日志格式

除了控制日志的级别,我们还可以控制日志的打印格式,可以通过logging.pattern.consolelogging.pattern.file进行配置,前者是控制控制台的打印格式,后者是控制日志文件的打印格式。

example:
这里以logging.pattern.console举例。

# 配置日志打印级别
logging.level.root=info
# 控制日志控制台输出格式
logging.pattern.console=%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd'T'HH:mm:ss}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}

这里我设置的日志格式其实就参照SpringBoot默认的日志格式做了一些小小的更改,也就是时间输出上面的调整,改成了年月日时分秒的形式,省去了后面的单位。
默认值:参照:spring-bootadditional-spring-configuration-metadata.json文件
默认输出格式值:%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd'T'HH:mm:ss.SSSXXX}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}
如图1-4和图1-5,前者是我自定义了日志格式后的输出,后者是SpringBoot默认的日志格式输出。
图1-4
图1-5
除了对日期格式上面的更改,我们还可以进行其他更多的定制化日志输出格式。并且更改SpringBoot日志输出格式的日期还可以采用另一种形式设置:

logging.pattern.dateformat=yyyy-MM-dd HH:mm:ss

日志分组

日志分组是一个比较有用的技巧,比如将相关的logger分组在一起,统一配置。SpringBoot 也支持。比如:Tomcat 相关的日志统一设置:

logging.group.tomcat=org.apache.catalina,org.apache.coyote,org.apache.tomcat
logging.level.tomcat=trace

logging.group.后面是可以任意自定义名称的,你可以写成logging.group.aaa或者logging.group.bbb都是可以的。这样当你再用logging.level.xxx配置日志级别的时候,就只是对你配置的那些路径生效。
或者说你只有一个类是特殊的,那么你也可以logging.level加上包名进行设置,比如:

# 制定单个类设置日志级别
logging.level.com.fjc.demo01.controller.HelloController=warn

文件输出

SpringBoot 默认只把日志写在控制台,如果想额外记录到文件,可以在application.properties中添加logging.file.name or logging.file.path配置项。
1、SpringBoot3-快速入门

example:

# 指定日志路径及名称
logging.file.name=logs/server.log

文件归档与滚动切割

归档:每天的日志单独存到一个文档中。
切割:每个文件10MB,超过大小切割成另外一个文件。tips:文件大小可自定义

  1. 每天的日志应该独立分割出来存档。如果使用logback(SpringBoot 默认整合),可以通过application.properties/yaml文件指定日志滚动规则。
  2. 如果是其他日志系统,需要自行配置(添加log4j2.xml或log4j2-spring.xml)
  3. 支持的滚动规则设置如下
    | 配置项 | 描述 |
    | — | — |
    | logging.logback.rollingpolicy.file-name-pattern | 日志存档的文件名格式(默认值:${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz) |
    | logging.logback.rollingpolicy.clean-history-on-start | 应用启动时是否清除以前存档(默认值:false) |
    | logging.logback.rollingpolicy.max-file-size | 存档前,每个日志文件的最大大小(默认值:10MB) |
    | logging.logback.rollingpolicy.total-size-cap | 日志文件被删除之前,可以容纳的最大大小(默认值:0B)。设置1GB则磁盘存储超过 1GB 日志后就会删除旧日志文件 |
    | logging.logback.rollingpolicy.max-history | 日志文件保存的最大天数(默认值:7). |

接下来我把这些配置写进我们的项目中,然后开始测试它们各自的效果,通过测试发现,logging.logback.rollingpolicy.file-name-patternlogging.logback.rollingpolicy.max-file-sizelogging.logback.rollingpolicy.max-history这三个配置在使用中是实际生效的,剩下的两个配置再实际使用中并没有生效,不知道是版本原因还是什么问题,这里暂且不深入研究。
并且我发现logging.logback.rollingpolicy.max-file-size=1MB将文件最大大小设置为1MB进行切割,但是实际文件进行切割的大小并不是当日志文件达到1MB那么准确。这可能是由以下下几种原因导致的:

  1. 缓冲机制:日志系统通常会使用缓冲来提高性能。这意味着在写入日志事件和实际将其刷新到磁盘之间可能存在延迟。因此,即使日志文件大小达到配置的最大值,实际的文件切割可能也会稍有延迟。
  2. 文件大小测量:Logback 通常在写入日志事件时测量文件大小。由于写入操作的原子性,文件大小可能在短时间内超过配置的最大值。
  3. 多线程写入:在多线程环境中,多个线程可能同时写入日志文件,这可能导致文件大小在短时间内超过预期。

关于 Logback 的切割规则,通常遵循以下步骤:

  1. 当日志文件达到配置的最大大小时,Logback 会关闭当前日志文件。
  2. Logback 会创建一个新的日志文件来继续记录日志事件。
  3. 关闭的日志文件通常会保留,直到达到配置的最大历史记录限制。超过此限制的旧日志文件将被删除。
# 日志存档的文件名格式(默认值:${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz)
logging.logback.rollingpolicy.file-name-pattern=${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz
# 存档前,每个日志文件的最大大小(默认值:10MB)
logging.logback.rollingpolicy.max-file-size=1MB
# 应用启动时是否清除以前存档(默认值:false)
logging.logback.rollingpolicy.clean-history-on-start=true
# 日志文件被删除之前,可以容纳的最大大小(默认值:0B)。设置1GB则磁盘存储超过 1GB 日志后就会删除旧日志文件
logging.logback.rollingpolicy.total-size-cap=1MB
# 日志文件保存的最大天数(默认值:7).
logging.logback.rollingpolicy.max-history=1

切换日志框架

除了SopringBoot自带的logback框架,我们还有更好的选择,那就是log4j2,下面是它们两者的区别:

  1. 架构和性能:Log4j2 采用了新的架构设计,相较于之前的版本以及 LogBack,它在性能方面有了显著的提升。
  2. API支持:Log4j2 原生支持 SLF4J、Log4j、Commons Logging 等多种日志 API,而 LogBack 主要支持 SLF4J。
  3. 配置方式:LogBack 的配置被认为更直观和灵活,而 Log4j2 也提供了 XML、YAML、JSON 等多种配置方式,以及更加动态的配置能力。

log4j2log4j 1.x 的升级版,参考了logback的一些优秀的设计,并且修复了一些问题,带来了一些重大的提升,在异步方面的性能得到了巨大提升。所以在日常开发中我们完全可以选择用性能更好的log4j2来代替它。那么该如何切换日志框架的,接再来是具体操作。

  1. 因为SpringBoot有默认的日志框架,所以我们需要先排除掉默认日志框架,避免冲突。
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
  1. 排除以后,导入log4j2。这样我们使用的框架组合就变成了slf4j + log4j2
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>

导入log4j2以后,它的默认配置都在spring-boot-3.1.5.jar包下面,我们可以从下图1-7中看到:
图1-7
从中我们可以看到它是有两个配置文件的,一个对控制台进行配置,一个对日志文件进行配置。我们自己如果声明这两个配置文件,那么机会覆盖默认配置,以为我们的为准。

  1. 编辑配置文件,这里我们之前的配置基本上是不用变的,以下这些时都会生效的。
# 配置日志打印级别
logging.level.root=info
# 配置日志时间输出格式
logging.pattern.dateformat=yyyy-MM-dd HH:mm:ss.SSS
# 指定日志路径及名称
logging.file.name=boot3-demo01/logs/server.log
# 日志分组
logging.group.tomcat=org.apache.catalina,org.apache.coyote,org.apache.tomcat
logging.level.tomcat=info
# 制定单个类设置日志级别
logging.level.com.fjc.demo01.controller.HelloController=warn

如果也想使用log4j2进行归档与滚动切割的操作,可以创建log4j2-spring.xml进行配置,下面是关于log4j2-spring.xml比较全面的配置,可以直接copy使用。
首先在application.properties里面加上logging.config=classpath:log4j2-spring.xml,然后在resources目录下创建一个log4j2-spring.xml,最后写入下面配置就可以了。

<?xml version="1.0" encoding="UTF-8"?>
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<configuration monitorInterval="5">
    <!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
    <!--变量配置-->
    <Properties>
        <!-- 格式化输出:%date表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %msg:日志消息,%n是换行符-->
        <!-- %logger{36} 表示 Logger 名字最长36个字符 -->
        <Property name="LOG_EXCEPTION_CONVERSION_WORD">%xwEx</Property>
        <Property name="LOG_LEVEL_PATTERN">%5p</Property>
        <Property name="LOG_DATEFORMAT_PATTERN">yyyy-MM-dd HH:mm:ss.SSS</Property>
        <Property name="LOG_PATTERN">%clr{%d{${sys:LOG_DATEFORMAT_PATTERN}}}{faint} %clr{${sys:LOG_LEVEL_PATTERN}} %clr{%pid}{magenta} %clr{---}{faint} %clr{[%15.15t]}{faint} %clr{%-40.40c{1.}}{cyan} %clr{:}{faint} %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD}</Property>
        <Property name="FILE_LOG_PATTERN">%d{${sys:LOG_DATEFORMAT_PATTERN}} ${sys:LOG_LEVEL_PATTERN} %pid --- [%t] %-40.40c{1.} : %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD}</Property>
        <!-- 定义日志存储的路径 -->
        <property name="FILE_PATH" value="logs/" />
        <property name="FILE_NAME" value="server.log" />
    </Properties>

    <appenders>
        <!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
        <RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/${FILE_NAME}" filePattern="${FILE_PATH}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}_%i.log.gz">
            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="${FILE_LOG_PATTERN}" charset="UTF-8"/>
            <Policies>
                <!--interval属性用来指定多久滚动一次,默认是1 hour-->
                <TimeBasedTriggeringPolicy interval="1"/>
                <!--size属性用来指定存档前,每个日志文件的最大大小(默认值:10MB)-->
                <SizeBasedTriggeringPolicy size="1MB"/>
            </Policies>
            <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
            <DefaultRolloverStrategy max="7"/>
        </RollingFile>

        <!--错误信息单独归档-->
        <RollingFile name="RollingFileError" fileName="${FILE_PATH}/error.log" filePattern="${FILE_PATH}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}_%i.log.gz">
            <PatternLayout pattern="${FILE_LOG_PATTERN}" charset="UTF-8"/>
            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
            <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
            <Policies>
                <!--interval属性用来指定多久滚动一次,默认是1 hour-->
                <TimeBasedTriggeringPolicy interval="1"/>
                <SizeBasedTriggeringPolicy size="1MB"/>
            </Policies>
            <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
            <DefaultRolloverStrategy max="7"/>
        </RollingFile>

        <console name="Console" target="SYSTEM_OUT">
            <!--输出日志的格式-->
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <!-- 控制台只输出level及其以上级别的信息
                如果这里配置再这里又定义了日志级别,那么外部引入改配置的日志级别会不生效!	-->
            <!--            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>-->
        </console>

    </appenders>

    <!--Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。-->
    <!--然后定义loggers,只有定义了logger并引入的appender,appender才会生效-->
    <loggers>

        <!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
        <logger name="org.mybatis" level="info" additivity="false">
            <AppenderRef ref="Console"/>
        </logger>
        <!--监控系统信息-->
        <!--若是additivity设为false,则子Logger 只会在自己的appender里输出,而不会在 父Logger 的appender里输出。-->
        <Logger name="org.springframework" level="info" additivity="false">
            <AppenderRef ref="Console"/>
        </Logger>

        <!-- 指定路径的日志打印级别 -->
<!--        <logger name="com.fjc.demo01.controller.HelloController" level="trace" additivity="false">-->
<!--            <AppenderRef ref="Console"/>-->
<!--        </logger>-->

        <root level="info">
            <appender-ref ref="Console"/>
            <appender-ref ref="RollingFileInfo"/>
            <appender-ref ref="RollingFileError"/>
        </root>
    </loggers>

</configuration>
  1. 记录日志,看下效果。

image.png
可以看到我们对HelloController设置的日志级别为warn,控制台只打印了warn以及以上的日志级别。

总结

  1. 导入任何第三方框架,先排除它的日志包,因为Boot底层控制好了日志
  2. 修改 application.properties 配置文件,就可以调整日志的所有行为。如果不够,可以编写日志框架自己的配置文件放在类路径下就行,比如logback-spring.xmllog4j2-spring.xml
  3. 如需对接专业日志系统,也只需要把 logback 记录的日志灌倒** kafka**之类的中间件,这和SpringBoot没关系,都是日志框架自己的配置,修改配置文件即可
  4. 业务中使用slf4j-api记录日志。不要再 sout 了

附加:log4j2 框架的标签说明书

Appenders 标签

  • 用处
    Appenders 标签用于定义日志事件的目标,即日志信息应该被发送到哪里。Appenders 负责将日志事件传递到其目标,这可能包括控制台、文件、数据库等。
  • 属性
    • Appenders 标签本身没有直接的属性,但它可以包含多个子元素,每个子元素都代表一个特定的 Appender。这些 Appender 可能有自己的属性,例如:
      • name:Appender 的名称,用于在其他配置中引用。
      • type:指定 Appender 的类型,如 Console、File、RollingFile 等。
      • 其他特定于 Appender 的属性,如 fileName(用于 FileAppender)或 pattern(用于 PatternLayout)。
Properties 标签
  • 用处
    • Properties 标签用于定义配置文件中使用的属性。这些属性可以在配置文件的多个位置引用,提供了一种在多个地方重复使用值的方式。
  • 属性
    • Properties 标签通常包含多个 Property 子元素,每个子元素都定义一个属性。
Property标签
  • 用处
    • Property 标签用于在 Properties 标签内部定义单个属性。这些属性可以在配置文件的其他位置通过 ${propertyName} 的形式引用。
  • 属性
    • name:属性的名称,用于在配置文件中引用。
    • value:属性的值。
Console 标签
  • 用处:
    • 在 Log4j2 框架中,Console 标签用于定义输出到控制台的 Appender。这意味着,通过配置 Console Appender,你可以控制应用程序中产生的日志消息如何被输出到控制台(通常是命令行界面或终端)。这对于在开发过程中快速查看和调试日志信息非常有用。
  • 属性:
    • name
      • 用来指定 Appender 的名字。这个名称可以在其他配置部分(如 Loggers)中引用。
    • target
      • 指定日志消息应该被输出到的控制台目标。常见的值有 SYSTEM_OUT(对应于 Java 的 System.out)和 SYSTEM_ERR(对应于 Java 的 System.err)。默认情况下,如果不指定 target 属性,通常会使用 SYSTEM_OUT。
    • follow
      • 一个可选属性,表示是否可以通过 System.setOut 或 System.setErr 来重新指定输出位置为 System.out 或 System.err。不过,在大多数应用中,这个属性并不常用,且其默认行为可能依赖于具体的 Log4j2 实现和配置。
    • PatternLayout(子节点):
      • 用于定义日志消息的格式。如果不设置 PatternLayout,则默认的输出格式可能是 %m%n(即仅输出消息内容和换行符)。但是,在实际应用中,通常会指定一个更复杂的模式字符串来包含日期、时间、日志级别、线程名、类名等信息。
      • pattern:在 PatternLayout 子节点中,pattern 属性用于指定日志消息的格式。这个属性接受一个模式字符串,其中可以包含各种占位符来插入日志事件的不同部分(如日期、时间、日志级别、消息内容等)。
RollingFile 标签
  • 用处
    • RollingFile 是 Log4j2 中的一个 appender,用于将日志记录到文件,并根据一定的策略滚动这些文件。
  • 属性
    • name
      • 指定 appender 的名称。这个名称可以在其他配置部分(如 loggers)中引用。
    • fileName
      • 指定日志文件的当前(活动)文件名。这通常是一个完整的路径名,包括文件名和扩展名。
    • filePattern
      • 当日志文件滚动时,用于生成新文件名的模式。这个模式通常包含日期和时间的占位符,以便为每个滚动文件生成唯一的名称。
    • append
      • 如果为 true,日志将被追加到现有的文件中。如果为 false(或未指定),则会覆盖现有文件的内容(如果文件已存在)。默认值为 true。
    • bufferedIO
      • 如果为 true,使用缓冲的 I/O 来写入日志文件。这可以提高性能,但可能会增加在应用程序崩溃时丢失日志数据的风险。默认值为 false。
    • bufferSize
      • 如果 bufferedIO 为 true,则此属性指定缓冲区的大小(以字节为单位)。
    • Policies
      • 包含一个或多个策略元素,这些策略定义了何时滚动日志文件。例如,TimeBasedTriggeringPolicy 用于基于时间滚动文件,而 SizeBasedTriggeringPolicy 用于基于文件大小滚动文件。
    • PatternLayout (子节点):
      • 指定用于格式化日志消息的布局。PatternLayout 是最常用的布局,它允许你使用模式字符串来定义日志消息的格式。
    • Filters(可选):
      • 可以包含一个或多个过滤器,用于确定哪些日志事件应该被处理或拒绝。例如,ThresholdFilter 可以用于过滤掉级别低于特定阈值的日志事件。
    • DefaultRolloverStrategy(可选):
      • 用于定义滚动策略的属性,例如 max 属性,该属性指定了在删除最旧的滚动文件之前可以保留的最大文件数。
    • immediateFlush(可选):
      • 如果为 true,则每次写入日志事件后都会立即刷新缓冲区。这会增加 I/O 开销,但可以减少在应用程序崩溃时丢失日志数据的风险。默认值为 false。
    • ignoreExceptions(可选):
      • 如果为 true,则在尝试写入日志时发生异常时,将忽略这些异常并记录一条错误消息。这可以防止由于日志写入问题而导致应用程序崩溃。默认值为 false。
PatternLayout 标签
  • 用处
    • PatternLayout 标签用于定义日志事件的输出格式。通过配置 PatternLayout,可以自定义日志消息中显示的字段和它们的顺序,如日期、时间、日志级别、线程名、类名、方法名、行号以及实际的日志消息内容等。
  • 属性
    • pattern:用于定义日志消息的格式。该属性接受一个模式字符串,其中可以包含各种占位符来插入日志事件的不同部分。例如:%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg %n。
ThresholdFilter 标签
  • 用处
    • ThresholdFilter 标签用于过滤日志事件,根据日志事件的级别来决定是否接受或拒绝该事件。它允许你设置一个阈值,只有级别达到或超过该阈值的日志事件才会被处理。
  • 属性
    • level:指定过滤的阈值级别。例如,如果设置为 ERROR,则只有 ERROR 级别及以上的日志事件才会被处理。
    • onMatch:当日志事件的级别与配置的级别匹配时执行的操作。可能的值有 ACCEPT(接受)、DENY(拒绝)或 NEUTRAL(中立)。
    • onMismatch:当日志事件的级别与配置的级别不匹配时执行的操作。同样地,可能的值有 ACCEPT、DENY 或 NEUTRAL。
Policies 标签
  • 用处
    • Policies 标签用于定义滚动文件的策略,即何时应该滚动(即创建新的)日志文件。它通常包含多个策略元素,这些策略共同决定了滚动文件的条件。
  • 属性(注意:Policies 本身没有直接的属性,但其内部可以包含多种策略元素):
    • 策略元素(如 TimeBasedTriggeringPolicy、SizeBasedTriggeringPolicy 等)各自具有自己的属性。
TimeBasedTriggeringPolicy 标签
  • 用处
    • TimeBasedTriggeringPolicy 标签定义了一个基于时间的滚动策略,即根据时间间隔来滚动日志文件。
  • 属性
    • interval:指定两次封存动作之间的时间间隔。单位:以日志的命名精度来确定单位, 比如yyyy-MM-dd-HH 单位为小时,yyyy-MM-dd-HH-mm 单位为分钟。
    • modulate:一个可选属性,用于控制是否应该根据每天的特定时间(如午夜)来滚动文件。如果设置为 true,则滚动会在每天的指定时间(默认为午夜)发生。
  • 示例:

假设我们想要每小时滚动一次日志文件,并且我们想要确保滚动总是在每个小时的开始发生(即 00:00, 01:00, 02:00, …):

<RollingFile name="RollingFile" fileName="logs/app.log" filePattern="logs/app-%d{yyyy-MM-dd-HH}.log.gz">  
    <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n"/>  
    <Policies>  
        <TimeBasedTriggeringPolicy interval="1" modulate="true"/>  
    </Policies>  
    <DefaultRolloverStrategy max="24"/> <!-- 假设我们只想保留过去24小时的日志 -->  
</RollingFile>

在这个示例中,由于 modulate=“true”,无论何时启动应用程序或何时发生第一次日志写入,滚动都会在每个小时的开始时发生。如果应用程序在 03:15 首次启动并开始记录日志,第一个滚动事件将立即发生(创建 app-yyyy-MM-dd-03.log),但之后的滚动事件将分别在 04:00, 05:00, … 等时间发生。
如果 modulate 被设置为 false 或省略(因为默认值是 false),则滚动将在达到 interval 指定的时间间隔后立即发生,而不考虑当前的具体时间。这可能导致滚动事件发生在非整点的时间。

SizeBasedTriggeringPolicy 标签
  • 用处:
    • SizeBasedTriggeringPolicy 标签定义了一个基于文件大小的滚动策略,即当日志文件达到指定的大小时,会触发滚动(即创建新的)日志文件。这对于防止日志文件变得过大,从而耗尽磁盘空间非常有用。
  • 属性:
    • size:指定滚动的大小阈值。这个值可以是一个数字,后面跟着一个大小单位,如 “KB”、“MB” 或 “GB”。例如,size=“250 MB” 表示当日志文件达到 250 兆字节时,会触发滚动。

Loggers 标签

  • 用处
    • Loggers标签是Log4j2配置文件中的一个关键部分,它包含了日志记录器的配置。
    • 每个Logger元素代表了一个日志记录器的配置,它定义了日志消息的输出级别、输出目的地(通过AppenderRef引用)以及其他相关设置。
  • 属性
    • Loggers标签本身通常不包含属性,而是包含多个Logger子标签。
    • 每个Logger子标签可以具有以下属性:
      • name:指定日志记录器的名称,通常是类的全限定名或包名。
      • level:设置日志级别,如TRACE、DEBUG、INFO、WARN、ERROR等。
      • additivity:是否向上级日志记录器传递日志事件,默认为true。
      • 其他自定义属性,根据具体需求设置。
Logger 标签
  • 属性:
    • name:这是标签的主要属性,用于指定日志记录器的名称。通常,这个名称是类的全限定名,或者是某个特定的包名。
    • level:此属性用于设置日志记录器的日志级别。常见的日志级别有TRACE、DEBUG、INFO、WARN、ERROR、FATAL和OFF。只有级别等于或高于指定级别的日志事件才会被记录。
    • additivity:这是一个布尔属性,用于指定是否将此日志记录器的日志事件传递给其上级日志记录器。默认值为true。
    • includeLocation:这是一个可选的布尔属性,用于指定是否包括日志事件的源代码位置信息(如类名、方法名和行号)。默认为false。
  • 子标签:
    • :此子标签用于引用一个或多个Appender,指定日志消息应该输出到哪些位置。标签的ref属性用于指定要引用的Appender的名称。
  • 示例:

以下是一个简单的示例,展示了如何配置一个名为"com.example"的日志记录器,将其日志级别设置为INFO,并将日志输出到名为"Console"和"File"的Appender:

<Loggers>  
   <!-- name 属性可以执行某个包下的日志配置 -->
    <Logger name="com.example" level="info" additivity="false">  
        <AppenderRef ref="Console"/>  
        <AppenderRef ref="File"/>  
    </Logger>  
    <!-- 其他Logger配置 -->  
    <Root level="error">  
        <AppenderRef ref="Console"/>  
    </Root>  
</Loggers>
Root 标签
  • 用处
    • Root标签定义了根日志记录器的配置。
    • 根日志记录器是日志记录器层次结构的顶点,所有其他日志记录器都是它的子节点。
    • 通过配置Root标签,可以设置全局的日志级别和输出目的地。
  • 属性
    • level:设置根日志记录器的日志级别,如TRACE、DEBUG、INFO、WARN、ERROR等。
AppenderRef 标签
  • 用处
    • AppenderRef标签用于引用一个或多个Appender配置。
    • Appender定义了日志消息的输出目的地,如控制台、文件、数据库等。
    • 通过在Logger或Root标签中包含AppenderRef子标签,可以指定日志消息应该输出到哪些目的地。
  • 属性
    • ref:引用Appender配置的名称,该名称必须与Appender配置中的name属性相匹配。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1860267.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Elasticsearch的快照

ES的快照是什么&#xff1f; snapshot是一个ES集群或者某个指定索引的备份&#xff0c;快照一般用在 不停机的状态下对ES集群进行备份当硬件故障时恢复集群数据用于跨集群的数据迁移对冷数据或冻结数据做快照以降低存储成本&#xff0c;依赖于可搜索的快照。-收费功能 一个快…

CRMEB 多门店后台登录入口地址修改(默认admin)

一、>2.4版本 1、修改后端 config/admin.php 配置文件,为自定义的后缀 2、修改 平台后台前端源码中 view/admin/src/settings.js 文件,修改为和上面一样的配置 3、修改后重新打包前端代码,并且覆盖到后端的 public 目录下&#xff1a;打包方法 4、重启swoole 二、<2.4版…

如何评估LabVIEW需求中功能的必要性和可行性

评估LabVIEW需求中功能的必要性和可行性涉及多个方面的分析&#xff0c;包括需求的重要性、技术可行性、资源需求以及潜在风险。以下是一个详细的评估方法&#xff1a; ​ 一、功能必要性评估 需求来源和目的&#xff1a; 来源&#xff1a;需求来自哪里&#xff1f;是客户、市…

HR3.0时代,人力资本效能如何进化?| 易搭云DHR

宏观经济增速放缓、市场竞争激烈&#xff0c;对各行各业、各种岗位都面临更大挑战&#xff0c;如何降本增效还是每个企业主的关注焦点。 企业的主要支出往往是员工成本&#xff0c;总体上超过企业总开支的75%&#xff0c;轻资产类型的企业甚至可能超80%&#xff0c;但裁员、加班…

监督学习(二)线性分类

每个样本都有标签的机器学习称为监督学习。根据标签数值类型的不同&#xff0c;监督学习又可以分为回归问题和分类问题。分类和回归是监督学习的核心问题。 回归(regression)问题中的标签是连续值。分类(classification)问题中的标签是离散值。分类问题根据其类别数量又可分为…

紧贴国家大战略需求,聚焦当前行业热点-海云安D10入选第四届香蜜湖金融科技创新奖拟奖项目

近日&#xff0c;第四届香蜜湖金融科技创新奖终审总结会在深圳市福田区湾区国际金融科技城成功举办&#xff0c;活动现场&#xff0c;专家评审委员会最终揭晓25个拟奖项目。海云安“开发者安全助手系统”项目&#xff0c;实力入选第四届香蜜湖金融科技创新奖-优秀项目奖。 1、香…

电源集成:智能真无线耳机设计中的通信接口

真无线耳机&#xff08;TWS 耳机&#xff09;由于电池寿命更长、功能更强大、设计更吸引人以及价格更优惠&#xff0c;因此继续变得更具吸引力。随着耳机制造商专注于小型化和设计改进&#xff0c;并迅速采用功能来增强用户体验&#xff0c;他们能够在强大且竞争激烈的市场中吸…

Swift Combine — Debounce和Throttle的理解与使用

Debounce 和 Throttle 是两种常用的操作符&#xff0c;用于控制数据流的频率和处理延迟。但它们的实现方式略有不同。理解这些差异对于在Combine代码中做出正确选择至关重要。 Debounce Debounce 操作符用于限制数据流的频率&#xff0c;只有在指定的时间间隔内没有新数据到达…

项目管理的六个核心内容

项目管理是一个系统性和综合性的过程&#xff0c;涉及多个核心内容的协同管理&#xff0c;以确保项目能够按时、按预算、高质量的完成&#xff0c;以下是项目管理的六个核心内容&#xff1a; 一、项目目标与范围 项目目标与范围是项目管理的起点和基础&#xff0c;在项目启动…

【linux网络(六)】IP协议详解

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux网络 1. 前言2. IP协议报…

AI大模型企业应用实战(23)-Langchain中的Agents如何实现?

0 前言 这将所有可用的代理按照几个维度进行分类。 预期模型类型 用于聊天模型&#xff08;接收信息&#xff0c;输出信息&#xff09;或 LLM&#xff08;接收字符串&#xff0c;输出字符串&#xff09;。这主要影响所使用的提示策略。 支持聊天历史记录 这些代理类型是否…

Cesium--旋转3dtiles

以下代码来自Cesium 论坛&#xff1a;3DTileset rotation - CesiumJS - Cesium Community 在1.118中测试可行&#xff0c;可直接在Sandcastle中运行&#xff1a; const viewer new Cesium.Viewer("cesiumContainer", {terrain: Cesium.Terrain.fromWorldTerrain()…

零基础小白应该如何安装Python?(包含Windows、MacOS、Linux)

1. 安装前的准备工作 在安装Python之前&#xff0c;我们需要了解以下几个问题&#xff1a; 确保计算机连接到互联网确认操作系统版本&#xff08;Windows、MacOS、Linux&#xff09;决定安装Python的版本&#xff08;建议安装最新的稳定版本&#xff09; 2. 在Windows上安装…

docker技术的说明

根据学习网站整理&#xff1a;Docker 10分钟快速入门_哔哩哔哩_bilibili 小白也能看懂的容器科普说明_哔哩哔哩_bilibili 1.虚拟机&#xff0c;需要模拟硬件系统、运行整个操作系统&#xff0c;但体积臃肿&#xff0c;内存占用较高&#xff0c;程序的性能也会受到影响。 2.…

无中心化崛起:Web3对传统互联网的冲击与重构

随着Web3技术的兴起&#xff0c;传统互联网面临着前所未有的挑战和重构。本文将深入探讨Web3的无中心化特性如何对传统互联网产生冲击&#xff0c;以及其可能带来的重大影响和未来发展趋势。 1. 传统互联网的局限与问题 传统互联网&#xff0c;通常称为Web2&#xff0c;主要依…

Go 如何使用指针灵活操作内存

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

Vue3整合Tailwindcss实现渲染动态类

创建项目 pnpm create vite整合Tailwindcss 安装依赖&#xff1a; pnpm install -D tailwindcss postcss autoprefixer生成配置文件&#xff1a; npx tailwindcss initpostcss.config.js export default {plugins: {tailwindcss: {},autoprefixer: {},}}tailwind.config.j…

【产品经理】订单处理10-分配快递策略

本次主要讲解下在订单处理过程中分配快递的策略以及分配快递中需要用到的设置。 一、建立快递档案 在ERP系统中&#xff0c;需要建立快递档案&#xff0c;设置所属快递、快递的服务类型、支持的打印模版以及快递在各个平台的电子面单支持情况。 二、仓库绑定快递 仓库需要设…

golang 实现继承方式

经常使用java或c同学应该比较了解纯面向对象&#xff0c;继承、接口、封装等特性&#xff0c;在go中并没有特别显示的表达出来&#xff0c;但是go隐含是支持的&#xff0c;只是支持的方式不一致&#xff0c;可以说go的方式更加灵活&#xff0c;go语言精髓是组合机制&#xff0c…

一口气安装【Python】教程

浏览器搜索python&#xff0c;或者直接跳转网址。 https://www.python.orghttps://www.python.org/ 找到想下载的版本 根据自己电脑下载相应的版本 自定义安装 下一步 修改路径&#xff0c;然后点击安装 等待一会&#xff0c;喝个饮料 点击关闭 安装成功 安装结束