在运行时设置java.util.logging.config.file

在运行时设置java.util.logging.config.file,java,logging,runtime,java.util.logging,Java,Logging,Runtime,Java.util.logging,我试图在运行时设置java util日志记录配置文件,以避免将其设置为VM参数。 但这根本不起作用。每当我试图重新读取配置时,日志记录都会被禁用 请参阅以下代码段: 封装测试; 导入java.io.FileInputStream; 导入java.util.logging.Level; 导入java.util.logging.LogManager; 导入java.util.logging.Logger; 公共A类{ 私有静态最终记录器Logger=Logger.getLogger(A.class.

我试图在运行时设置java util日志记录配置文件,以避免将其设置为VM参数。 但这根本不起作用。每当我试图重新读取配置时,日志记录都会被禁用

请参阅以下代码段:

封装测试;
导入java.io.FileInputStream;
导入java.util.logging.Level;
导入java.util.logging.LogManager;
导入java.util.logging.Logger;
公共A类{
私有静态最终记录器Logger=Logger.getLogger(A.class.getName());
公共静态void main(字符串[]args)引发异常{
System.out.println(“--start”);
记录器日志(严重级别,“严重1”);
记录器日志(最细级,“最细1”);
LogManager.getLogManager().readConfiguration();
记录器日志(严重级别,“严重2”);
记录器日志(最细级,“最细2”);
LogManager.getLogManager().readConfiguration(新文件输入流(“/tmp/logging.properties”);
记录器日志(严重级别,“严重3”);
记录器日志(最细级别,“最细级别3”);
System.out.println(“--end”);
}
}
这是在没有任何VM参数的情况下运行类时的输出:

如您所见,只记录严重级别,因为这是JREs 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

正如您所见,严重级别和最精细级别都会被记录,并且它们以不同的格式记录。这两者都在我的自定义
日志记录.properties
中指定。 但是,在调用
LogManager\readConfiguration()后,日志记录在此停止。
!这与上面的例子不同,我不理解。此外,正如上面的示例中一样,调用
LogManager#readConfiguration(InputStream)
不起作用


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

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

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

未指定
-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文件,但在运行时读取它(因为我不想在命令行中设置VM参数)。另外,让我困惑的是,
readConfiguration()
方法似乎并没有完成它们应该做的事情。我测试了它,它适合我
readConfiguration()
读取配置,然后使用新的记录器配置。JDK1.6.0_27。我尝试使用JDK1.6.0_26、1.6.0_31和1.7.0_07。都在Linux下。它们都不起作用。你试过我上面的代码片段了吗?如果是,输出是什么?如果没有,你能提供一个对你有用的例子,让我用这个来试试吗?你是对的。问题出在我的logging.properties中。这是
处理程序
指令。在我的logging.properties中,我在前面写了一个点:
.handlers
。去掉圆点后,它就工作了。但让我困惑的是,当通过VM参数设置它时,相同的logging.properties文件工作正常。这很奇怪(我称之为bug)。
handlers=java.util.logging.ConsoleHandler
.level=FINEST
java.util.logging.ConsoleHandler.level=FINEST
--- 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
--- 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