网站轮播图制作,漳州违法建设举报网站,北京开发app,网站有时打不开文章目录 一、Policies二、SizeBasedTriggeringPolicy:基于文件大小的滚动策略2.1、文件达到指定大小就归档 三、TimeBasedTriggeringPolicy#xff1a;基于时间间隔的滚动策略3.1、验证秒钟归档场景3.2、验证分钟场景3.3、验证小时场景 四、多策略组合使用五、扩展知识5.1、S… 文章目录 一、Policies二、SizeBasedTriggeringPolicy:基于文件大小的滚动策略2.1、文件达到指定大小就归档 三、TimeBasedTriggeringPolicy基于时间间隔的滚动策略3.1、验证秒钟归档场景3.2、验证分钟场景3.3、验证小时场景 四、多策略组合使用五、扩展知识5.1、SizeBasedTriggeringPolicy的单位不区分大小写5.2、$${date与%d的区别 六、可能遇到的问题6.1、日志切分不生效6.2、TimeBasedTriggeringPolicy到达时间后日志没滚动 本文讲解Log4j2配置文件xml中的Policies属性。
一、Policies
Policy 是用来控制日志文件何时(When)进行 Rolling/滚动的
所谓「日志滚动」就是当达到设定的条件后日志文件进行切分。比如让系统中的日志按日进行切分并且按年月归档。
Policy下的若配置了多个滚动策略则满足任意一个条件后都会触发日志归档。
RollingFile nameRollingFile fileNamelogs/app.logfilePatternlogs/$${date:yyyy-MM}/app-%d{yyyy-MM-dd-HH}-%i.log.gzPatternLayoutPattern%d %p %c{1.} [%t] %m%n/Pattern/PatternLayoutPolicies!-- 每 5s 翻滚一次 --!--CronTriggeringPolicy schedule0/5 * * * * ? /--!-- 每 5小时 翻滚一次 --TimeBasedTriggeringPolicy interval5 modulatetrue/!-- 每 100MB 翻滚一次 --SizeBasedTriggeringPolicy size100 MB//Policies
/RollingFile二、SizeBasedTriggeringPolicy:基于文件大小的滚动策略 SizeBasedTriggeringPolicy: 当日志文件达到指定大小就会文件归档生成一个新的文件。 更多信息见官网 https://logging.apache.org/log4j/2.x/manual/appenders/rolling-file.html#SizeBasedTriggeringPolicy 一旦文件达到指定大小SizeBasedTriggingPolicy就会导致滚动。单位可以是KB、MB、GB或TB 单位不区分大小写例如20MB
不与基于时间的触发策略结合使用时基于大小的触发策略将导致时间戳值发生变化。当与基于时间的触发策略结合使用时Appender的filePattern属性必须包含%i否则目标文件将在每次滚动时被覆盖 %i就类似于一个整数计数器例如配置DefaultRolloverStrategy max5/当文件个数达到5个的时候会循环覆盖前面已归档的1-5个文件。若不设置该参数默认为7。
2.1、文件达到指定大小就归档
?xml version1.0 encodingUTF-8?
!--Configuration后面的status这个用于设置log4j2自身内部的信息输出可以不设置当设置成trace时你会看到log4j2内部各种详细输出--
!--monitorIntervalLog4j能够自动检测修改配置 文件和重新配置本身设置间隔秒数--
configuration monitorInterval5!--日志级别以及优先级排序: OFF FATAL ERROR WARN INFO DEBUG TRACE ALL --!--变量配置--Properties!-- 格式化输出%date表示日期%thread表示线程名%-5level级别从左显示5个字符宽度 %msg日志消息%n是换行符--!-- %logger{36} 表示 Logger 名字最长36个字符 --property nameLOG_PATTERN value%date{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n /!-- 定义日志存储的路径 --property nameFILE_PATH value./logs /property nameFILE_NAME valuedemo //Propertiesappenders!-- 这个会打印出所有的info及以下级别的信息每次大小超过size则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩作为存档--RollingFile nameRollingFileInfo fileName${FILE_PATH}/info.log filePattern${FILE_PATH}/$${date:yyyy-MM-dd}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}_%i.log.gzPatternLayout pattern${LOG_PATTERN}/PoliciesSizeBasedTriggeringPolicy size1KB//Policies!-- DefaultRolloverStrategy属性如不设置则默认为最多同一文件夹下7个文件开始覆盖--DefaultRolloverStrategy max15//RollingFile/appendersloggersroot leveldebugappender-ref refRollingFileInfo//root/loggers/configuration上述模板中日志先写入info.log中每当文件大小达到1KB时按照在./logs/2024-12-25/目录下以demo-info-2024-12-25_1.log.gz格式对该日志进行压缩重命名并归档并生成新的文件info.log进行日志写入。
如下图每次info日志达到1KB时就会进行归档生成新的文件。
三、TimeBasedTriggeringPolicy基于时间间隔的滚动策略 基于时间的触发策略允许你按照指定的时间间隔来滚动分割日志文件。 更多信息参见官网https://logging.apache.org/log4j/2.x/manual/appenders/rolling-file.html#TimeBasedTriggeringPolicy 参数TypeDescriptioninterval 间隔integer控制归档频率默认值为1单位取自filePattern中配置的最小时间单位。 如filePattern中最小时间单位为小时如果interval1则1小时归档一次如果interval2则2小时归档一次。modulate 调整boolean控制是否对interval进行调节默认为false。若为true会以0为开始对interval进行偏移计算。 例如当单位为小时时当前为3:14interval为4。若为false则后面归档时间依次为3:007:0011:0015:0019::0023:00若为true则后面归档时间依次为0:004:008:0012:0016:0020:00maxRandomDelay 最大随机延迟integer指示随机延迟过渡的最大秒数。默认值为0表示没有延迟。 此设置在配置了多个应用程序以同时滚动日志文件的服务器上很有用并且可以在整个时间上分散这样做的负担。 modulate 参数是用来调整日志滚动时间的。比如指定了interval间隔为每5分钟归档一次日志此时时间为3:13。 若modulatefalse则表示从日志起始时间每5分钟归档一次后面归档时间依次是3:13:00-3:17:59(5分钟)3.213.26 3.31… 若modulatetrue则表示从0开始每5分钟归档一次后面归档时间依次是3:13:00-3:14:593:15:00-3:19:593.24 3.29… 官网中也说明了interval的单位是由最后一个%d{...}决定的。
几个重要的配置项 1、fileName是日志生成后所在的文件名filePattern是滚动机制发动后fileName归档后的文件名。如果fileName为空fileName会被设置成filePattern。 2、filePatternfilePattern“logs/$${date:yyyy-MM-dd}/info-%d{yyyy-MM-dd}_%i.log.gz”其中红色部分$${date:yyyy-MM-dd}实现的效果是每天的日志会归档到同一天。 3、filePatternfilePattern“logs/$${date:yyyy-MM-dd}/info-%d{yyyy-MM-dd}_%i.log.gz”其中红色部分%i实现的效果是当程序在归档时文件名序号会自动递增最大值后面介绍。 4、TimeBasedTriggeringPolicy中设定的interval的单位是filePattern进行处理后获取的具体来说就是filePattern“logs/$${date:yyyy-MM-dd}/%d{yyyy-MM-dd-HH}.%i.log中包含了H”会被转化成{RolloverFrequency.HOURLY} 3.1、验证秒钟归档场景
?xml version1.0 encodingUTF-8?
configuration monitorInterval5!--变量配置--Propertiesproperty nameLOG_PATTERN value%date{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n /!-- 定义日志存储的路径 --property nameFILE_PATH value./logs //PropertiesappendersRollingFile nameRollingFileInfo fileName${FILE_PATH}/info.log filePattern${FILE_PATH}/$${date:yyyy-MM-dd}/info-%d{yyyy-MM-dd-HH-mm-ss}_%i.log.gzThresholdFilter leveldebug onMatchACCEPT onMismatchDENY/PatternLayout pattern${LOG_PATTERN}/Policies!--interval属性用来指定多久滚动一次本示例指的是4秒单位是由于filePattern中的最小单位决定的本示例中filePattern的格式是年月日时分秒所以最小单位是秒。--TimeBasedTriggeringPolicy interval4//Policies!-- DefaultRolloverStrategy属性如不设置则默认为最多同一文件夹下7个文件开始覆盖--DefaultRolloverStrategy max15//RollingFile/appendersloggersroot levelinfoappender-ref refRollingFileInfo//root/loggers/configuration上述模板中日志先写入info.log中每经过4s时因为filePattern中 {yyyy-MM-dd-HH-mm-ss} 最小时间单位为秒按照在./logs目录下以/yyyy-MM-dd/info-yyyy-MM-dd-HH-mm-ss_i.log格式对该日志进行压缩重命名并归档并生成新的文件info.log进行日志写入。
3.2、验证分钟场景
modulatefalse
filePattern${FILE_PATH}/$${date:yyyy-MM-dd}/info-%d{yyyy-MM-dd-HH-mm-ss}_%i.log.gzTimeBasedTriggeringPolicy interval5 modulatefalse/结果
2024-12-25 17:08:33启动服务开始记录第一条日志info-2024-12-25-17-12_1.log
2024-12-25 17:08:33 本日志文件启动服务开始记录第一条日志
2024-12-25 17:12:59 本日志文件最后一条日志info-2024-12-25-17-17_1.log
2024-12-25 17:13:00 本日志文件开始时间
2024-12-25 17:17:59 本日志文件结束时间可以发现当modulatefalse时不会对日志切分时间进行校准从日志起始时间每隔指定时间后归档日志上述示例中从日志起始时间每5分钟归档一次日志。
modulatetrue
filePattern${FILE_PATH}/$${date:yyyy-MM-dd}/info-%d{yyyy-MM-dd-HH-mm-ss}_%i.log.gzTimeBasedTriggeringPolicy interval5 modulatetrue/结果
2024-12-25 17:12:33启动服务开始记录第一条日志info-2024-12-25-17-14_1.log
2024-12-25 17:12:33 本日志文件启动服务开始记录第一条日志
2024-12-25 17:14:59 本日志文件最后一条日志info-2024-12-25-17-19_1.log
2024-12-25 17:15:00 本日志文件开始时间
2024-12-25 17:19:59 本日志文件结束时间可以发现当modulatetrue时对日志切分时间进行校准, 以0点自动校准进行文件切分从0点开始每隔指定时间后归档日志上述示例中从0点开始每5分钟归档一次日志。
3.3、验证小时场景
modulatetrue
?xml version1.0 encodingUTF-8?
configuration monitorInterval5!--变量配置--Propertiesproperty nameLOG_PATTERN value%date{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n /!-- 定义日志存储的路径 --property nameFILE_PATH value./logs //PropertiesappendersRollingFile nameRollingFileInfo fileName${FILE_PATH}/info.log filePattern${FILE_PATH}/$${date:yyyy-MM-dd}/info-%d{yyyy-MM-dd-HH}_%i.log.gzThresholdFilter leveldebug onMatchACCEPT onMismatchDENY/PatternLayout pattern${LOG_PATTERN}/Policies!--interval属性用来指定多久滚动一次本示例指的是5小时单位是由于filePattern中的最小单位决定的本示例中filePattern的格式是年月日时所以最小单位是小时。--TimeBasedTriggeringPolicy interval5 modulatetrue//Policies!-- DefaultRolloverStrategy属性如不设置则默认为最多同一文件夹下7个文件开始覆盖--DefaultRolloverStrategy max15//RollingFile/appendersloggersroot levelinfoappender-ref refRollingFileInfo//root/loggers/configuration结果
2024-12-25 7:12:33启动服务开始记录第一条日志info-2024-12-25-9_1.log
2024-12-25 7:12:33 本日志文件启动服务开始记录第一条日志
2024-12-25 9:59:59 本日志文件最后一条日志info-2024-12-25-14_1.log
2024-12-25 10:00:00 本日志文件开始时间
2024-12-25 14:59:59 本日志文件结束时间如上modulatetrue设置后假如7点12分的日志开始重启服务日志先写入logs/info.log中则10点触发一次rollover操作{[0-5),[5-10),[10-15),[15-20)}生成info-2024-12-25-9_1.log对该日志进行压缩重命名并归档并生成新的文件info.log进行日志写入然后每间隔5小时则下一次是15点触发一次rollover。
四、多策略组合使用
多个不同的策略可以组合使用先满足哪个策略条件就基于哪个策略生成log文件。
?xml version1.0 encodingUTF-8?
configuration monitorInterval5!--变量配置--Propertiesproperty nameLOG_PATTERN value%date{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n /!-- 定义日志存储的路径 --property nameFILE_PATH value./logs //PropertiesappendersRollingFile nameRollingFileInfo fileName${FILE_PATH}/info.log filePattern${FILE_PATH}/$${date:yyyy-MM-dd}/info-%d{yyyy-MM-dd-HH}_%i.log.gzThresholdFilter leveldebug onMatchACCEPT onMismatchDENY/PatternLayout pattern${LOG_PATTERN}/PoliciesSizeBasedTriggeringPolicy size10MB/TimeBasedTriggeringPolicy interval5 modulatetrue//Policies!-- DefaultRolloverStrategy属性如不设置则默认为最多同一文件夹下7个文件开始覆盖--DefaultRolloverStrategy max15//RollingFile/appendersloggersroot levelinfoappender-ref refRollingFileInfo//root/loggers/configuration上述模板中日志先写入info.log中每当文件大小达到10MB或者当时间间隔到达5小时由%d{yyyy-MM-dd-HH}决定触发rollover操作按照在./logs/yyyy-MM-dd目录下以info-2024-12-25-9_1.log.gz格式对该日志进行压缩重命名并归档并生成新的文件info.log进行日志写入。
五、扩展知识
5.1、SizeBasedTriggeringPolicy的单位不区分大小写
如下SizeBasedTriggeringPolicy的单位不区分大小写。
SizeBasedTriggeringPolicy size10MB/
SizeBasedTriggeringPolicy size10mb/
SizeBasedTriggeringPolicy size10Kb/详情也可参见官网https://logging.apache.org/log4j/2.x/manual/appenders/rolling-file.html#SizeBasedTriggeringPolicy
解析SizeBasedTriggeringPolicy 中size属性的java类是org.apache.logging.log4j.core.appender.rolling.FileSize在这个类中对单位进行了忽略大小写。
5.2、$${date与%d的区别
上面的示例中我们看到日期格式有两种写法代码如下那么这两种写法有什么区别呢
filePattern${FILE_PATH}/$${date:yyyy-MM-dd}/info-%d{yyyy-MM-dd-HH}_%i.log.gz$$date:…和%d…转换模式不等效
$${date:…}格式化当前日期。
%d{…}格式化上次滚动的日期。官网地址https://logging.apache.org/log4j/2.x/manual/appenders/rolling-file.html#conversion-patterns
六、可能遇到的问题
6.1、日志切分不生效
在测试过程中配置Policies中的策略后发现日志没有归档log4j2配置如下
?xml version1.0 encodingUTF-8?
!--Configuration后面的status这个用于设置log4j2自身内部的信息输出可以不设置当设置成trace时你会看到log4j2内部各种详细输出--
!--monitorIntervalLog4j能够自动检测修改配置 文件和重新配置本身设置间隔秒数--
configuration monitorInterval5!--日志级别以及优先级排序: OFF FATAL ERROR WARN INFO DEBUG TRACE ALL --!--变量配置--Properties!-- 格式化输出%date表示日期%thread表示线程名%-5level级别从左显示5个字符宽度 %msg日志消息%n是换行符--!-- %logger{36} 表示 Logger 名字最长36个字符 --property nameLOG_PATTERN value%date{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n /!-- 定义日志存储的路径 --property nameFILE_PATH value../logs /property nameFILE_NAME valuedemo //Propertiesappenders!-- 这个会打印出所有的info及以下级别的信息每次大小超过size则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩作为存档--RollingFile nameRollingFileInfo fileName${FILE_PATH}/info.log filePattern${FILE_PATH}/${FILE_NAME}-INFO-%d{yyyy-MM-dd HH:mm}_%i.log.gz!--控制台只输出level及以上级别的信息onMatch其他的直接拒绝onMismatch--ThresholdFilter leveldebug onMatchACCEPT onMismatchDENY/PatternLayout pattern${LOG_PATTERN}/Policies!--interval属性用来指定多久滚动一次默认是1 hour小时单位是由于filePattern中的最小单位决定的本示例中filePattern的格式是年月日所以最小单位是小时。若filePattern格式是时分秒则TimeBasedTriggeringPolicy的单位是秒。--!--TimeBasedTriggeringPolicy interval1/--SizeBasedTriggeringPolicy size1KB//Policies!-- DefaultRolloverStrategy属性如不设置则默认为最多同一文件夹下7个文件开始覆盖--DefaultRolloverStrategy max15//RollingFile/appenders!--Logger节点用来单独指定日志的形式比如要为指定包下的class指定不同的日志级别等。--!--然后定义loggers只有定义了logger并引入的appenderappender才会生效--loggers!-- additivity:是否向上级logger传递打印信息。默认是true。--!--[需修改] level: 若需要打印sql日志则需要修改为debug级别否则为info级别。 --Logger namecom.example leveldebug additivitytrue/Loggerroot levelinfoappender-ref refRollingFileInfo//root/loggers/configuration报错日志 项目启动后日志没有归档并且有日志报错
Connected to the target VM, address: 127.0.0.1:15970, transport: socket. ____ _ __ _ _/\\ / ____ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | _ | _| | _ \/ _ | \ \ \ \\\/ ___)| |_)| | | | | || (_| | ) ) ) ) |____| .__|_| |_|_| |_\__, | / / / /|_||___//_/_/_/:: Spring Boot :: (v2.4.7)[2024-12-25 11:26:38,143][main][INFO][org.springframework.boot.StartupInfoLogger]: Starting MainApplication using Java 1.8.0_202 on LAPTOP-9UHA7CHR with PID 22036 (D:\WorkSpace\springboot-bucket\springboot-log4j2\target\classes started by 13488 in D:\WorkSpace\springboot-bucket)
[2024-12-25 11:26:38,149][main][DEBUG][org.springframework.boot.StartupInfoLogger]: Running with Spring Boot v2.4.7, Spring v5.3.8
[2024-12-25 11:26:38,150][main][INFO][org.springframework.boot.SpringApplication]: No active profile set, falling back to default profiles: default
[2024-12-25 11:26:38,951][main][INFO][org.springframework.boot.web.embedded.tomcat.TomcatWebServer]: Tomcat initialized with port(s): 8080 (http)
[2024-12-25 11:26:38,956][main][INFO][org.apache.juli.logging.DirectJDKLog]: Initializing ProtocolHandler [http-nio-8080]
[2024-12-25 11:26:38,957][main][INFO][org.apache.juli.logging.DirectJDKLog]: Starting service [Tomcat]
[2024-12-25 11:26:38,957][main][INFO][org.apache.juli.logging.DirectJDKLog]: Starting Servlet engine: [Apache Tomcat/9.0.46]
[2024-12-25 11:26:38,958][main][INFO][org.apache.juli.logging.DirectJDKLog]: Loaded Apache Tomcat Native library [1.2.31] using APR version [1.7.0].
[2024-12-25 11:26:38,958][main][INFO][org.apache.juli.logging.DirectJDKLog]: APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].
2024-12-25 11:26:38,962 main ERROR Unable to rename file D:\WorkSpace\springboot-bucket\..\logs\info.log to D:\WorkSpace\springboot-bucket\..\logs\demo-INFO-2024-12-25 11:26_1.log: java.nio.file.InvalidPathException Illegal char : at index 62: D:\WorkSpace\springboot-bucket\..\logs\demo-INFO-2024-12-25 11:26_1.log
问题原因及解决方法 从报错日志中我们可以看到由于项目filePattern属性中引用了相对路径导致文件没找到所以项目配置中应该避免使用相对路径。
6.2、TimeBasedTriggeringPolicy到达时间后日志没滚动
1、场景说明 项目中配置了TimeBasedTriggeringPolicy按时间滚动策略但是项目运行后发现到达指定时间后日志文件并没有归档。
配置如下
RollingFile nameRollingFileInfo fileName${FILE_PATH}/info.log filePattern${FILE_PATH}/%d{yyyy-MM-dd}/info-%d{yyyy-MM-dd-HH-mm-ss}_%i.log.gz!--控制台只输出level及以上级别的信息onMatch其他的直接拒绝onMismatch--ThresholdFilter leveldebug onMatchACCEPT onMismatchDENY/PatternLayout pattern${LOG_PATTERN}/Policies!--interval属性用来指定多久滚动一次本示例指的是4秒
单位是由于filePattern中的最小单位决定的本示例中filePattern的格式是年月日时分秒所以最小单位是秒。
--TimeBasedTriggeringPolicy interval4//Policies!-- DefaultRolloverStrategy属性如不设置则默认为最多同一文件夹下7个文件开始覆盖--DefaultRolloverStrategy max15/
/RollingFile如上配置info.log文件应该每隔4秒都归档的但是实际发现并没有生成归档文件。
2、原因及解决方法 问题原因如果在设置的滚动时间间隔内没有产生新的日志内容即使满足滚动条件当前的日志文件也不会被滚动。
我遇到的示例就是因为日志文件没有产生新的内容所以并没有滚动归档。 参考文章 https://blog.csdn.net/weixin_37646636/article/details/135923164 创作不易欢迎打赏你的鼓励将是我创作的最大动力。