Log4j中%replace使用异常:修改配置后日志无法输出
你的问题根源出在依赖版本不匹配和配置文件格式混用两个方面,导致%replace语法不生效甚至日志完全无法输出,具体解决步骤如下:
一、修复依赖冲突
你当前使用的slf4j-log4j12是SLF4J绑定Log4j 1.x的适配包,但引入的log4j-core是Log4j 2.x版本,二者完全不兼容。需要替换为Log4j 2.x对应的SLF4J绑定包:
替换原依赖中的slf4j-log4j12为log4j-slf4j-impl,同时确保彻底排除Log4j 1.x相关依赖:
<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.20.0</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.20.0</version> <!-- 版本需与log4j-core严格一致 --> </dependency> <!-- 全局排除Log4j 1.x,避免其他依赖间接引入 --> <dependencyManagement> <dependencies> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> <scope>provided</scope> </dependency> </dependencies> </dependencyManagement>
二、修正配置文件格式
Log4j 2.x使用的配置文件名是log4j2.xml(而非Log4j 1.x的log4j.xml),且配置结构与1.x完全不同。你之前混用了1.x的<layout class="org.apache.log4j.PatternLayout">和2.x的%replace语法,导致配置直接失效。
正确的Log4j 2.x配置示例(实现你需要的字符串替换):
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%5p %d{ISO8601} [%t][%x] %c - %replace{%m}{<Name1>(?:.+?)</Name1>}{<Name1>*****</Name1>}%n"/> </Console> <!-- 若有文件输出Appender,配置逻辑一致 --> </Appenders> <Loggers> <Root level="info"> <AppenderRef ref="Console"/> </Root> </Loggers> </Configuration>
配置要点说明:
%replace是Log4j 2.xPatternLayout的原生语法,需确保使用Log4j 2.x的配置体系- 调整
%replace的作用范围为%m(日志消息内容),避免将换行符%n纳入替换逻辑 - 你使用的正则表达式
<Name1>(?:.+?)<\/Name1>是正确的非贪婪匹配,能精准替换单个<Name1>标签内的内容
三、验证生效
- 删除旧的
log4j.xml配置文件,确保项目加载的是log4j2.xml - 启动项目后,打印包含
<Name1>xxx</Name1>的日志,检查是否被替换为<Name1>*****</Name1>
内容的提问来源于stack exchange,提问作者JAK
相关产品推荐
相关产品推荐

