级别
-
SEVERE (highest value, a serious failure)
-
WARNING (a potential problem)
-
INFO (informational messages)
-
CONFIG (configuration messages)
-
FINE (tracing information)
-
FINER (a fairly detailed tracing message)
-
FINEST (lowest value, a highly detailed tracing message)
-
OFF (turn off logging)
-
ALL (enable logging of all messages)
类
- Logger
对外发布的日志记录器,应用系统可以通过该对象完成日志记录的功能
- LogRecord
日志信息描述对象
- LogManager
单一的全局 LogManager 对象,可用于维护 Logger 和日志服务的一组共享状态
- Level
定义日志的记录级别
- Handler
日志处理器,接收处理LogRecord对象
- Formatter
日志格式化转换器,在Handler处理日志时,提供格式化操作
- Filter
日志过滤器,接口对象,在日志被 Handler 处理之前,起过滤作用
流程
//在Logger工厂(LogManager)中生成一个名为log.demo的日志管理器
Logger logDemo = Logger.getLogger("log.demo");
// 记录一条日志级别为Level.SEVERE的日志消息
logDemo.severe("this is a severe log");
//在Logger中,根据日志级别和日志消息,生成LogRecord对象
public void log(Level level, String msg) {
if (!isLoggable(level)) {
return;
}
LogRecord lr = new LogRecord(level, msg);
doLog(lr);
}
//在Logger中,调用handler处理logRecord对象
for (Handler handler : loggerHandlers) {
handler.publish(logRecord);
}
//在handler中,调用formatter格式化logRecord
msg = getFormatter().format(logRecord);
示例
Logger logger = Logger.getLogger(App.class.getName());
//构造Handler
FileHandler handler = new FileHandler("E:\\TMP\\log.xml");
//为handler设置formatter
handler.setFormatter(new SimpleFormatter());
//构造Filter
Filter filter = new Filter() {
@Override
public boolean isLoggable(LogRecord record) {
if (record.getLevel().intValue() == Level.WARNING.intValue()) {
return false;
}
return true;
}
};
//为handler设置filter
handler.setFilter(filter);
//为logger设置filter
logger.setFilter(filter);
//为logger设置handler
logger.addHandler(handler);
疑问
- 并没有设置Handler,默认的Handler是如何被设置的?
在我们应用程序中第一次调用Logger.getLogger("log name")时,自动生成了名字为空白字符的根日志对象的。 根日志对象设置了ConsoleHandler,所以没有显示指定Handler时,其也能在控制台中输出日志消息。