2009-04-30 1110 views
23

我试图在我的应用程序启动时加载自定义log.properties文件。加载java.util.logging.config.file用于默认初始化

我的属性文件和我的主类在同一个包中,所以我认为-Djava.util.logging.config.file=log.properties命令行参数应该加载属性文件。

但是,只有当我指定属性文件的完整绝对路径时才加载属性。任何建议如何使用相对路径?

回答

18

Java日志记录不会搜索整个硬盘中的文件;有很简单的规则如何查找文件。你希望Java能够看到这两个文件是属于彼此的,但是你没有在任何地方说过。由于Java认为属性文件和类之间没有连接,除非它们位于磁盘上的相同文件夹中,所以它找不到该文件。

-Djava.util.logging.config.file=log.properties仅适用于文件log.properties位于Java进程的当前目录中(可能非常随机)。所以你应该在这里使用绝对路径。

另一种解决方案是将文件logging.properties移动到$JAVA_HOME/lib/(或编辑应该在那里的文件)。在这种情况下,您不需要设置系统属性。

+0

嗨,谢谢你的回答。我刚刚开始使用java,所以我对包装等知之甚少。 我有一个名为javaapplication的包,它有一个NetBeans默认项目。 现在,log.properties文件在默认包中。因此,我的命令行如下所示: JavaApplication \ dist>你能给我一个额外的提示吗? :) – abp 2009-04-30 08:36:32

+0

你确定它没有加载? “javaw”吞下所有输出到System.out和System.err。尝试使用“java”代替(不带“w”)。另外,您可以尝试调试代码以了解为什么它不记录。只需设置一个断点并“进入”日志记录调用(而不是“跳过”)。 log4j提供了一个调试选项,它可以在读取配置时打印配置;我不知道你是否可以用java.util.logging做同样的事情。 – 2009-05-07 14:30:13

+0

感谢您的回复。我想我会坚持通过一个类的运行时配置,因为我无法获得属性文件加载相对路径。 – abp 2009-05-12 07:09:32

5

util logging不从类路径加载,它需要一个绝对路径,这就是为什么其他日志包如log4j更容易配置,并且更适合web应用程序,这对于获取abs路径是一件痛苦的事情。

这在java.util.logging.LogManager doco中根本没有解释。

44

您可以非常容易地从相对路径动态加载java.util.logging属性文件。这是我在我的Main课中放入static {}块的内容。将您的logging.properties文件放在default package中,您可以使用以下代码轻松访问它。

final InputStream inputStream = Main.class.getResourceAsStream("/logging.properties"); 
try 
{ 
    LogManager.getLogManager().readConfiguration(inputStream); 
} 
catch (final IOException e) 
{ 
    Logger.getAnonymousLogger().severe("Could not load default logging.properties file"); 
    Logger.getAnonymousLogger().severe(e.getMessage()); 
}