【问题标题】:How to set log4j property file?如何设置 log4j 属性文件?
【发布时间】:2012-09-25 08:57:16
【问题描述】:

我有一个使用 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 文件。我该怎么做?

【问题讨论】:

  • 来自未来的更新:log4j v2 已将用于覆盖配置文件的系统属性更改为log4j.configurationFile

标签: java log4j


【解决方案1】:

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

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

因此,您需要在 log4j.configuration 属性值前面加上 file: 才能将其视为 URL。

https://stackoverflow.com/a/7927278/603516

更好的代码:

    System.setProperty("log4j.configuration", new File("resources", "log4j.xml").toURL());

【讨论】:

  • java.io.File.toURL() 现已过时。改为使用:x.toURI().toURL()
  • 如果此方法的签名是 System.setProperty(String, String),它是如何工作的?它不支持将 URL 作为其值。我问它是因为将路径作为字符串传递给 setProperty 对我不起作用。
  • @DanielT.Sobrosa,您是否尝试使用答案中提到的前缀?
  • 是的,但我发现了问题......我犯了一个错误。在log4j.configuration 系统属性的初始化之前,我得到了一个记录器实例。现在一切正常。谢谢。
【解决方案2】:

您可以设置虚拟机参数:-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>);   
}

【讨论】:

    【解决方案3】:

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

    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
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2017-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-31
      • 1970-01-01
      • 2013-01-31
      相关资源
      最近更新 更多