一文带你搞定SpringBootLog4j2日志配置文件,
一文带你搞定SpringBootLog4j2日志配置文件,
目录
- 1.在 Spring Boot 应用中集成 Log4j2
- 2.配置节点
- 2.1 根节点configuration
- 2.2 Properties
- 2.3 Appenders
- 2.4 Logger
- 3.日志输出模板参数介绍
- 4.知识扩展
1.在 Spring Boot 应用中集成 Log4j2
首先在项目pom文件中引入Log4j的依赖
<!--log4j2--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency>
在当前项目的resource目录下增加文件 log4j2.xml
下面介绍配置文件中各个节点,感兴趣的小伙伴也可以去官网查看
2.配置节点
2.1 根节点configuration
有两个属性:status,monitorinterval,两个子节点:Appenders和Loggers表名可以定义多个Appender和Logger
- status,用来指定log4j本身的打印日志级别 OFF>FATAL>ERROR>WARN>INFO>DEBUG>TRACE>ALL
- monitorinterval 重新读取配置文件的监测间隔时间,单位是s,最小是5s.
2.2 Properties
属性(可选),用来定义常量(例如日志打印的模版),之后在其他配置项中通过${变量名}引用
2.3 Appenders
常见的有三种子节点:Console、RollingFile、File
2.3.1 Console
用来定义输出到控制台的Appender两个属性:name、target,一个节点:PatternLayout
- name(属性):指定Appender的名字
- target(属性):SYSTEM_OUT 或 SYSTEM_ERR,一般只设置默认:SYSTEM_OUT.
- PatternLayout(节点):指定输出日志的格式,可以使用pattern属性与Properties中定义的日志打印模板常量相结合,控制日志输出的模版,不设置则默认为:%m%n
2.3.2 File
文件输出源,用于将日志写入到指定的文件,需要配置输入到哪个位置(例如:D:/logs/info.log)
- name(属性)::指定Appender的名字.
- fileName(属性):指定输出日志的目的文件带全路径的文件名.
- PatternLayout(节点):输出格式,不设置默认为:%m%n.
2.3.3 RollingFile
也是写入到文件,不同的是比File更加强大,可以指定当文件达到一定大小(如20MB)时,另起一个文件继续写入日志,另起一个文件就涉及到新文件的名字命名规则,因此需要配置文件命名规则
这种方式更加实用,因为你不可能一直往一个文件中写,如果一直写,文件过大,打开就会卡死,也不便于查找日志。
name(属性):指定Appender的名字.
fileName(属性):指定输出日志的目的文件带全路径的文件名
PatternLayout(节点):输出格式,不设置默认为:%m%n
filePattern:指定新建日志文件的名称格式.
Policies(节点):指定滚动日志的策略,就是什么时候进行新建日志文件输出日志.
TimeBasedTriggeringPolicy(节点):Policies子节点,基于时间的滚动策略,interval属性用来指定多久滚动一次,默认是1 hour。modulate=true用来调整时间:比如现在是早上3am,interval是4,那么第一次滚动是在4am,接着是8am,12am..而不是7am.
SizeBasedTriggeringPolicy(节点):Policies子节点,基于指定文件大小的滚动策略,size属性用来定义每个日志文件的大小.
DefaultRolloverStrategy(节点):用来指定同一个文件夹下最多有几个日志文件时开始删除最l旧的,创建新的(通过max属性);可以指定压缩级别(通过compressionLevel属性),compressionLevel的值通常是一个介于0到9之间的整数,其中:0表示无压缩,1表示最快的压缩速度(但压缩率最低),9表示最高的压缩率(但压缩速度最慢)
Delete:清理旧日志文件的策略;basePath指定了日志文件所在的基目录;maxDepth用于指定清理或删除日志文件时搜索的目录深度,值是一个整数,表示从basePath开始向下搜索的目录层级数
IfFileName:Delete子节点,用于匹配要删除的文件名模式。glob接受一个通配符模式,用来匹配文件名。
IfLastModified:Delete子节点,用于检查文件的最后修改时间,并基于该时间点决定文件是否应该被清理或删除;age指定了文件最后修改时间与当前时间之间最大允许的时间差
如果maxDepth="0",则只会考虑basePath所指向的目录本身,不包括任何子目录。
如果maxDepth="1",则会考虑basePath所指向的目录及其直接子目录。
如果maxDepth="2",则会考虑basePath所指向的目录、其直接子目录以及这些子目录下的子目录(即二级子目录)。
2.4 Logger
Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。level:日志输出级别,共有8个级别,按照从低到高为: All < Trace < Debug < Info < Warn < Error < Fatal < OFF
root :设定根日志的日志级别
name:用来指定该Logger所适用的类或者类所在的包全路径,继承自Root节点.
AppenderRef:Logger的子节点,用来指定该日志输出到哪个Appender,如果没有指定,就会默认继承自Root.如果指定了,那么会在指定的这个Appender和Root的Appender中都会输出。
additivity:是否继承root节点,默认是true继承。默认情况下子Logger会继承父Logger的appender,也就是说子Logger会在父Logger的appender里输出。若是additivity设为false,则子Logger只会在自己的appender里输出,而不会在父Logger的appender里输出。
3.日志输出模板参数介绍
格式化输出:
%date{yyyy-MM-dd HH:mm:ss.SSS}: 简写为%d 日期 2023-08-12 15:04:30,123
%thread: %t 线程名, main
%-5level:%p 日志级别,从左往右至少显示5个字符宽度,不足补空格 INFO
%msg:%m 日志消息 info msg
%n: 换行符
{cyan}: 蓝绿色(青色)
%logger{36}: %c 表示 Logger 名字最长36个字符
%C: 类路径 com.qq.demolog4j2.TestLog4j2
%M: 方法名 main
%F: 类名 TestLog4j2.java
%L: 行号 12
%l: 日志位置, 相当于 %C.%M(%F.%L) com.qq.demolog4j2.TestLog4j2.main(TestLog4j2.java:16)
%highlight:高亮显示,%highlight{%-5level}
如果控制台输出的日志级别没有高亮显示,Log4j2默认关闭了Jansi:一个支持输出ANSI颜色的类库 IDEA中,点击右上角->Edit+Configurations,在VM+options中添加-Dlog4j.skipJansi=false
下面就是我在开发中使用的一些配置
<?xml version="1.0" encoding="UTF-8"?> <configuration status="OFF"> <properties> <!-- 日志打印级别 --> <property name="LOG_LEVEL">INFO</property> <!-- APP名称 --> <property name="APP_NAME" value="framework_project"/> <!-- 日志文件存储路径 --> <property name="LOG_HOME">/framework_project</property> <!-- 存储天数 --> <property name="LOG_MAX_HISTORY" value="60d"/> <!-- 单个日志文件最大值, 单位 = KB, MB, GB --> <property name="LOG_MAX_FILE_SIZE" value="10 MB"/> <!-- 每天每个日志级别产生的文件最大数量 --> <property name="LOG_TOTAL_NUMBER_DAILY" value="10"/> <!-- 压缩文件的类型,支持zip和gz,建议Linux用gz,Windows用zip --> <property name="ARCHIVE_FILE_SUFFIX" value="zip"/> <!-- 日志文件名 --> <property name="LOG_FILE_NAME" value="${LOG_HOME}"/> <property name="FILE_NAME_PATTERN" value="${LOG_HOME}/%d{yyyy-MM-dd}"/> <!--日志输出格式-控制台彩色打印--> <property name="ENCODER_PATTERN_CONSOLE">%blue{%d{yyyy-MM-dd HH:mm:ss.SSS}} | %highlight{%-5level}{ERROR=Bright RED, WARN=Bright Yellow, INFO=Bright Green, DEBUG=Bright Cyan, TRACE=Bright White} | %yellow{%t} | %cyan{%c{1.}} : %white{%msg%n} </property> <!--日志输出格式-文件--> <property name="ENCODER_PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %5pid --- [%15.15t] %c{1.} [%L] : %m%n </property> <!--日志输出格式-控制台彩色打印--> <property name="DEFAULT_PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight{%-5level} %style{%5pid}{bright,magenta} --- [%17.17t] %cyan{%c{1.} [%L]} : %m%n </property> </properties> <Appenders> <!-- 控制台的输出配置 --> <Console name="Console" target="SYSTEM_OUT"> <!--输出日志的格式--> <PatternLayout pattern="${DEFAULT_PATTERN}"/> </Console> <!-- 新增包含所有级别日志的文件 Appender --> <RollingFile name="RollingFileAllLevels" fileName="${LOG_FILE_NAME}/all.log" filePattern="${FILE_NAME_PATTERN}/all.log"> <Filters> <!-- 不过滤任何日志级别 --> </Filters> <PatternLayout pattern="${ENCODER_PATTERN}"/> <Policies> <!-- 归档每天的文件 --> <TimeBasedTriggeringPolicy interval="1" modulate="true"/> <!-- 限制单个文件大小 --> <SizeBasedTriggeringPolicy size="${LOG_MAX_FILE_SIZE}"/> </Policies> <!-- 限制每天文件个数 --> <DefaultRolloverStrategy compressionLevel="9" max="${LOG_TOTAL_NUMBER_DAILY}"> <Delete basePath="${LOG_HOME}" maxDepth="1"> <IfFileName glob="*.all.*.log"/> <IfLastModified age="${LOG_MAX_HISTORY}"/> </Delete> </DefaultRolloverStrategy> </RollingFile> <!-- 打印出所有的info及以下级别的信息,每次大小超过size进行压缩,作为存档--> <RollingFile name="RollingFileAll" fileName="${LOG_FILE_NAME}/info.log" filePattern="${FILE_NAME_PATTERN}/info.log"> <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--> <ThresholdFilter level="${LOG_LEVEL}" onMatch="ACCEPT" onMismatch="DENY"/> <!--输出日志的格式--> <PatternLayout pattern="${ENCODER_PATTERN}"/> <Policies> <!-- 归档每天的文件 --> <TimeBasedTriggeringPolicy interval="1" modulate="true"/> <!-- 限制单个文件大小 --> <SizeBasedTriggeringPolicy size="${LOG_MAX_FILE_SIZE}"/> </Policies> <!-- 限制每天文件个数 --> <DefaultRolloverStrategy compressionLevel="9" max="${LOG_TOTAL_NUMBER_DAILY}"> <Delete basePath="${LOG_HOME}" maxDepth="1"> <IfFileName glob=".info.*.log"/> <IfLastModified age="${LOG_MAX_HISTORY}"/> </Delete> </DefaultRolloverStrategy> </RollingFile> <RollingFile name="RollingFileDebug" fileName="${LOG_FILE_NAME}/debug.log" filePattern="${FILE_NAME_PATTERN}/debug.log"> <Filters> <ThresholdFilter level="DEBUG"/> <ThresholdFilter level="INFO" onMatch="DENY" onMismatch="NEUTRAL"/> </Filters> <PatternLayout pattern="${ENCODER_PATTERN}"/> <Policies> <!-- 归档每天的文件 --> <TimeBasedTriggeringPolicy interval="1" modulate="true"/> <!-- 限制单个文件大小 --> <SizeBasedTriggeringPolicy size="${LOG_MAX_FILE_SIZE}"/> </Policies> <!-- 限制每天文件个数 --> <DefaultRolloverStrategy compressionLevel="9" max="${LOG_TOTAL_NUMBER_DAILY}"> <Delete basePath="${LOG_HOME}" maxDepth="1"> <IfFileName glob="*.debug.*.log"/> <IfLastModified age="${LOG_MAX_HISTORY}"/> </Delete> </DefaultRolloverStrategy> </RollingFile> <RollingFile name="RollingFileWarn" fileName="${LOG_FILE_NAME}/warn.log" filePattern="${FILE_NAME_PATTERN}/warn.log"> <Filters> <ThresholdFilter level="WARN"/> <ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/> </Filters> <PatternLayout pattern="${ENCODER_PATTERN}"/> <Policies> <!-- 归档每天的文件 --> <TimeBasedTriggeringPolicy interval="1" modulate="true"/> <!-- 限制单个文件大小 --> <SizeBasedTriggeringPolicy size="${LOG_MAX_FILE_SIZE}"/> </Policies> <!-- 限制每天文件个数 --> <DefaultRolloverStrategy compressionLevel="9" max="${LOG_TOTAL_NUMBER_DAILY}"> <Delete basePath="${LOG_HOME}" maxDepth="1"> <IfFileName glob="*.warn.*.log"/> <IfLastModified age="${LOG_MAX_HISTORY}"/> </Delete> </DefaultRolloverStrategy> </RollingFile> <RollingFile name="RollingFileError" fileName="${LOG_FILE_NAME}/error.log" filePattern="${FILE_NAME_PATTERN}/error.log"> <Filters> <ThresholdFilter level="ERROR"/> </Filters> <PatternLayout pattern="${ENCODER_PATTERN}"/> <Policies> <TimeBasedTriggeringPolicy interval="1" modulate="true"/> <SizeBasedTriggeringPolicy size="${LOG_MAX_FILE_SIZE}"/> </Policies> <DefaultRolloverStrategy compressionLevel="9" max="${LOG_TOTAL_NUMBER_DAILY}"> <Delete basePath="${LOG_HOME}" maxDepth="1"> <IfFileName glob="*.error.*.log"/> <IfLastModified age="${LOG_MAX_HISTORY}"/> </Delete> </DefaultRolloverStrategy> </RollingFile> </Appenders> <!--只有定义了logger并引入以上Appenders,Appender才会生效--> <Loggers> <root level="${LOG_LEVEL}"> <appender-ref ref="Console"/> <appender-ref ref="RollingFileAll"/> <appender-ref ref="RollingFileDebug"/> <appender-ref ref="RollingFileWarn"/> <appender-ref ref="RollingFileError"/> <!-- 添加新的Appender引用 --> <appender-ref ref="RollingFileAllLevels"/> </root> </Loggers> </configuration>
4.知识扩展
如何设置Log4j2的监控间隔?
在 Log4j2 中,可以通过在配置文件中设置 monitorInterval 属性来指定监控配置文件变化的时间间隔。这个属性告诉 Log4j2 每隔多少秒检查一次配置文件是否有变化,如果有变化则自动重新加载配置。以下是具体的设置方法和示例:
1. XML 配置文件示例
在 log4j2.xml 配置文件的根 <Configuration> 元素中添加 monitorInterval 属性:
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN" monitorInterval="30"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} - %msg%n"/> </Console> </Appenders> <Loggers> <Root level="info"> <AppenderRef ref="Console"/> </Root> </Loggers> </Configuration>
在这个示例中,monitorInterval="30" 表示 Log4j2 每隔 30 秒检查一次配置文件是否有变化。如果配置文件发生变化,Log4j2 会自动重新加载配置。
2. JSON 配置文件示例
在 log4j2.json 配置文件中,可以通过在配置对象中添加 "monitorInterval" 属性来设置监控间隔:
{ "configuration": { "status": "WARN", "monitorInterval": 30, "appenders": { "console": { "type": "Console", "target": "SYSTEM_OUT", "PatternLayout": { "pattern": "%d{yyyy-MM-dd HH:mm:ss} - %msg%n" } } }, "loggers": { "root": { "level": "info", "appenderRefs": [ { "ref": "console" } ] } } } }
3. YAML 配置文件示例
在 log4j2.yaml 配置文件中,可以通过在 configuration 对象中添加 monitorInterval 属性来设置监控间隔:
configuration: status: WARN monitorInterval: 30 appenders: console: type: Console target: SYSTEM_OUT PatternLayout: pattern: "%d{yyyy-MM-dd HH:mm:ss} - %msg%n" loggers: root: level: info appenderRefs: - ref: console
4. 注意事项
监控间隔单位:monitorInterval 的单位是秒。
最小间隔:Log4j2 要求 monitorInterval 的值至少为 1 秒。
性能影响:虽然监控配置文件变化提供了一定的便利性,但频繁的文件检查可能会对性能产生轻微影响。因此,建议根据实际需求合理设置监控间隔。
文件变化检测:Log4j2 通过检测配置文件的最后修改时间(last-modified time)来判断文件是否发生变化。如果文件系统或编辑工具没有正确更新文件的最后修改时间,Log4j2 可能无法检测到变化。
通过这些方法,你可以轻松设置 Log4j2 的监控间隔,使其在配置文件发生变化时自动重新加载配置,而无需重启应用程序。
到此这篇关于一文带你搞定SpringBoot Log4j2日志配置文件的文章就介绍到这了,更多相关SpringBoot Log4j2日志配置内容请搜索3672js教程以前的文章或继续浏览下面的相关文章希望大家以后多多支持3672js教程!
您可能感兴趣的文章:- Spring Boot整合log4j2日志配置的详细教程
- SpringBoot使用log4j2将日志记录到文件及自定义数据库的配置方法
- SpringBoot整合Log4j2实现自定义日志打印失效的原因及解决
- Spring Boot 3中一套可以直接用于生产环境的Log4J2日志配置详解
- SpringBoot中配置log4j2日志详解
- SpringBoot日志框架之Log4j2快速入门与参数详解
- springboot log4j2日志框架整合与使用过程解析
用户点评