java.util.logging包中主要的类有以下几个:
LogManager 存在一个单一的全局 LogManager 对象,它可用于维护 Logger 和日志服务的一组共享状态。
Logger Logger 对象用来记录特定系统或应用程序组件的日志消息
LogRecord LogRecord 对象用于在日志框架和单个日志 Handler 之间传递日志请求
Handler Handler 对象从 Logger 中获取日志信息,并将这些信息导出
Formatter Formatter 为格式化 LogRecords 提供支持
简单的来说:
LogManager是一个存放Logger的工厂,我们每次生成Logger时,如果是新的Logger(Logger的名字在LoggerManager中不存在),那么将在LogManager中生成一个新的Logger,如果是已有的Logger,那么直接取之并使用。
Logger logDemo = Logger.getLogger("log.demo"); // 在Logger工厂(LogManager)中生成一个名为log.demo的日志管理器,
当使用Logger来生成一条日志时,其将首先将日志保存在LogRecord中,并将LogRecord传送给Handler进行导出工作,当然如果需要对导出内容进行格式化处理,那么就需要在Handler导出日志前,为Handler指定一个日志格式化处理器,也就是Formatter干的工作。
logDemo.severe("this is a severe log"); // 记录一条日志级别为Level.SEVERE的日志消息
运行程序将看到控制台输入消息:
五月 24, 2015 7:44:10 上午 cn.kolbe.java.log.LogDemo main
严重: this is a severe log
在这有个疑问,前面说过LogRecord负责记录消息,Handler负责日志导出,Formatter负责日志格式化,可是为何上面我们并没有显示将消息传递给LogRecord,也没有显示为Logger添加Handler,更没有为Handler添加Formatter,其就自动的在控制台(System.err)中输出消息了!为了解除疑问,让我们看一下Logger的源代码中的severe()方法
1 public class Logger { 2 public void severe(String msg) { 3 log(Level.SEVERE, msg); 4 } 5 public void log(Level level, String msg) { 6 if (!isLoggable(level)) { 7 return; 8 } 9 LogRecord lr = new LogRecord(level, msg); 10 doLog(lr); 11 } 12 private void doLog(LogRecord lr) { 13 lr.setLoggerName(name); 14 final LoggerBundle lb = getEffectiveLoggerBundle(); 15 final ResourceBundle bundle = lb.userBundle; 16 final String ebname = lb.resourceBundleName; 17 if (ebname != null && bundle != null) { 18 lr.setResourceBundleName(ebname); 19 lr.setResourceBundle(bundle); 20 } 21 log(lr); 22 } 23 public void log(LogRecord record) { 24 if (!isLoggable(record.getLevel())) { 25 return; 26 } 27 Filter theFilter = filter; 28 if (theFilter != null && !theFilter.isLoggable(record)) { 29 return; 30 } 31 32 // Post the LogRecord to all our Handlers, and then to 33 // our parents' handlers, all the way up the tree. 34 35 Logger logger = this; 36 while (logger != null) { 37 final Handler[] loggerHandlers = isSystemLogger 38 ? logger.accessCheckedHandlers() 39 : logger.getHandlers(); 40 41 for (Handler handler : loggerHandlers) { 42 handler.publish(record); 43 } 44 45 final boolean useParentHdls = isSystemLogger 46 ? logger.useParentHandlers 47 : logger.getUseParentHandlers(); 48 49 if (!useParentHdls) { 50 break; 51 } 52 53 logger = isSystemLogger ? logger.parent : logger.getParent(); 54 } 55 } 56 } |