【问题标题】:Load java.util.logging.config.file for default initialization加载 java.util.logging.config.file 进行默认初始化
【发布时间】:2023-03-11 04:36:01
【问题描述】:

我正在尝试在我的应用程序启动时加载自定义 log.properties 文件。

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

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

【问题讨论】:

    标签: java properties java.util.logging


    【解决方案1】:

    Java 日志不会在整个硬盘中搜索文件;如何查找文件有非常简单的规则。您希望 Java 看到这两个文件属于彼此,但您没有在任何地方这么说。由于 Java 发现属性文件和您的类之间没有任何联系,只是它们位于磁盘上的同一文件夹中,因此找不到该文件。

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

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

    【讨论】:

    • 您好,感谢您的回答。我刚开始接触java,所以我不太了解打包等。我有一个NetBeans 默认项目,其中包含一个名为javaapplication 的包。 log.properties 文件现在位于默认包中。所以我的命令行看起来像这样: JavaApplication\dist>javaw -Djava.util.logging.config.file=log.properties -jar JavaApplication.jar 仍然没有加载属性文件。你能给我一个额外的提示吗? :)
    • 你确定它没有加载吗? “javaw”将所有输出吞入 System.out 和 System.err。改用“java”(不带“w”)。此外,您可以尝试调试代码以查看其未记录的原因。只需设置一个断点并“进入”日志调用(而不是“跳过”)。 log4j 提供了一个调试选项,使它在读取配置时打印配置;我不知道你是否可以对 java.util.logging 做同样的事情。
    • 感谢您的回复。我想我会通过一个类坚持运行时配置,因为我无法使用相对路径加载属性文件。
    • 这个答案不正确。您不能简单地将文件放在工作目录或类路径中。您必须指定java.util.logging.config.filejava.util.logging.config.class;否则它将查看$JAVA_HOME。请参阅java.util.logging.LogManager 中的readConfiguration 方法。
    • @BrianGordon:你完全正确。我想我把它与使用getResourceAsStream() 加载属性混合在一起,LogManager 没有这样做。固定。
    【解决方案2】:

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

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

    【讨论】:

    • (多年后,在 jul 终于被更好地理解 :-) )它当然不需要 absolute 路径;但它文件路径(相对或绝对);作为替代方案,您可以使用-Djava.util.logging.config.class={class} 而不是-Djava.util.logging.config.file=path/to/my.properties,为 LogManager 提供类提要属性(如预期的那样从类路径加载)而不是从文件中加载它们,但我认为每个人都可以同意 java.util. util.logging 有点原始,而且 ---log4j--- (update) slf4j+logback 更容易配置和更好的日志记录选项
    【解决方案3】:

    您可以非常轻松地从相对路径动态加载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());
    }
    

    【讨论】:

    • 太棒了,正是我所寻找的,就像一个魅力!
    • 使用"/logging.properties" 将导致getResourceAsStream() 返回null。您应该只使用"logging.properties" - 类加载器会考虑与类路径相关的所有内容,而不会将类路径元素的集合视为“/”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-29
    • 2012-11-29
    • 2020-12-08
    • 2020-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多