2012-09-25 75 views
9

我有一个使用log4j的Eclipse Java项目。我无法设置log4j配置文件被文件路径访问。我必须在jar中导出和运行项目。如何设置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:\用户\ roncsak \ eclipse_workspace \ WITA \资源\的log4j.xml这是很好的。 WITA是该项目的基础文件夹。但随着-Dlog4j.debug参数运行项目的下列回报也:

 
log4j: Trying to find [C:\Users\roncsak\eclipse_workspace\WITA\resources\log4j.xml] using context classloader [email protected] 
log4j: Trying to find [C:\Users\roncsak\eclipse_workspace\WITA\resources\log4j.xml] using [email protected] 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文件。我怎样才能做到这一点?

回答

18

从 “默认初始化程序” 在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(资源,记录器搜索来自 类路径资源。类) ,它返回一个URL。请注意,字符串“log4j.properties” 构成了一个格式不正确的URL。有关搜索位置的列表,请参阅Loader.getResource(java.lang.String) 。

所以你需要预先设置,它可以作为URL进行处理,以便file:log4j.configuration属性值。

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

更妙的是代码:

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

它的工作原理!非常感谢你! – roncsak

+4

'java.io.File.toURL()'现在已经过时。相反,使用:'x.toURI()。toURL()' – kevinarpe

+0

它的功能完美,只是一个“文件:”花了我一整个早上,我想亲吻你的家伙。 – BenBen

5

您可以设置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>); 
} 
0

所有这些上面的回答没有满足,所以我张贴在这里的人谁可能需要这个在未来:

  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(); 
    } 
} 
  • 创建自己的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 
    

    希望这有助于。