Elasticsearch用户配置log4j2.properties多条件日志删除报错求助
你遇到的错误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
关键修改点说明
条件嵌套的正确写法:
在IfAny节点下,每个子条件需要用独立的节点名(比如condition1、condition2)来定义,不能重复使用同一个nestedConditions。这样每个条件的属性(age、exceeds)只会作用于对应的条件类型,不会互相干扰。条件逻辑的正确性:
IfLastModified:检查单个文件的最后修改时间是否超过90天,满足则标记为待删除。IfAccumulatedFileSize:统计所有匹配glob模式的文件总大小,超过200MB时,会从最旧的文件开始删除,直到总大小低于阈值。IfAny:只要满足上述两个条件中的任意一个,就会触发删除动作,完全符合你的需求。
路径与文件名匹配:
确保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

