Java 如何在使用Eclipse创建的可运行jar中指定外部log4j2配置文件
日志是在Eclipse中运行project时创建的,但是在创建可运行的jar(库处理选项:将所需库提取到生成的jar中)时,无法找到配置文件,并且不会生成日志 通过命令行运行jar时(将cd放入包含可运行jar的目录中),将输出以下内容: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
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);