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

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

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

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

  从源码中可以看到
  1)severe()方法中调用了public void log(Level level, String msg)方法,将日志消息级别设置为Level.SEVERE,
  2)在log(Level level, String msg)方法中可以看到,其生成了一个LogRecord对象,也就是日志消息对象
  3)接着又调用了private void doLog(LogRecord lr)方法,该方法主要是设置本地化语言包,暂且跳过
  4)最后调用public void log(LogRecord record)方法,在该方法中有个while循环,首先通过Logger类中的getHandlers()方法,获取当前Logger对象中已经设置的Handler对象,然后调用Handler类中的publish()方法打印日志消息记录(可是我们并没有设置Handler啊?接着往下看)
  5)在循环体底下可以看到logger = isSystemLogger ? logger.parent : logger.getParent();该语句的作用是遍历logger对象中的父对象,并将LogRecord传递给父对象的Handler
  6)
  Logger parent = logDemo.getParent();
  System.out.println("parent.getName() : " + parent.getName());
  System.out.println("parent.getClass().getName() : " + parent.getClass().getName());
  控制台输入:
  parent.getName() :
  parent.getClass().getName() : java.util.logging.LogManager$RootLogger
  发现Logger的默认根日志对象是LogManager的内部类RootLogger类的对象,并且根日志对象的名字为空白字符!
  让我们验证一下:
  Logger rootLog = Logger.getLogger("");
  System.out.println("rootLog.getClass().getName() : " + rootLog.getClass().getName());
  控制台输出:
  rootLog.getClass().getName() : java.util.logging.LogManager$RootLogger
  另外让我们再看一下根Log是否有默认的Handler对象:
  Handler[] handlers = rootLog.getHandlers();
  for(int i = 0; i < handlers.length; i++) {
  System.out.println(handlers[i].getClass().getName());
  }
  控制台输出:
  java.util.logging.ConsoleHandler
  原来根Log默认装配了ConsoleHandler(对应的是控制台输出)所以在我们生成日志消息时没有显示指定Handler时,其也能在控制台中输入日志消息,你可能会问,根Log是在什么时候生成的?其是在我们应用程序中第一次调用Logger.getLogger("log name")时由LogManager对象进行装配的。具体过程将在下次进行解析。
  注:另外文中忽略了Level(Log日志级别):用来控制日志发布的级别,以及Filter(Log日志过滤):用来鉴定消息是否应发布给LogRecord或者直接丢弃。这块内容将找个时间补上。
22/2<12
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

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

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

沪ICP备05003035号

沪公网安备 31010102002173号