Log4j 2.18配置TimeBasedTriggeringPolicy时AGE空指针报错求助
解决Log4j 2.18 RollingFileAppender配置TimeBasedTriggeringPolicy时的NullPointerException问题
你遇到的这个空指针问题根源很明确:你的IfLastModified删除策略缺少了必填的age参数。从报错栈能看到,IfLastModified类的构造函数通过Objects.requireNonNull(age)做了非空校验,而你只声明了IfLastModified的类型,却没设置具体的时间阈值,直接触发了空指针异常。
问题分析
IfLastModified是Log4j用来筛选待删除旧日志的核心条件,它必须明确“超过多久的文件需要被清理”——也就是age参数。这个参数支持带单位的时间值,比如30d(30天)、24h(24小时)、60m(60分钟)等,用来定义文件保留的最长周期。
修正后的完整配置
只需要在IfLastModified配置块中添加age参数即可,以下是修复后的log4j.properties:
name= RollingFileLogConfig appenders = console, rolling # Log files location property.basePath = ./logs # Console appender appender.console.type = Console appender.console.name = STDOUT appender.console.layout.type = PatternLayout appender.console.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} %level [%t] [%l] - %msg%n # RollingFileAppender name, pattern, path and rollover policy appender.rolling.type = RollingFile appender.rolling.name = fileLogger appender.rolling.fileName= ${basePath}/app.log appender.rolling.filePattern= ${basePath}/app_%d{yyyyMMdd}.log.gz appender.rolling.layout.type = PatternLayout appender.rolling.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} %level [%t] [%l] - %msg%n appender.rolling.policies.type = Policies # RollingFileAppender rotation policy appender.rolling.policies.size.type = SizeBasedTriggeringPolicy appender.rolling.policies.size.size = 10MB appender.rolling.policies.time.type = TimeBasedTriggeringPolicy appender.rolling.policies.time.interval = 1 appender.rolling.policies.time.modulate = true appender.rolling.strategy.type = DefaultRolloverStrategy appender.rolling.strategy.delete.type = Delete appender.rolling.strategy.delete.basePath = ${basePath} appender.rolling.strategy.delete.maxDepth = 10 appender.rolling.strategy.delete.ifLastModified.type = IfLastModified # 新增age参数,示例设置为保留30天内的日志,可按需调整 appender.rolling.strategy.delete.ifLastModified.age = 30d # Configure root logger rootLogger.level = trace rootLogger.appenderRefs = stdout, rolling rootLogger.appenderRef.rolling.ref = fileLogger rootLogger.appenderRef.stdout.ref = STDOUT
额外说明
- 你可以根据实际需求调整
age的数值和单位:比如要保留7天日志就设为7d,要保留12小时就设为12h; - 配置Log4j的策略类时,一定要确认所有必填参数都已配置,这类空指针问题大多是遗漏核心配置项导致的。
内容的提问来源于stack exchange,提问作者kyc
相关产品推荐
相关产品推荐

