gpt4 book ai didi

java - 如何在使用 Eclipse 创建的可运行 jar 中指定外部 log4j2 配置文件

转载 作者:行者123 更新时间:2023-12-02 03:08:04 25 4
gpt4 key购买 nike

在 Eclipse 中运行项目时会创建日志,但是当创建可运行的 jar 时(库处理选项:将所需的库提取到生成的 JAR 中),无法找到配置文件并且不会生成日志。

通过命令行运行 jar 时(cd 到包含可运行 jar 的目录),输出如下:

ERROR StatusLogger Unrecognized format specifier [d]
ERROR StatusLogger Unrecognized conversion specifier [d] starting at position 16 in conversion pattern.
ERROR StatusLogger Unrecognized format specifier [thread]
ERROR StatusLogger Unrecognized conversion specifier [thread] starting at position 25 in conversion pattern.
ERROR StatusLogger Unrecognized format specifier [level]
ERROR StatusLogger Unrecognized conversion specifier [level] starting at position 35 in conversion pattern.
ERROR StatusLogger Unrecognized format specifier [logger]
ERROR StatusLogger Unrecognized conversion specifier [logger] starting at position 47 in conversion pattern.
ERROR StatusLogger Unrecognized format specifier [msg]
ERROR StatusLogger Unrecognized conversion specifier [msg] starting at position 54 in conversion pattern.
ERROR StatusLogger Unrecognized format specifier [n]
ERROR StatusLogger Unrecognized conversion specifier [n] starting at position 56 in conversion pattern.
ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.

消息的最后一位告诉我找不到配置文件,尽管它正在从某处读取配置 PatternLayout。当选项 -Dlog4j.configurationFile 选项添加到命令中时,会出现以下异常(除了前面的错误消息之外):

Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: java.lang.NullPointerException: No Configuration was provided
at java.util.Objects.requireNonNull(Unknown Source)
at org.apache.logging.log4j.core.LoggerContext.setConfiguration(LoggerContext.java
:477)
at org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:561)
at org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:577)
at org.apache.logging.log4j.core.LoggerContext.start(LoggerContext.java:212)
at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextF
actory.java:242)
at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextF
actory.java:45)
at org.apache.logging.log4j.LogManager.getContext(LogManager.java:174)
at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:618)
at test.SmokeTest.<clinit>(SmokeTest.java:41)

我尝试将 -Dlog4j.configurationFile 值指定为“c:/path/to/config/log4j2.xml”和“file://c:/path/to/config/log4j2.xml”并获取同样的错误。异常消息中的最后一行是记录器的初始化。在代码中,我尝试使用以下选项初始化记录器:

 - private static final Logger logger =
LogManager.getLogger("c:/path/to/config/log4j2.xml");
- private static final Logger logger = LogManager.getLogger("logger name specified in config file");

在写入文件之前,我设置了 log4j.configurationFile 系统属性。尝试了以下选项:

- System.setProperty("log4j.configurationFile", "C:\\path\\to\\config\\log4j2.xml")
- System.setProperty("log4j.configurationFile", "file://c:/path/to/config/log4j2.xml")

我还尝试使用 BasicConfigurator.configure() 和 PropertyConfigurator.configure() 方法从原始 log4j (log4j-1.2.17.jar) 导入 import org.apache.log4j.BasicConfigurator 和 PropertyConfigurator。

考虑到 log4j2 可能无法从外部文件获取其配置,我将 log4j2.xml 文件的副本放在项目的 src 文件夹中。然后尝试使用以下命令初始化记录器:

- private static final Logger logger = LogManager.getLogger(MyClass.class.getName());
- private static final Logger logger = LogManager.getLogger(SmokeTest.class);

两者都给了我同样的错误,但这也许就是它在从 Eclipse 运行时有效的原因?

此外,如果我双击程序图标或在没有 -Dlog4j.configurationFile 选项的情况下从命令行运行,应用程序将启动但不会生成日志。

请帮助我解决此问题,如果您需要我提供任何进一步的信息,请告诉我。我知道以前曾有人问过类似的问题,但我无法找到适合我的问题的解决方案;可运行的 jar、Eclipse、外部 log4j2 配置文件。不使用 Ant 或 Maven。

最佳答案

不知道你做错了什么,但这里有一个 MCVE .

Test.java

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class Test {
private static transient Logger log = LogManager.getLogger(Test.class);
public static void main(String[] args) {
log.info("Hello World");
}
}

log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>

添加Apache Log4j 2到 Eclipse 构建路径:log4j-api-2.7.jarlog4j-core-2.7.jar

使用 Eclipse 创建 jar 文件 文件 > 导出... > 可运行的 JAR 文件 > 将所需的库提取到生成的 JAR 名称为 Test.jar.

运行方式:

java -Dlog4j.configurationFile=C:\path\to\log4j2.xml -jar Test.jar

输出

14:06:23.728 [main] INFO  Test - Hello World

关于java - 如何在使用 Eclipse 创建的可运行 jar 中指定外部 log4j2 配置文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41454056/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com