外部log4j.xml文件

41

我试图在文件系统外部运行一个带有log4j.xml文件的jar包,就像这样:

java -jar MyJarName.jar -cp=/opt/companyName/pathToJar/ log4j.configuration=log4j.xml argToJar1 argToJar2

我还尝试过:

java -jar MyJarName.jar -cp=/opt/companyName/pathToJar/ log4j.configuration=/opt/companyName/pathToJar/log4j.xml argToJar1 argToJar2

log4j.xml文件与jar在同一目录下(/opt/companyName/pathToJar/),但我仍然收到标准的警告信息:

log4j:WARN No appenders could be found for logger (org.apache.axis.i18n.ProjectResourceBundle).
log4j:WARN Please initialize the log4j system properly.

是否可以将配置文件放在JAR包外面,还是必须将其与JAR包一起打包?

TIA

9个回答

55
使用-jar开关启动可执行的jar文件时,类路径是从jar文件的清单中获取的。如果给出了-cp开关,则会被忽略。 Jeff Storey的答案将是最简单的解决方案。或者,您可以向jar文件的清单添加Class-Path属性。 编辑 尝试启用log4j调试,并使路径到log4j.xml成为完全限定的URL。例如:
java -Dlog4j.debug -Dlog4j.configuration=file:/path/to/log4j.xml -jar ...

3
这对我很有帮助,文件属性是我遗漏的内容。 - Raks
1
这对我有用:-Dlog4j.configuration=file:./log4j.properties,它可以在启动脚本所在的同一目录中查找属性文件。 - Adriaan Koster
我在使用jdk 5时遇到了同样的问题。然而,当我转换到jdk6时,问题得到了解决。 - bluelurker
我尝试过几个,这是一个有效的。 - wax_lyrical
对我来说,我必须像这样定义文件:"file://{log4j文件的完整路径}"。 - allkenang
显示剩余2条评论

18

这个可行:

java -jar -Dlog4j.configuration="file:d:\log4j.xml" myjar.jar

15

8
你尝试过 java -Dlog4j.configuration=/path/to/log4j.xml -jar <rest-of-args> 吗?

3
需要文件:在路径前面 - Eric Hartford

6
你可以在jar包中定义一个默认的属性文件。如果没有自定义属性被定义,你可以使用这个默认文件。如果自定义属性被定义了,你可以覆盖默认属性。
myjar.jar文件包含log4j.default.configuration。
你可以使用这些参数运行程序来启动应用程序。
java  -jar -Dlog4j.configuration=log4j.properties  target\yourfile-v01_000_01_c002.jar

例子代码

public static void main(String[] args) {
    String filename = System.getProperty("log4j.configuration");
    if(null==filename||filename.trim().equals("")) {
        logger.info("Using default log4j configuration log4j.default.properties.");
        logger.info("If you would like to change the default configuration please add following param before startup -Dlog4j.configuration=<log4jfile>");
        PropertyConfigurator.configure( Main.class.getResourceAsStream("/log4j.default.properties"));
    } else {
        File file = new File(filename);
        if(!file.exists()) System.out.println("It is not possible to load the given log4j properties file :"+file.getAbsolutePath());
        else PropertyConfigurator.configure(file.getAbsolutePath());

    }
}

2
谢谢!这适用于.properties文件。如果您使用.xml配置文件,则请改用DOMConfigurator而不是PropertyConfigurator。 - Martin Pabst

2

java -cp "路径/到/你的/log4jxml:路径/到/你的jar.jar" 你的包名.主类

目录“路径/到/你的/log4jxml”中的log4j.xml将覆盖“路径/到/你的jar.jar”中的log4j.xml文件。

请参考在Java classpath中设置多个jar


这对我有用。 - Manolis P.
除此之外,我还需要像这样传递jvm参数:-Dlog4j.configurationFile=/pathtoconf/log4j2.xml - iamsmkr

1

对于“log4j2”的最简路径配置是使用静态块来设置“log4j.configurationFile”:

public class MyClass {

    static {
        System.setProperty("log4j.configurationFile", "./config/log4j2.xml");
    }

    protected final transient Logger logger =  LogManager.getLogger(IDOLTracker.class);

    public static void main(String[] args) {
         logger.info("");
    }
}

那么结构可以如下:

ProgramFolder
|---- /config/log4j2.xml
|---- MyClass.jar

当您运行您的jar文件时,它会在jar文件外查找xml文件。


1

我在使用Sun的JDK和自动配置时遇到了log4j的问题。

你可以尝试使用以下方法:

String filename = System.getProperty("log4j.configuration");
DOMConfigurator(filename);

在使用 Logger 之前。


0
"-jar" 只使用可执行 jar 文件内的类路径,而 -cp 则被忽略。在可执行 jar 文件中将 "." 添加到类路径中应该可以找到 log4j.xml。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接