我正在尝试在运行时设置Java util记录配置文件,以免将其设置为VM参数。但这只是行不通。每当我试图重读配置时,都完全禁用了日志记录。
请参阅以下代码段:
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
您可以看到,仅记录了严重的级别,因为这是jres logging.properties的默认值。调用LogManager#readConfiguration()
不会更改任何内容。但是,当试图从我的登录中读取配置时,绝对没有记录。调用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
您可以看到,严重和最佳级别都记录下来,并以不同的格式记录。两者均在我的自定义logging.properties
中指定。但是记录在致电LogManager#readConfiguration()
后停在这里!这与上面的示例不同,我不明白。另外,就像上面的示例一样,调用LogManager#readConfiguration(InputStream)
不起作用。
那么问题是什么?根据Javadoc设置Java.util.logging.config.file属性,在运行时应该有效。另外,这两个方法都应该按照我的期望来工作。那么问题是什么?
您的记录属性可能是一个问题。我注意到我必须在配置(根和控制台)中使用两个级别的规格来获得结果。
也许您的根记录器级别低于FINEST
,例如INFO
(.level=INFO
)。
或者根本不设置,在这种情况下,我想是INFO
。
我使用以下登录方式运行了您的代码: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
看起来也正确!