JDK1.4提供的 java logger utilities有两个重要的类:
java.util.logging.Logger
java.util.logging.Handler
几个问题:
1)缺省配置文件 liblogging.properties
2)关于 level 配置项
3)关于动态 setLevel
1)缺省配置文件 lib/logging.properties
在这个文件里的配置项,并不是 system properties!只是用于 Logger 的properties配置项。
因此:
1)不能用System.getProperty()得到logging.properties里面的配置的;
2)在java命令行上不能指定logger的level等参数,如 java -Djava.util.logging.ConsoleHandler.level=ALL
例外:可以指定logger配置文件,如 java -Djava.util.logging.config.file=myfile
2)关于 level 配置项
OFF
SEVERE
WARNING
INFO
CONFIG
FINE
FINER
FINEST
ALL
测试说明:使用 ConsoleHandler
测试结论:
必须同时设置以下两个配置项为相同的值,第一个代表的是 Logger 对象,第二个代表的是 ConsoleHandler 对象。
.level=xxx
java.util.logging.ConsoleHandler.level=xxx
例如:
只设置后面的为 ALL, 前面依然为 INFO,最终的结果也只能输出到 INFO 级别。
原因:
Logger 首先会检查自己的 loglevel,如果通过,则会提交给 ConsoleHandler;
ConsoleHandler 会检查自己的 loglevel,如果通过,则会真正记录日志。
3)关于动态 setLevel
Logger 首先会 Post the LogRecord to all our Handlers, and then to our parents' handlers, all the way up the tree.
通过Logger.getLogger("name")得到的 Logger,其 handler 属性为空;因此只有通过其 Parent 才能形成有效输出。
其parent是 java.util.logging.LogManager$RootLogger 对象,这个对象的 handlers 非空,一般是 java.util.logging.ConsoleHandler 对象。
因此,在程序中动态设置日志级别 setLevel 的方法是:
首先设置 Logger 自己的 level,并设置 handlers 的 level, if any;
然后设置 Logger's parent 的 level 及其 handlers 的level;
如此循环,直至 top level。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9844649/viewspace-580178/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/9844649/viewspace-580178/