• 欢迎访问天天编码网站,Java技术、技术书单、开发工具,欢迎加入天天编码
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏天天编码吧
  • 我们的淘宝店铺已经开张了哦,传送门:https://shop145764801.taobao.com/

深入分析Java的内置日志API(java.util.logging)(二)

Java框架 tiantian 1531次浏览 0个评论 扫描二维码

Handler(日志处理器)

logjdklogjdkLogger Handler 作为 JUL 中的六大组件之一,主要负责日志信息输出到外部系统的的实际工作。一个 Logger 对象可以具有多个 Handler 对象。一条日志信息再经过了 Logger 对象的 Level 和 Filter 过滤之后,就转换成 LogRecord 对象并传递给 Handler 对象进行处理。

Formatter(日志格式化器)

logjdklogjdk一般而言,Handler 在输出最终的日志信息之前,会使用一个 Formatter 格式化该 LogRecord 成为字符串。这个 Formatter 的对应类是 java.util.logging.Formatter 。Java工程师既可以创建自己的 Formatter,也可以使用 JUL 中内建的两个 Formatters 中的任何一个。

logjdklogjdk JUL 中内建的两个 Formatters 是:
* SimpleFormatter
* XMLFormatter
JUL 中默认的多个 Handler 使用的就是这两个内置 Formatters 中的某一个。当然,Java工程师完全可以创建自己的 Formatter 并设置给 Handler。

logjdklogjdk创建个性化 Formatter 的方式可以是创建一个 java.util.logging.Formatter 的子类。一个简单的示例代码如下:

public class SimpleFormatter extends Formatter {
@Override
public String format(LogRecord record) {
return record.getLevel() + ":" + record.getMessage();
}
}

format(LogRecord) 方法返回的 String 对象就是被 Handler 最后返回给外部系统的最终结果。通过创建自己的 Formatter 对象,Java工程师可以完全地控制日志信息格式。

Level(日志级别)

logjdklogjdk在 JUL 中,具有一个比较简单的 Level 机制,用来过滤日志信息和提高程序性能。Level 的对应的类是 java.util.logging.Level ,该类使用一系列的字符串常量来一一对应不同的 Level 。在该机制中共有三种对象可以具有 Level ,它们分别是日志信息、Logger 对象和 Handler 对象。这三种对象的 Level 之间的相对大小关系决定了具体日志信息最终是否能够被输出。

logjdklogjdk任何一个使用 Logger 对象进行输出的任何一条日志信息都会获得一个确定的 Level 。JUL 中内建的 Level 有:

  • SERVRE
  • WARNING
  • INFO
  • CONFIG
  • FINE
  • FINER
  • FINEST
    > 这七个 Level 的重要性由上至下依次降低。

使用 Logger 对象进行日志记录时,设置该条日志信息的 Level 的一个示例代码如下:

Logger.log(Level.SEVERE, "www.tiantianbianma.com");

logjdklogjdk不仅日志信息本身具有 Level ,Logger 对象也同样具有 Level 。通过设置 Logger 对象的 Level ,使得 Logger 对象可以传播或者遏制某些具有特定 Level 的日志信息。设置 Logger 对象的 Level 的示例代码如下:

logger.setLevel(Level.WARNING);

这样设置后,logger 会遏制所有 Level 低于 WARNING 级别的日志信息。

logjdklogjdk除了 Logger 对象可以具有 Level 并根据日志信息的 Level 来过滤外,Handler 对象也可以具有  Level 并根据日志信息的 Level 来过滤。因为 Handler 对象操作 Level 的方式与 Logger 对象操作 Level 的方式基本相同,所以不再重复讲解。

Filter(日志过滤器)

logjdklogjdkFilter 的作用是过滤掉某些日志信息,它在 JUL 中对应的接口是 java.util.logging.Filter 。通过将 Filter 对象设置给 Logger 对象,Java工程师可以实现精确控制日志信息的遏制与传播。首先,我们看一下 Filter 接口的定义:

public interface Filter {
public boolean isLoggable(LogRecord record);
}

如果 isLoggable(LogRecord) 方法返回 false,则该 LogRecord 对应的日志信息会被该 Logger 遏制;如果该方法返回 true,则该 LogRecord 对应的日志信息会被该 Logger 传播给对应的 Handlder 对象。

logjdklogjdk因为 Filter 只是一个接口,不能用来创建对象。所以,为了创建一个 Filter 对象,必须先实现该接口。实现该 Filter 接口并不复杂,我们看一个简单的示例代码:

public class SimpleFilter implements Filter {
@Override
public boolean isLoggable(LogRecord record) {
return false;
}
}

这个示例代码的 SimpleFilter 会遏制所有的日志信息,这当然只是为了演示,实际项目代码中不会实现这样一个无用的过滤器。实际项目中,Java工程师应该检查 LogRecord 的属性,并基于这些属性的值决定 isLoggable(LogRecord) 方法的返回值。

如果读者对于 LogRecord 的细节感兴趣,建议查看天天编码这篇文章;


天天编码 , 版权所有丨本文标题:深入分析Java的内置日志API(java.util.logging)(二)
转载请保留页面地址:http://www.tiantianbianma.com/java-logging-logjdk-two.html/
喜欢 (3)
支付宝[多谢打赏]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址