设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间13 现在时间13 缓存数据 到现在一共是295天,有了人生中第一张迷你专辑,我期许自己这不会是句号,只会是个逗号,会一直一直一直突破的,直到我唱不动的那天。

到现在一共是295天,有了人生中第一张迷你专辑,我期许自己这不会是句号,只会是个逗号,会一直一直一直突破的,直到我唱不动的那天。 -- 一种原谅

查看: 14|回复: 0

一文带你搞定SpringBoot Log4j2日志配置文件

[复制链接]

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
29
主题
25
精华
0
金钱
89
积分
54
注册时间
2023-9-29
最后登录
2025-5-31

发表于 2025-5-31 05:57:38 | 显示全部楼层 |阅读模式

1.在 Spring Boot 应用中集成 Log4j2

首先在项目pom文件中引入Log4j的依赖

  1. <!--log4j2-->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-log4j2</artifactId>
  5. </dependency>
复制代码

在当前项目的resource目录下增加文件 log4j2.xml

1.png

下面介绍配置文件中各个节点,感兴趣的小伙伴也可以去官网查看

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.日志输出模板参数介绍

  1. 格式化输出:    %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
复制代码

下面就是我在开发中使用的一些配置

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <configuration status="OFF">
  3. <properties>
  4. <!-- 日志打印级别 -->
  5. <property name="LOG_LEVEL">INFO</property>
  6. <!-- APP名称 -->
  7. <property name="APP_NAME" value="framework_project"/>
  8. <!-- 日志文件存储路径 -->
  9. <property name="LOG_HOME">/framework_project</property>
  10. <!-- 存储天数 -->
  11. <property name="LOG_MAX_HISTORY" value="60d"/>
  12. <!-- 单个日志文件最大值, 单位 = KB, MB, GB -->
  13. <property name="LOG_MAX_FILE_SIZE" value="10 MB"/>
  14. <!-- 每天每个日志级别产生的文件最大数量 -->
  15. <property name="LOG_TOTAL_NUMBER_DAILY" value="10"/>
  16. <!-- 压缩文件的类型,支持zip和gz,建议Linux用gz,Windows用zip -->
  17. <property name="ARCHIVE_FILE_SUFFIX" value="zip"/>
  18. <!-- 日志文件名 -->
  19. <property name="LOG_FILE_NAME" value="${LOG_HOME}"/>
  20. <property name="FILE_NAME_PATTERN" value="${LOG_HOME}/%d{yyyy-MM-dd}"/>
  21. <!--日志输出格式-控制台彩色打印-->
  22. <property name="ENCODER_PATTERN_CONSOLE">%blue{%d{yyyy-MM-dd HH:mm:ss.SSS}} | %highlight{%-5level}{ERROR=Bright
  23. RED, WARN=Bright Yellow, INFO=Bright Green, DEBUG=Bright Cyan, TRACE=Bright White} | %yellow{%t} |
  24. %cyan{%c{1.}} : %white{%msg%n}
  25. </property>
  26. <!--日志输出格式-文件-->
  27. <property name="ENCODER_PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %5pid --- [%15.15t] %c{1.} [%L] : %m%n
  28. </property>
  29. <!--日志输出格式-控制台彩色打印-->
  30. <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
  31. </property>
  32. </properties>
  33. <Appenders>
  34. <!-- 控制台的输出配置 -->
  35. <Console name="Console" target="SYSTEM_OUT">
  36. <!--输出日志的格式-->
  37. <PatternLayout pattern="${DEFAULT_PATTERN}"/>
  38. </Console>
  39. <!-- 新增包含所有级别日志的文件 Appender -->
  40. <RollingFile name="RollingFileAllLevels" fileName="${LOG_FILE_NAME}/all.log"
  41. filePattern="${FILE_NAME_PATTERN}/all.log">
  42. <Filters>
  43. <!-- 不过滤任何日志级别 -->
  44. </Filters>
  45. <PatternLayout pattern="${ENCODER_PATTERN}"/>
  46. <Policies>
  47. <!-- 归档每天的文件 -->
  48. <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
  49. <!-- 限制单个文件大小 -->
  50. <SizeBasedTriggeringPolicy size="${LOG_MAX_FILE_SIZE}"/>
  51. </Policies>
  52. <!-- 限制每天文件个数 -->
  53. <DefaultRolloverStrategy compressionLevel="9" max="${LOG_TOTAL_NUMBER_DAILY}">
  54. <Delete basePath="${LOG_HOME}" maxDepth="1">
  55. <IfFileName glob="*.all.*.log"/>
  56. <IfLastModified age="${LOG_MAX_HISTORY}"/>
  57. </Delete>
  58. </DefaultRolloverStrategy>
  59. </RollingFile>
  60. <!-- 打印出所有的info及以下级别的信息,每次大小超过size进行压缩,作为存档-->
  61. <RollingFile name="RollingFileAll" fileName="${LOG_FILE_NAME}/info.log"
  62. filePattern="${FILE_NAME_PATTERN}/info.log">
  63. <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
  64. <ThresholdFilter level="${LOG_LEVEL}" onMatch="ACCEPT" onMismatch="DENY"/>
  65. <!--输出日志的格式-->
  66. <PatternLayout pattern="${ENCODER_PATTERN}"/>
  67. <Policies>
  68. <!-- 归档每天的文件 -->
  69. <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
  70. <!-- 限制单个文件大小 -->
  71. <SizeBasedTriggeringPolicy size="${LOG_MAX_FILE_SIZE}"/>
  72. </Policies>
  73. <!-- 限制每天文件个数 -->
  74. <DefaultRolloverStrategy compressionLevel="9" max="${LOG_TOTAL_NUMBER_DAILY}">
  75. <Delete basePath="${LOG_HOME}" maxDepth="1">
  76. <IfFileName glob=".info.*.log"/>
  77. <IfLastModified age="${LOG_MAX_HISTORY}"/>
  78. </Delete>
  79. </DefaultRolloverStrategy>
  80. </RollingFile>
  81. <RollingFile name="RollingFileDebug"
  82. fileName="${LOG_FILE_NAME}/debug.log"
  83. filePattern="${FILE_NAME_PATTERN}/debug.log">
  84. <Filters>
  85. <ThresholdFilter level="DEBUG"/>
  86. <ThresholdFilter level="INFO" onMatch="DENY"
  87. onMismatch="NEUTRAL"/>
  88. </Filters>
  89. <PatternLayout pattern="${ENCODER_PATTERN}"/>
  90. <Policies>
  91. <!-- 归档每天的文件 -->
  92. <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
  93. <!-- 限制单个文件大小 -->
  94. <SizeBasedTriggeringPolicy size="${LOG_MAX_FILE_SIZE}"/>
  95. </Policies>
  96. <!-- 限制每天文件个数 -->
  97. <DefaultRolloverStrategy compressionLevel="9"
  98. max="${LOG_TOTAL_NUMBER_DAILY}">
  99. <Delete basePath="${LOG_HOME}" maxDepth="1">
  100. <IfFileName glob="*.debug.*.log"/>
  101. <IfLastModified age="${LOG_MAX_HISTORY}"/>
  102. </Delete>
  103. </DefaultRolloverStrategy>
  104. </RollingFile>
  105. <RollingFile name="RollingFileWarn" fileName="${LOG_FILE_NAME}/warn.log"
  106. filePattern="${FILE_NAME_PATTERN}/warn.log">
  107. <Filters>
  108. <ThresholdFilter level="WARN"/>
  109. <ThresholdFilter level="ERROR" onMatch="DENY"
  110. onMismatch="NEUTRAL"/>
  111. </Filters>
  112. <PatternLayout pattern="${ENCODER_PATTERN}"/>
  113. <Policies>
  114. <!-- 归档每天的文件 -->
  115. <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
  116. <!-- 限制单个文件大小 -->
  117. <SizeBasedTriggeringPolicy size="${LOG_MAX_FILE_SIZE}"/>
  118. </Policies>
  119. <!-- 限制每天文件个数 -->
  120. <DefaultRolloverStrategy compressionLevel="9"
  121. max="${LOG_TOTAL_NUMBER_DAILY}">
  122. <Delete basePath="${LOG_HOME}" maxDepth="1">
  123. <IfFileName glob="*.warn.*.log"/>
  124. <IfLastModified age="${LOG_MAX_HISTORY}"/>
  125. </Delete>
  126. </DefaultRolloverStrategy>
  127. </RollingFile>
  128. <RollingFile name="RollingFileError"
  129. fileName="${LOG_FILE_NAME}/error.log"
  130. filePattern="${FILE_NAME_PATTERN}/error.log">
  131. <Filters>
  132. <ThresholdFilter level="ERROR"/>
  133. </Filters>
  134. <PatternLayout pattern="${ENCODER_PATTERN}"/>
  135. <Policies>
  136. <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
  137. <SizeBasedTriggeringPolicy size="${LOG_MAX_FILE_SIZE}"/>
  138. </Policies>
  139. <DefaultRolloverStrategy compressionLevel="9" max="${LOG_TOTAL_NUMBER_DAILY}">
  140. <Delete basePath="${LOG_HOME}" maxDepth="1">
  141. <IfFileName glob="*.error.*.log"/>
  142. <IfLastModified age="${LOG_MAX_HISTORY}"/>
  143. </Delete>
  144. </DefaultRolloverStrategy>
  145. </RollingFile>
  146. </Appenders>
  147. <!--只有定义了logger并引入以上Appenders,Appender才会生效-->
  148. <Loggers>
  149. <root level="${LOG_LEVEL}">
  150. <appender-ref ref="Console"/>
  151. <appender-ref ref="RollingFileAll"/>
  152. <appender-ref ref="RollingFileDebug"/>
  153. <appender-ref ref="RollingFileWarn"/>
  154. <appender-ref ref="RollingFileError"/>
  155. <!-- 添加新的Appender引用 -->
  156. <appender-ref ref="RollingFileAllLevels"/>
  157. </root>
  158. </Loggers>
  159. </configuration>
