【翻译】java logging api
想深入学习一下java logging api。网上资料不多。于是翻译了一下jdk的文档。4级都没有过的人的处女翻译作品。轻拍。如果无法忍受。请移步原文。http://docs.oracle.com/javase/6/docs/technotes/guides/logging/overview.html
一、概述
- 控制流概述
应用程序向记录器(Logger)对象发起logging请求。记录器按照命名空间被组织成层级关系,子记录器可以从他们的祖先记录器中继承一些logging属性。
记录器对象向每一个可见的处理器(Handler)对象分发日志记录(LogRecord)。记录器和处理器都可以用日志级别(Level)和过滤器(Filter)(可选的)来决定他们对哪些日志记录感兴趣。当需要往外部发布一条日志记录时。处理器在把它发布到I/O流之前可以用格式化器(Formatter)来本地化和格式化消息。
每个记录器都持有一个他要输出的处理器集合。默认情况下,所有的记录器也都将输出发送给他的父记录器。但是记录器也可以被配置为忽略比他更高层级的处理器。
一些处理器可以重定向到另一些处理器。例如, MemoryHandler 在内部维护了一个日志记录的环形缓冲区(ring buffer),当事件触发时,他直接将它的日志记录发布到目标处理器。在这种情况下,所有的格式化动作都被链上的最后一个处理器来执行。
APIs是结构化的,所以在日志关闭的情况下调用日志APIs可以很经济。假如对于一个日志级别,日志是关闭的。记录器只会做一个经济的比较,然后返回。假如对已一个日志级别,日志是打开的。记录器在将日志记录发往处理器之前仍然非常小心的处理以节省开销。详细的说,本地化和格式化(相对比较耗昂贵)会被延期,直到处理器请求他们。例如, MemoryHandler 维护的日志记录环状缓冲区就没有格式化花销。 - 日志级别
所有的日志信息都有一个关联的日志级别。日志级别粗略的标识了日志信息的重要和紧急程度。日志级别对象被封装成了一个整形的值。值越大表示优先级越高。类Level定义了7种标准的日志级别,从FINEST(优先级最低,值最小)到SEVERE(优先级最高,值最大)。 - 记录器
如前所述,客户端代码发送日志请求给日志对象。每个记录器追踪一个他感兴趣的日志级别,然后抛弃在这个级别以下的日志请求。
记录器通常是用像“java.awt”这样的点号分割的字符串命名的实体。命名空间里是层级的且被日志管理器(LogManager)管理。这个命名空间可以和java的包命名空间保持一致,但这种一致性不是被强制的。例如一个叫“java.awt”的记录器可能处理包java.awt下类的日志请求,也可能处理的是 sun.awt包下类的请求。
除了命名的记录器以外,也有可能创建一个没有在公共命名空间中出现的匿名记录器。
记录器持有他的父记录器引用,父记录器是指在命名空间中,离他最近的一个祖先记录器。根记录器(名称是""的记录器)没有父亲,而所有匿名记录器的父记录器都是根记录器,记录器可以从他的祖先记录器中继承一些属性。详细的说,一个记录器可以继承:
* 日志级别。如果一个记录器的级别被设置成null,则他会遍历他的祖先树找到离他最近的一个非null级别作为他自己的级别。
* 处理器。 默认情况下,记录器不会输出任何的日志消息给他的父记录器或祖先记录器。
* 资源绑定名称。 加入一个记录器有一个空的资源绑定名称,他会从他的父记录器和祖先记录器中继承所有的资源绑定名称。 - 日志方法
类Logger提供了大量的快捷方法用于生成日志消息,为了方便,每一个级别都有以级别名称定义的方法,从而可以让程序员把“ logger.log(Level.WARNING,... ”简单的写成“ logger.warning(... ”
有两种不同风格的日志记录方法,用来适应不同风格的用户群体。
第一种:这种方法需要指定确切的源类名,源方法名。这种方法是为那些需要可以定位日志信息源的程序员们准备的。例如:
void warning(String sourceClass, String sourceMethod, String msg);
第二种:这种方法不需要确切指定源类名和方法名,这种方法是为那些需要方便使用,且不关心日志源的信息的程序员们准备的。例如:
void warning(String msg);
对于第二种方法,日志框架会做一个”最大的努力“来决定日志源于哪个类和哪个方法,并且加到日志记录对象上。然而,重要的是,自动决定的信息可能不是准确的。现代虚拟机大量的优化JIT和可能完全丢失框架线索,导致不可能确切的定位具体的调用者类和方法。 - 处理器
J2SE提供了下列处理器:
* StreamHandler 一个把格式化记录写到输出流里的简单处理器
* ConsoleHandler 一个把格式化记录写到System.err里的简单处理器
* FileHandler 一个把格式化的日志记录写到一个文件或一组滚动日志文件的处理器
* SocketHandler 一个记录日志到远程TCP端口的处理器
* MemoryHandler 内存中一个提供日志记录缓存的处理器
开发一个新的处理器非常简单,开发者可以从头写一个或继承一个现有的处理器来实现一些特定的功能。 - 格式化器
J2SE也包含了两个标准的格式化器
* SimpleFormatter 书写简短的,人类可读的日志记录摘要。
* XMLFormatter 书写详细的XML格式的信息
和处理器一样,开发新的格式化器也非常简单 - 日志管理器
有一个全局的日志管理器持有了全局的日志信息线索。这包含:
* 命名记录器的层次化命名空间
* 从配置文件读取的一组日志控制属性
通过静态方法 LogManager.getLogManager可以得到一个简单的日志管理器对象。他是基于系统属性在日志管理器初始化时建立的。这个性质允许容器应用(如EJB)可以用他们的子类替换默认的日志管理器类 - 配置文件
日志配置可以在启动时被配置文件初始化。日志配置文件是标准的java.util.Properties格式
还有一种方法,可以用一个特定的类来读取配置属性来初始化配置,这种机制允许从任意源读取配置数据,诸如LDAP,JDBC等等
这是全局配置信息的一个子集 - 默认配置
- 动态配置更新
- 本地方法
- XML DTD
- 唯一的消息标识
- 安全
- 配置管理
- 包
- 本地化
- 远程访问和序列化