Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在使用Eclipse创建的可运行jar中指定外部log4j2配置文件_Java_Eclipse_Logging_Jar_Log4j2 - Fatal编程技术网

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

Java 如何在使用Eclipse创建的可运行jar中指定外部log4j2配置文件,java,eclipse,logging,jar,log4j2,Java,Eclipse,Logging,Jar,Log4j2,日志是在Eclipse中运行project时创建的,但是在创建可运行的jar(库处理选项:将所需库提取到生成的jar中)时,无法找到配置文件,并且不会生成日志 通过命令行运行jar时(将cd放入包含可运行jar的目录中),将输出以下内容: ERROR StatusLogger Unrecognized format specifier [d] ERROR StatusLogger Unrecognized conversion specifier [d] starting at position

日志是在Eclipse中运行project时创建的,但是在创建可运行的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.
消息的最后一位告诉我,尽管配置文件正在从某个地方读取配置模式布局,但找不到该配置文件。将选项-Dlog4j.configurationFile选项添加到命令时,会发生以下异常(除了前面的错误消息):

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

 - 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");
- System.setProperty("log4j.configurationFile", "C:\\path\\to\\config\\log4j2.xml")
- System.setProperty("log4j.configurationFile", "file://c:/path/to/config/log4j2.xml")
我还尝试从原始log4j(log4j-1.2.17.jar)导入import org.apache.log4j.BasicConfigurator和PropertyConfigurator,使用BasicConfigurator.configure()和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);
两者都给了我相同的错误,但也许这就是为什么它在从Eclipse运行时可以工作的原因

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


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

不知道自己做错了什么,但这里有一个例子

Test.java

import org.apache.logging.log4j.LogManager;
导入org.apache.logging.log4j.Logger;
公开课考试{
专用静态瞬态记录器log=LogManager.getLogger(Test.class);
公共静态void main(字符串[]args){
log.info(“你好世界”);
}
}
log4j2.xml


Eclipse构建路径:
log4j-api-2.7.jar
log4j-core-2.7.jar

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

运行时使用:

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

14:06:23.728[main]信息测试-你好世界

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

Test.java

import org.apache.logging.log4j.LogManager;
导入org.apache.logging.log4j.Logger;
公开课考试{
专用静态瞬态记录器log=LogManager.getLogger(Test.class);
公共静态void main(字符串[]args){
log.info(“你好世界”);
}
}
log4j2.xml


Eclipse构建路径:
log4j-api-2.7.jar
log4j-core-2.7.jar

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

运行时使用:

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

14:06:23.728[main]信息测试-你好世界

我的问题是在初始化日志之前调用了它。
所有的东西都被正确地打包,并且主类有适合log4j的代码。罪魁祸首是在执行main之前初始化的类级对象。该对象的构造函数记录了其创建。在Eclipse中调试时,这不会导致任何错误,但会停止可执行文件的运行。

感谢@Andreas为我提供了从新项目重新开始的理想方案。

我的问题是,我在初始化日志之前调用了它。
所有的东西都被正确地打包,并且主类有适合log4j的代码。罪魁祸首是在执行main之前初始化的类级对象。该对象的构造函数记录了其创建。在Eclipse中调试时,这不会导致任何错误,但会停止可执行文件的运行。

感谢@Andreas为我提供了从新项目重新开始的理想方案。

“找不到配置文件”的意思是:您没有将配置文件打包到jar中。我尝试将配置文件直接放在src目录中,并放在启用了“添加到构建路径”选项的子目录中。配置文件应该放在哪里,以便Eclipse用jar将其打包?更重要的是,我的问题是如何利用jar中不包含的配置文件(驻留在文件系统上,以便用户可以配置)。甚至可能吗?“找不到配置文件”的意思是:您没有将配置文件打包到jar中。我已尝试将配置文件直接放在src目录中,并放在启用了“添加到构建路径”选项的子目录中。配置文件应该放在哪里,以便Eclipse用jar将其打包?更重要的是,我的问题是如何利用jar中不包含的配置文件(驻留在文件系统上,以便用户可以配置)。这可能吗?谢谢,在一个新项目中从MCVE重新启动帮助我找到了错误。我在初始化记录器之前调用了日志函数,请参阅我的答案。谢谢,在一个新项目中从MCVE重新启动帮助我找到了错误。我在初始化记录器之前调用了日志函数,请参阅我的答案。
- private static final Logger logger = LogManager.getLogger(MyClass.class.getName());
- private static final Logger logger = LogManager.getLogger(SmokeTest.class);