我正在尝试加载 Log4j 记录器的特定设置。代码适用于 1.2.17 版本。现在版本 2.21.1 不会加载文件,而是加载“默认”设置。
我正在使用 JavaSE-17 (jdk-17.0.1)
我在 1.2.17 中有这段代码来加载属性文件:
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(propPath);
Logger logger = Logger.getLogger(MyClass.class);
但是2.21.1版本没有“PropertyConfigurator”。
我尝试了这些选项(单独),但没有成功:
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.logging.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
如何加载它以及如何检查它是否已成功加载?
主要版本的更新允许进行重大更改。对于 Log4j,配置格式和默认配置文件名在 1.x 和 2.x 之间发生了变化。
使用 这个答案 将
log4j.properties
转换为 log4j2.xml
:
从 Log4j 站点下载二进制发行版并将其解压缩为
bin
,
运行:
java -cp "bin/*" org.apache.log4j.config.Log4j1ConfigurationConverter \
--in log4j.properties \
--out log4j2.xml \
--verbose
我同意G00se的评论:不要使用编程配置。
标准位置是:
WEB-INF/log4j2.xml
或 log4j-web
(强烈推荐),请在 WAR 文件中添加 log4j-jakarta-web
。这可能对应于项目文件夹中的 src/main/webapp/WEB-INF/log4j2.xml
。log4j2.xml
在您的应用程序类路径中。第三个可能对应于项目文件夹中的 src/main/resources/log4j2.xml
。备注: 转换器会将您的
%-5p
图案替换为 %-5v1Level
。虽然后一种模式可确保与 Log4j 1.x 自定义级别 100% 兼容(参见 LOG4J2-3419),但它需要 log4j-1.2-api
工件。您可能应该将其改回 %-5p
。