Java.util.logging.Logger日志生成过程浅析

发表于:2015-6-11 09:52

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:kolbe    来源:51Testing软件测试网采编

  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 }
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号