复制代码

4.知识扩展

如何设置Log4j2的监控间隔?

在 Log4j2 中,可以通过在配置文件中设置 monitorInterval 属性来指定监控配置文件变化的时间间隔。这个属性告诉 Log4j2 每隔多少秒检查一次配置文件是否有变化,如果有变化则自动重新加载配置。以下是具体的设置方法和示例:

1. XML 配置文件示例

在 log4j2.xml 配置文件的根 元素中添加 monitorInterval 属性:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <Configuration status="WARN" monitorInterval="30">
  3. <Appenders>
  4. <Console name="Console" target="SYSTEM_OUT">
  5. <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} - %msg%n"/>
  6. </Console>
  7. </Appenders>
  8. <Loggers>
  9. <Root level="info">
  10. <AppenderRef ref="Console"/>
  11. </Root>
  12. </Loggers>
  13. </Configuration>
复制代码

在这个示例中,monitorInterval="30" 表示 Log4j2 每隔 30 秒检查一次配置文件是否有变化。如果配置文件发生变化,Log4j2 会自动重新加载配置。

2. JSON 配置文件示例

在 log4j2.json 配置文件中,可以通过在配置对象中添加 "monitorInterval" 属性来设置监控间隔:

  1. {
  2. "configuration": {
  3. "status": "WARN",
  4. "monitorInterval": 30,
  5. "appenders": {
  6. "console": {
  7. "type": "Console",
  8. "target": "SYSTEM_OUT",
  9. "PatternLayout": {
  10. "pattern": "%d{yyyy-MM-dd HH:mm:ss} - %msg%n"
  11. }
  12. }
  13. },
  14. "loggers": {
  15. "root": {
  16. "level": "info",
  17. "appenderRefs": [
  18. {
  19. "ref": "console"
  20. }
  21. ]
  22. }
  23. }
  24. }
  25. }
