You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Elasticsearch用户配置log4j2.properties多条件日志删除报错求助

解决Log4j2中IfAccumulatedFileSize报错的问题

你遇到的错误main ERROR IfAccumulatedFileSize contains an invalid element or attribute "age",根源是**IfAny条件的嵌套配置语法错误**——你重复使用了同一个nestedConditions节点来定义两个不同的条件,导致第二个条件(IfAccumulatedFileSize)错误地继承了前一个条件的age属性,而它本身并不支持这个属性。

修正后的配置

下面是调整后的完整log4j2.properties配置,我已经修复了条件嵌套的问题,同时确保满足你的需求:每日轮转日志,删除超过3个月(90天)或总大小超过200MB的旧日志:

status = error
# log action execution errors for easier debugging
logger.action.name = org.elasticsearch.action
logger.action.level = debug

appender.console.type = Console
appender.console.name = console
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = [%d{ISO8601}][%-5p][%-25c{1.}] %marker%m%n

appender.rolling.type = RollingFile
appender.rolling.name = rolling
appender.rolling.fileName = ${sys:es.logs}.log
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = [%d{ISO8601}][%-5p][%-25c{1.}] %marker%.-10000m%n
appender.rolling.filePattern = ${sys:es.logs}-%d{yyyy-MM-dd}.log

appender.rolling.policies.type = Policies
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.action.type = Delete
appender.rolling.strategy.action.basepath = /var/log/elasticsearch
# 匹配目标日志文件
appender.rolling.strategy.action.condition.type = IfFileName
appender.rolling.strategy.action.condition.glob = mylog-*.log
# 使用IfAny组合两个删除条件
appender.rolling.strategy.action.condition.type = IfAny
# 第一个条件:文件最后修改时间超过90天
appender.rolling.strategy.action.condition.condition1.type = IfLastModified
appender.rolling.strategy.action.condition.condition1.age = 90D
# 第二个条件:匹配的文件总大小超过200MB
appender.rolling.strategy.action.condition.condition2.type = IfAccumulatedFileSize
appender.rolling.strategy.action.condition.condition2.exceeds = 200M

关键修改点说明

  1. 条件嵌套的正确写法:
    在IfAny节点下,每个子条件需要用独立的节点名(比如condition1、condition2)来定义,不能重复使用同一个nestedConditions。这样每个条件的属性(age、exceeds)只会作用于对应的条件类型,不会互相干扰。

  2. 条件逻辑的正确性:

    • IfLastModified:检查单个文件的最后修改时间是否超过90天,满足则标记为待删除。
    • IfAccumulatedFileSize:统计所有匹配glob模式的文件总大小,超过200MB时,会从最旧的文件开始删除,直到总大小低于阈值。
    • IfAny:只要满足上述两个条件中的任意一个,就会触发删除动作,完全符合你的需求。
  3. 路径与文件名匹配:
    确保basepath是你的Elasticsearch日志实际存储路径,glob模式和filePattern的命名规则一致(比如你的filePattern是${sys:es.logs}-%d{yyyy-MM-dd}.log,如果${sys:es.logs}对应mylog,那么glob写mylog-*.log是正确的)。

这样配置后,重启Elasticsearch(或Log4j2)就不会再出现之前的错误,日志轮转和自动删除功能也能按预期工作了。

内容的提问来源于stack exchange,提问作者ESCURE Thomas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:12:40