Log4j 2.21.1无法加载log4j.properties配置文件求助
Log4j 2.x 无法加载原1.x配置文件的问题
问题背景
原本在Log4j 1.2.17中使用PropertyConfigurator加载指定log4j.properties的代码,升级到Log4j 2.21.1(Java 17环境)后,尝试多种方式都无法加载自定义配置,仅使用默认的ERROR级别配置。
原1.x加载代码
import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; .... String fileRoute = "D:/code/price-3/src/main/webapp/WEB-INF/config/log4j.properties"; PropertyConfigurator.configure(fileRoute); Logger logger = Logger.getLogger(MyClass.class);
尝试的2.x加载代码(均无效)
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.core.LoggerContext; import org.apache.logging.log4j.core.config.Configurator; String fileRoute = "D:/code/price-3/src/main/webapp/WEB-INF/config/log4j.properties"; //Test 1 Configurator.initialize(null, fileRoute); //Test 2 LoggerContext context = (LoggerContext) LogManager.getContext(false); context.setConfigLocation(URI.create("file:" + fileRoute)); //Test 3 LoggerContext context = (LoggerContext) LogManager.getContext(false); File f = new File(fileRoute); context.setConfigLocation(f.toURI()); //test logger Logger logger = LogManager.getLogger(MyClass.class); if (logger.isTraceEnabled()) System.out.println("Trace level"); if (logger.isDebugEnabled()) System.out.println("Debug level"); if (logger.isInfoEnabled()) System.out.println("Info level"); if (logger.isWarnEnabled()) System.out.println("Warn level"); if (logger.isErrorEnabled()) System.out.println("Error level"); if (logger.isFatalEnabled()) System.out.println("Fatal level"); logger.trace("Log write"); logger.debug("Log write"); logger.info("Log write"); logger.warn("Log write"); logger.error("Log write"); logger.fatal("Log write"); System.out.println("Name: " + logger.getName()); System.out.println("Level: " + logger.getLevel()); System.out.println("Class: " + logger.getClass());
执行后控制台输出(默认配置)
Error level Fatal level 10:09:55.113 [main] ERROR tu.MyClass- Log write 10:09:55.118 [main] FATAL tu.MyClass- Log write Name: tu.MyClass Level: ERROR Class: class org.apache.log4j.core.Logger
原log4j.properties配置
log4j.rootLogger=ALL, A0 #appender log4j.appender.A0=org.apache.log4j.RollingFileAppender log4j.appender.A0.append=true #log log4j.appender.A0.MaxFileSize=5MB log4j.appender.A0.MaxBackupIndex=5 #log path and name log4j.appender.A0.File=logs/price.log #type and pattern log4j.appender.A0.layout=org.apache.log4j.PatternLayout log4j.appender.A0.Append=true log4j.appender.A0.encoding=UTF-8 log4j.appender.A0.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
解决方案
1. 核心问题:Log4j 2.x不直接兼容1.x配置格式
你的log4j.properties是Log4j 1.x的语法格式,Log4j 2.x无法直接识别,需通过以下两种方式解决:
方式一:改用Log4j 2.x的Properties格式
将原配置文件重命名为log4j2.properties,并修改为2.x语法:
status = warn name = PropertiesConfig # 根日志级别与输出端 rootLogger.level = ALL rootLogger.appenderRefs = A0 rootLogger.appenderRef.A0.ref = RollingFile # 滚动文件输出端配置 appender.RollingFile.type = RollingFile appender.RollingFile.name = RollingFile appender.RollingFile.fileName = logs/price.log appender.RollingFile.filePattern = logs/price-%d{yyyy-MM-dd}-%i.log.gz appender.RollingFile.append = true appender.RollingFile.layout.type = PatternLayout appender.RollingFile.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n appender.RollingFile.policies.type = Policies appender.RollingFile.policies.size.type = SizeBasedTriggeringPolicy appender.RollingFile.policies.size.size = 5MB appender.RollingFile.strategy.type = DefaultRolloverStrategy appender.RollingFile.strategy.max = 5
方式二:使用Log4j 1.x兼容桥接器
如果不想修改配置文件,可添加1.x到2.x的桥接依赖(Maven示例):
<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-1.2-api</artifactId> <version>2.21.1</version> </dependency>
添加后,原1.x的PropertyConfigurator代码可继续使用,Log4j 2.x会自动适配1.x配置格式。
2. 正确的2.x配置加载代码
若使用方式一的2.x配置文件,加载代码需添加reconfigure()强制生效:
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.core.LoggerContext; import java.io.File; public class MyClass { public static void main(String[] args) { String fileRoute = "D:/code/price-3/src/main/webapp/WEB-INF/config/log4j2.properties"; LoggerContext context = (LoggerContext) LogManager.getContext(false); File configFile = new File(fileRoute); context.setConfigLocation(configFile.toURI()); context.reconfigure(); // 关键:强制重新加载配置 Logger logger = LogManager.getLogger(MyClass.class); // 测试日志输出 logger.trace("Trace message"); logger.debug("Debug message"); logger.info("Info message"); logger.warn("Warn message"); logger.error("Error message"); logger.fatal("Fatal message"); } }
验证配置是否加载成功
- 日志级别验证:调用
logger.isTraceEnabled()、logger.isDebugEnabled()等方法,若所有级别均返回true,说明根日志级别ALL已生效。 - 输出文件验证:检查
logs/price.log是否生成,且包含所有级别的日志内容。 - 控制台输出验证:在
log4j2.properties中添加控制台输出端,运行后查看控制台是否输出所有级别日志:rootLogger.appenderRefs = A0, Console rootLogger.appenderRef.Console.ref = Console appender.Console.type = Console appender.Console.name = Console appender.Console.layout.type = PatternLayout appender.Console.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n - 内部状态日志验证:在配置文件开头添加
status = debug,运行时Log4j会输出配置加载的详细日志,可确认是否成功读取配置文件。
内容的提问来源于stack exchange,提问作者camaleongdl
相关产品推荐
相关产品推荐