复制代码

3. YAML 配置文件示例

在 log4j2.yaml 配置文件中,可以通过在 configuration 对象中添加 monitorInterval 属性来设置监控间隔:

  1. configuration:
  2. status: WARN
  3. monitorInterval: 30
  4. appenders:
  5. console:
  6. type: Console
  7. target: SYSTEM_OUT
  8. PatternLayout:
  9. pattern: "%d{yyyy-MM-dd HH:mm:ss} - %msg%n"
  10. loggers:
  11. root:
  12. level: info
  13. appenderRefs:
  14. - ref: console
复制代码

4. 注意事项

监控间隔单位:monitorInterval 的单位是秒。

最小间隔:Log4j2 要求 monitorInterval 的值至少为 1 秒。

性能影响:虽然监控配置文件变化提供了一定的便利性,但频繁的文件检查可能会对性能产生轻微影响。因此,建议根据实际需求合理设置监控间隔。

文件变化检测:Log4j2 通过检测配置文件的最后修改时间(last-modified time)来判断文件是否发生变化。如果文件系统或编辑工具没有正确更新文件的最后修改时间,Log4j2 可能无法检测到变化。

通过这些方法,你可以轻松设置 Log4j2 的监控间隔,使其在配置文件发生变化时自动重新加载配置,而无需重启应用程序。

到此这篇关于一文带你搞定SpringBoot Log4j2日志配置文件的文章就介绍到这了,更多相关SpringBoot Log4j2日志配置内容请搜索晓枫资讯以前的文章或继续浏览下面的相关文章希望大家以后多多支持晓枫资讯!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表