我有一个使用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文件。我怎么能这样做?
答案 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)
以上所有答案都不满足,所以我在这里发布的是将来可能需要这个的人:
编程方式:
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();
}
}
# 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
希望这有帮助。