17

我有一个使用 log4j 的 Eclipse Java 项目。我无法将 log4j 配置文件设置为通过文件路径访问。我必须在 jar 中导出并运行该项目。

这是我尝试的方法:

public class Wita {
  static Logger logger;
  public static void main(String[] args) {
    System.setProperty("log4j.configuration", new File("").getCanonicalPath()+File.separatorChar+"resources"+File.separatorChar+"log4j.xml" );
    // System.out.println( System.getProperty("log4j.configuration") );
    logger = Logger.getLogger(Wita.class.getName());
  }
}

系统输出打印C:\Users\roncsak\eclipse_workspace\WITA\resources\log4j.xml很好。WITA是项目的基本文件夹。但是使用-Dlog4j.debug参数运行项目也会返回以下结果:

log4j:尝试使用上下文类加载器 sun.misc.Launcher$AppClassLoader@18e3e60 查找 [C:\Users\roncsak\eclipse_workspace\WITA\resources\log4j.xml]。
log4j:尝试使用 sun.misc.Launcher$AppClassLoader@18e3e60 类加载器查找 [C:\Users\roncsak\eclipse_workspace\WITA\resources\log4j.xml]。
log4j:尝试使用 ClassLoader.getSystemResource() 查找 [C:\Users\roncsak\eclipse_workspace\WITA\resources\log4j.xml]。
log4j:找不到资源:[C:\Users\roncsak\eclipse_workspace\WITA\resources\log4j.xml]。

我想随着时间的推移更改 log4j.xml,而不构建另一个 jar 文件。我怎样才能做到这一点?

4

3 回答 3

23

http://logging.apache.org/log4j/1.2/manual.html的“默认初始化程序” :

  • 将资源字符串变量设置为 log4j.configuration 系统属性的值。指定默认初始化文件的首选方法是通过 log4j.configuration 系统属性。如果未定义系统属性 log4j.configuration,则将字符串变量资源设置为其默认值“log4j.properties”。
  • 尝试将资源变量转换为 URL。
  • 如果资源变量无法转换为 URL,例如由于 MalformedURLException,则通过调用返回 URL 的 org.apache.log4j.helpers.Loader.getResource(resource, Logger.class) 从类路径中搜索资源. 请注意,字符串“log4j.properties”构成格式错误的 URL。有关搜索位置的列表,请参阅 Loader.getResource(java.lang.String)。

因此,您需要预先file:添加log4j.configuration属性值,以便将其视为 URL。

请参阅https://stackoverflow.com/a/7927278/603516

更好的代码:

    System.setProperty("log4j.configuration", new File("resources", "log4j.xml").toURL());
于 2012-09-25T09:09:28.880 回答
6

您可以设置 VM 参数:-Dlog4j.configuration='path_to_log4j.xml'

或以编程方式:

String logFilePath = new File(<path_to_log4j.xml>);
if (logFilePath == null || "".equalsIgnoreCase(logFilePath)) {
    URL file = this.getClass().getResource(DEFAULT_CONF);
    DOMConfigurator.configure(file);
} else {
    DOMConfigurator.configure(<default_config_file>);   
}
于 2012-09-25T09:04:45.053 回答
1

以上所有这些答案都不令人满意,所以我在这里为将来可能需要这个的人发帖:

  1. 您需要指定您的财产在哪里。通过程序或命令选项都可以。

以编程方式:

private static void setupLog4J(){
    try {
        System.setProperty("log4j.configuration", new File(".", File.separatorChar+"log4j.properties").toURL().toString());
    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
  1. 创建您自己的 log4j.properties 文件:

#  Logging level
# Root logger option
log4j.rootLogger=DEBUG, stdout, file

# Redirect log messages to console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p     %c{1}:%L - %m%n

# Redirect log messages to a log file, support file rolling.
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=c:/project/resources/t-output/log4j-application.log
log4j.appender.file.MaxFileSize=5MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

希望这可以帮助。

于 2016-03-30T12:51:10.933 回答