从外部文件加载配置
在启动程序时指定配置文件
java -Djava.util.logging.config.file=configFile MainClass
日志管理器(LogManager)是在 VM 启动时,main 执行前初始化的,因此在 main 中重新设置系统属性之后,需要重新初始化 LogManager。
System.setProperty("java.util.logging.file", "/path/to/config/file");
LogManager.getLogManager().readConfiguration(in);
或者让 LogManager 直接从文件流中读取配置:
InputStream in = LearningLogging.class.getResourceAsStream("/logging.properties");
LogManager.getLogManager().readConfiguration(in);
logging.properties 配置
默认日志级别
.level=FINE
设置 handler
handlers=java.util.logging.ConsoleHandler
设置 logger 日志级别
com.codebelief.app.level=FINE
设置 handler 日志级别
java.util.logging.ConsoleHandler.level=FINE
设置 handler 的 formatter
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter
其它 handler 选项
java.util.logging.FileHandler.pattern = %h/java%u.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
默认日志级别为 INFO,要输出更低级别的日志,不仅需要修改 logger 的日志级别,还需要修改对应 handler 的日志级别。即输出级别同时大于 logger 和 handler 的级别时,才会真正记录日志。
Logger 的使用
全局 logger
Logger.getGlobal();
自定义 logger
Logger.getLogger("com.codebelief.app");
添加 handler
%h
表示用户目录
FileHandler fileHandler = new FileHandler("%h/myapp.log", size_limit, max_file_count);
logger.addHandler(fileHandler);
不使用父级 handler
logger.setUseParentHandlers(false);
设置日志级别
logger.setLevel(Level.WARNING);
fileHandler.setLevel(Level.WARNING);
设置 formatter
logger.setFormatter(...);
fileHandler.setFormatter(...);
Logger 的层次结构
logger 存在层次结构,体现在其名字中:"" -> "com" -> "com.codebelief" -> "com.codebelief.app"
->
表示派生关系,即左侧的 logger 是右侧 logger 的 parent。
logger 除了自己记录日志之外,还会将日志发送给其父级 handler,不断回溯到根 handler(名字为空串 ""),即 ConsoleHandler。
注意,虽然 logger 不会记录级别比自己低的日志,但仍然会把这些日志发送给父级 handler 处理。
可通过 logger 的 setUseParentHandlers 来决定是否递归使用父级 handler 来记录日志。
作者:Wray Zheng
原文:http://www.codebelief.com/article/2018/04/usage-of-java-logging-module/