【问题标题】:Setting java.util.logging.config.file at runtime在运行时设置 java.util.logging.config.file
【发布时间】:2012-11-09 10:11:18
【问题描述】:

我正在尝试在运行时设置 java util logging 配置文件,以避免将其设置为 VM 参数。 但这只是行不通。每当我尝试重新读取配置时,日志都会被完全禁用。

见以下代码sn-p:

package test;

import java.io.FileInputStream;
import java.util.logging.Level;
import java.util.logging.LogManager;
import java.util.logging.Logger;

public class A {
  private static final Logger LOGGER= Logger.getLogger(A.class.getName());

  public static void main(String[] args) throws Exception {
    System.out.println("--- start");
    LOGGER.log(Level.SEVERE, "SEVERE 1");
    LOGGER.log(Level.FINEST, "FINEST 1");
    LogManager.getLogManager().readConfiguration();
    LOGGER.log(Level.SEVERE, "SEVERE 2");
    LOGGER.log(Level.FINEST, "FINEST 2");
    LogManager.getLogManager().readConfiguration(new FileInputStream("/tmp/logging.properties"));
    LOGGER.log(Level.SEVERE, "SEVERE 3");
    LOGGER.log(Level.FINEST, "FINEST 3");
    System.out.println("--- end");
  }
}

如果我在没有任何 VM 参数的情况下运行该类,这是输出:

--- start
09.11.2012 09:59:25 test.A main
SCHWERWIEGEND: SEVERE 1
09.11.2012 09:59:25 test.A main
SCHWERWIEGEND: SEVERE 2
--- end

如您所见,仅记录 SEVERE 级别,因为这是 JRE logging.properties 的默认设置。调用LogManager#readConfiguration() 不会改变任何东西。但是当试图从我的 logging.properties 中读取配置时,绝对没有记录任何内容。调用LogManager#readConfiguration(InputStream)或设置java.util.logging.config.file属性和调用LogManager#readConfiguration()没有区别。

现在看到下一个输出,当我使用 VM 属性 -Djava.util.logging.config.file=/tmp/logging.properties 运行相同的代码时:

--- start
2012-11-09 10:03:44.0838 SEVERE  [test.A#main()] - SEVERE 1
2012-11-09 10:03:44.0843 FINEST  [test.A#main()] - FINEST 1
--- end

如您所见,SEVERE 和 FINEST 级别都被记录,并且它们以不同的格式记录。两者都在我的自定义logging.properties 中指定。 但是在调用LogManager#readConfiguration() 后,日志记录会停止在这里!这与上面的示例不同,我不明白。此外,就像上面的示例一样,调用 LogManager#readConfiguration(InputStream) 不起作用。

那么问题是什么?根据javadoc 在运行时设置 java.util.logging.config.file 属性应该可以工作。两个 readConfiguration() 方法也应该像我预期的那样工作。那么问题出在哪里?

【问题讨论】:

  • 这可能对你有帮助:stackoverflow.com/questions/6315699/…
  • 不,它没有帮助。也许我误解了您的建议,但该问题及其答案谈论的是完全以编程方式配置记录器。我想使用 logging.properties 文件,但在运行时读取它(因为我不想在命令行设置 VM 参数)。另外,让我感到困惑的是,readConfiguration() 方法似乎并没有做它们应该做的事情。
  • 我测试过,它对我有用。 readConfiguration() 读取配置,然后使用新的记录器配置。 JDK 1.6.0_27.
  • 我尝试使用 JDK 1.6.0_26、1.6.0_31 和 1.7.0_07。全部在 Linux 下。它们都不起作用。你试过我上面的代码 sn-p 吗?如果是,输出是什么?如果没有,您能否提供一个对您有用的示例,以便我可以尝试一下?

标签: java logging runtime java.util.logging


【解决方案1】:

您的日志记录属性可能有问题。我注意到我必须在配置(根和控制台)中使用两个级别规范才能获得结果。
也许您的根记录器级别低于FINEST,例如INFO (.level=INFO)。
或者根本没有设置,在这种情况下我想它是INFO

我使用以下 logging.properties 运行您的代码:

handlers=java.util.logging.ConsoleHandler
.level=FINEST
java.util.logging.ConsoleHandler.level=FINEST

未指定-Djava.util.logging.config.file=/tmp/logging.properties 输出为:

--- start
09.11.2012 14:25:49 testing.Scribble main
SCHWERWIEGEND: SEVERE 1
09.11.2012 14:25:49 testing.Scribble main
SCHWERWIEGEND: SEVERE 2
09.11.2012 14:25:49 testing.Scribble main
SCHWERWIEGEND: SEVERE 3
09.11.2012 14:25:49 testing.Scribble main
AM FEINSTEN: FINEST 3
--- end

看起来正确! (我的测试类叫做 testing.Scribble,这是唯一的区别)

使用-Djava.util.logging.config.file=/tmp/logging.properties 输出为:

--- start
09.11.2012 14:31:06 testing.Scribble main
SCHWERWIEGEND: SEVERE 1
09.11.2012 14:31:06 testing.Scribble main
AM FEINSTEN: FINEST 1
09.11.2012 14:31:06 testing.Scribble main
SCHWERWIEGEND: SEVERE 2
09.11.2012 14:31:06 testing.Scribble main
AM FEINSTEN: FINEST 2
09.11.2012 14:31:06 testing.Scribble main
SCHWERWIEGEND: SEVERE 3
09.11.2012 14:31:06 testing.Scribble main
AM FEINSTEN: FINEST 3
--- end

看起来也正确!

【讨论】:

  • 你是对的。问题出在我的 logging.properties 中。这是handlers 指令。在我的 logging.properties 中,我在它前面写了一个点:.handlers。删除点后,它可以工作。但令我困惑的是,通过 VM 参数设置相同的 logging.properties 文件时,它可以正常工作。这很奇怪(我会称之为错误)。
猜你喜欢
  • 2011-08-22
  • 2017-02-08
  • 2011-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-16
  • 2018-11-02
  • 2011-01-31
相关资源
最近更新 更多