Java logging 模块的使用

从外部文件加载配置

在启动程序时指定配置文件

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 来记录日志。

相关文章

Loading Likes...

发表评论

电子邮件地址不会被公开。 必填项已用*标注