首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在用中指定外部log4j2 Config文件

如何在用中指定外部log4j2 Config文件
EN

Stack Overflow用户
提问于 2017-01-03 23:39:53
回答 2查看 3.3K关注 0票数 0

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

当通过命令行(cd进入包含runnable的目录)运行jar时,输出如下:

代码语言:javascript
运行
复制
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选项添加到命令中时,会出现以下异常(除了前面的错误消息):

代码语言:javascript
运行
复制
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“和”-Dlog4j.configurationFile“,并得到相同的错误。异常消息中的最后一行是记录器的初始化。在代码中,我尝试使用以下选项初始化记录器:

代码语言:javascript
运行
复制
 - 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系统属性。尝试了以下选项:

代码语言:javascript
运行
复制
- 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导入导入org.apache.log4j.BasicConfigurator和PropertyConfigurator (log4j-1.2.17.jar)。

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

代码语言:javascript
运行
复制
- private static final Logger logger = LogManager.getLogger(MyClass.class.getName());
- private static final Logger logger = LogManager.getLogger(SmokeTest.class);

两者都给了我相同的错误,但也许这就是为什么它在从Eclipse运行时工作的原因?

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

请帮助我解决这个问题,如果你需要我提供任何进一步的信息,请告诉我。我知道以前也有人问过类似的问题,但是我无法找到一个解决方案来解决我的问题: runnable,Eclipse外部log4j2配置文件。不使用Ant或Maven。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-25 16:09:15

我的问题是,在初始化日志之前,我正在调用它。

所有内容都被正确打包,主类为log4j提供了适当的代码。罪魁祸首是一个类级对象,它是在main执行之前初始化的。该对象的构造函数记录其创建。在Eclipse中调试时,这不会导致任何错误,但是停止了可执行文件的运行。

谢谢安德烈亚斯给了我从一个新项目重新开始的理想。

票数 1
EN

Stack Overflow用户

发布于 2017-01-08 19:26:45

不知道你做错了什么,但这是一个MCVE

Test.java

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
<?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 > File > Export... > Runnable JAR file >具有名称Test.jarExtract required libraries into generated JAR创建jar文件。

与:

代码语言:javascript
运行
复制
java -Dlog4j.configurationFile=C:\path\to\log4j2.xml -jar Test.jar

输出

代码语言:javascript
运行
复制
14:06:23.728 [main] INFO  Test - Hello World
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41454056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档