前言:
日志是平时在项目中必不可少的东西,下面是SpringBoot3整合日志框架的一些基本要领,主要分为一下几步:
- 导入日志相关依赖
- 配置日志相关功能
- 实际使用日志
导入日志相关依赖
如果是SpringBoot项目,只要导入 spring-boot-starter
依赖就不用自己再去整理日志相关依赖了。因为spring-boot-starter
依赖包含了日志相关的依赖。
下面是常用的日志接口,以及日志实现的一些框架:
日志门面:只提供日志相关的接口定义,即相应的 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:
再点进spring-boot-starter
的内部就会发现有一个叫做spring-boot-starter-logging
的依赖,如图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
。
日志格式
除了控制日志的级别,我们还可以控制日志的打印格式,可以通过logging.pattern.console
或logging.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-boot
包additional-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默认的日志格式输出。
除了对日期格式上面的更改,我们还可以进行其他更多的定制化日志输出格式。并且更改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:文件大小可自定义
- 每天的日志应该独立分割出来存档。如果使用logback(SpringBoot 默认整合),可以通过application.properties/yaml文件指定日志滚动规则。
- 如果是其他日志系统,需要自行配置(添加log4j2.xml或log4j2-spring.xml)
- 支持的滚动规则设置如下
| 配置项 | 描述 |
| — | — |
| 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-pattern
、logging.logback.rollingpolicy.max-file-size
、logging.logback.rollingpolicy.max-history
这三个配置在使用中是实际生效的,剩下的两个配置再实际使用中并没有生效,不知道是版本原因还是什么问题,这里暂且不深入研究。
并且我发现logging.logback.rollingpolicy.max-file-size=1MB
将文件最大大小设置为1MB进行切割,但是实际文件进行切割的大小并不是当日志文件达到1MB那么准确。这可能是由以下下几种原因导致的:
- 缓冲机制:日志系统通常会使用缓冲来提高性能。这意味着在写入日志事件和实际将其刷新到磁盘之间可能存在延迟。因此,即使日志文件大小达到配置的最大值,实际的文件切割可能也会稍有延迟。
- 文件大小测量:Logback 通常在写入日志事件时测量文件大小。由于写入操作的原子性,文件大小可能在短时间内超过配置的最大值。
- 多线程写入:在多线程环境中,多个线程可能同时写入日志文件,这可能导致文件大小在短时间内超过预期。
关于 Logback 的切割规则,通常遵循以下步骤:
- 当日志文件达到配置的最大大小时,Logback 会关闭当前日志文件。
- Logback 会创建一个新的日志文件来继续记录日志事件。
- 关闭的日志文件通常会保留,直到达到配置的最大历史记录限制。超过此限制的旧日志文件将被删除。
# 日志存档的文件名格式(默认值:${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
,下面是它们两者的区别:
- 架构和性能:Log4j2 采用了新的架构设计,相较于之前的版本以及 LogBack,它在性能方面有了显著的提升。
- API支持:Log4j2 原生支持 SLF4J、Log4j、Commons Logging 等多种日志 API,而 LogBack 主要支持 SLF4J。
- 配置方式:LogBack 的配置被认为更直观和灵活,而 Log4j2 也提供了 XML、YAML、JSON 等多种配置方式,以及更加动态的配置能力。
log4j2
是log4j 1.x
的升级版,参考了logback
的一些优秀的设计,并且修复了一些问题,带来了一些重大的提升,在异步方面的性能得到了巨大提升。所以在日常开发中我们完全可以选择用性能更好的log4j2
来代替它。那么该如何切换日志框架的,接再来是具体操作。
- 因为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>
- 排除以后,导入
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中看到:
从中我们可以看到它是有两个配置文件的,一个对控制台进行配置,一个对日志文件进行配置。我们自己如果声明这两个配置文件,那么机会覆盖默认配置,以为我们的为准。
- 编辑配置文件,这里我们之前的配置基本上是不用变的,以下这些时都会生效的。
# 配置日志打印级别
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>
- 记录日志,看下效果。
可以看到我们对HelloController设置的日志级别为warn
,控制台只打印了warn
以及以上的日志级别。
总结
- 导入任何第三方框架,先排除它的日志包,因为Boot底层控制好了日志
- 修改
application.properties
配置文件,就可以调整日志的所有行为。如果不够,可以编写日志框架自己的配置文件放在类路径下就行,比如logback-spring.xml
,log4j2-spring.xml
- 如需对接专业日志系统,也只需要把 logback 记录的日志灌倒** kafka**之类的中间件,这和SpringBoot没关系,都是日志框架自己的配置,修改配置文件即可
- 业务中使用slf4j-api记录日志。不要再 sout 了
附加:log4j2 框架的标签说明书
Appenders 标签
- 用处:
Appenders 标签用于定义日志事件的目标,即日志信息应该被发送到哪里。Appenders 负责将日志事件传递到其目标,这可能包括控制台、文件、数据库等。 - 属性:
- Appenders 标签本身没有直接的属性,但它可以包含多个子元素,每个子元素都代表一个特定的 Appender。这些 Appender 可能有自己的属性,例如:
- name:Appender 的名称,用于在其他配置中引用。
- type:指定 Appender 的类型,如 Console、File、RollingFile 等。
- 其他特定于 Appender 的属性,如 fileName(用于 FileAppender)或 pattern(用于 PatternLayout)。
- Appenders 标签本身没有直接的属性,但它可以包含多个子元素,每个子元素都代表一个特定的 Appender。这些 Appender 可能有自己的属性,例如:
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 属性用于指定日志消息的格式。这个属性接受一个模式字符串,其中可以包含各种占位符来插入日志事件的不同部分(如日期、时间、日志级别、消息内容等)。
- name:
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。
- name:
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属性相匹配。