当前位置: 首页 > 知识库问答 >
问题:

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

孟新知
2023-03-14

当通过命令行(cd进入包含可运行jar的目录)运行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.

消息的最后一点告诉我,配置文件找不到,尽管它正在从某个地方读取配置模式布局(configuration 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.configure()。

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

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

此外,如果双击程序图标或从命令行运行而不使用-dlog4j.configurationfile选项,应用程序将启动,但不会生成日志。

请帮助我解决这个问题,如果你需要我提供任何进一步的信息,请让我知道。我知道以前也有人问过类似的问题,但我无法找到解决我问题的办法;可运行的jar、Eclipse、外部log4j2配置文件。不使用Ant或Maven。

共有1个答案

仉联
2023-03-14

我不知道你做错了什么,但这里有一个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>
java -Dlog4j.configurationFile=C:\path\to\log4j2.xml -jar Test.jar
14:06:23.728 [main] INFO  Test - Hello World
 类似资料:
  • 问题内容: 我想用Java构建可运行的jar。我需要在jar中包含一些文件,以便在执行jar时会自动从java类读取文件。因此,我在项目中创建了一个文件夹,并从项目中引用了这些文件。我按照一些教程创建了jar文件,但是无法在jar文件中包含这些外部文件。请让我考虑使用外部文件创建可运行的jar。 我的文件结构是 我访问 的abc.txt 在 test1.java 类。我的代码是 使用eclipse

  • 我想用Java构建一个可运行的jar。我需要在jar中包含一些文件,这样当我执行jar时,文件就会自动从java类中读取。因此,我在项目中创建了一个文件夹,并从项目中引用了这些文件。我按照一些教程创建了jar文件,但我不能在我的jar文件中包含这些外部文件。请允许我使用外部文件创建可运行的jar。 当我使用eclipse导出选项创建可执行jar时,我无法看到jar内部的FileFolder目录。请

  • 我无法通过eclipse导出向导创建正常的jar(不可运行/不可执行),它只创建了jar文件,但没有导出依赖的jar。当从其他类调用导出的jar的方法时出现错误,请帮助

  • 我试图用hibernate配置从我的eclipse maven项目中创建一个jar文件。 这是我的项目的结构,我在resources/和src/main/resources/文件夹中都有hibernate.cfg.xml文件。我通过从导出选项中选择runnable jar file来生成jar文件。(由于来自链接的帮助) 这是我在运行可执行jar文件时得到的错误:

  • 问题内容: 我正在尝试构建一个依赖于下载的外部jar的可执行jar程序。在我的项目中,我将它们包含在构建路径中,并且可以在eclipse中运行和调试。 当我尝试将其导出到jar中时,我可以运行该程序,但是当我尝试按下包含来自外部jar的函数调用和类的按钮时,则无法执行。我已经编辑了环境变量(Windows XP)CLASSPATH,以包括所有外部jar的路径,但是它不起作用。 需要注意的一点是,我

  • 有人能告诉我如何用Intellij和Gradle在cmd中运行.jar文件吗? 我尝试创建清单文件,但出现错误: 或 我的主要类: