如何设置log4j属性文件?

时间:2012-09-25 08:57:17

标签: java log4j

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

以下是我的尝试方式:

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: Trying to find [C:\Users\roncsak\eclipse_workspace\WITA\resources\log4j.xml] using context classloader sun.misc.Launcher$AppClassLoader@18e3e60.
log4j: Trying to find [C:\Users\roncsak\eclipse_workspace\WITA\resources\log4j.xml] using sun.misc.Launcher$AppClassLoader@18e3e60 class loader.
log4j: Trying to find [C:\Users\roncsak\eclipse_workspace\WITA\resources\log4j.xml] using ClassLoader.getSystemResource().
log4j: Could not find resource: [C:\Users\roncsak\eclipse_workspace\WITA\resources\log4j.xml].

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

3 个答案:

答案 0 :(得分:21)

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

  
      
  • 将资源字符串变量设置为的值   log4j.configuration系统属性。指定的首选方法   默认初始化文件是通过log4j.configuration系统实现的   属性。如果系统属性log4j.configuration不是   define,然后将字符串变量资源设置为其默认值   “log4j.properties”。
  •   
  • 尝试将资源变量转换为URL。
  •   
  • 如果资源变量无法转换为URL,例如due   到MalformedURLException,然后从中搜索资源   classpath通过调用   org.apache.log4j.helpers.Loader.getResource(resource,Logger.class)   返回一个URL。请注意字符串“log4j.properties”   构成格式错误的网址。请参阅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());

答案 1 :(得分: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>);   
}

答案 2 :(得分:0)

以上所有答案都不满足,所以我在这里发布的是将来可能需要这个的人:

  1. 您需要指定您的财产所在的位置。通过程序或命令选项都可以。
  2. 编程方式:

    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文件:
    2. #  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
      

      希望这有帮助。