rad*_*lan 8 java logging runtime java.util.logging
我试图在运行时设置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");
}
}
Run Code Online (Sandbox Code Playgroud)
如果我运行没有任何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
Run Code Online (Sandbox Code Playgroud)
如您所见,仅记录SEVERE级别,因为这是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:
--- 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
Run Code Online (Sandbox Code Playgroud)
如您所见,SEVERE和FINEST级别都会被记录,并以不同的格式记录.两者都在我的自定义中指定logging.properties.但是,记录会停止在这里打完电话后LogManager#readConfiguration()!这与上面的例子不同,我不明白.此外,就像上面的例子一样,调用LogManager#readConfiguration(InputStream)不起作用.
那么问题是什么?根据javadoc设置,运行时的java.util.logging.config.file属性应该可以工作.另外两个readConfiguration()方法都应该像我期望的那样工作.那么问题是什么?
可能是您的日志记录属性有问题。我注意到我必须在配置(根和控制台)中使用两个级别规范才能获得结果。
也许您的根记录器级别低于FINEST,例如INFO( .level=INFO)。
或者根本没有设置,在这种情况下,我认为它是INFO.
我使用以下 logging.properties 运行您的代码:
handlers=java.util.logging.ConsoleHandler
.level=FINEST
java.util.logging.ConsoleHandler.level=FINEST
Run Code Online (Sandbox Code Playgroud)
没有指定-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
Run Code Online (Sandbox Code Playgroud)
看起来正确!(我的测试类叫做 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
Run Code Online (Sandbox Code Playgroud)
看起来也没错!
| 归档时间: |
|
| 查看次数: |
16698 次 |
| 最近记录: |