Google 近期新发布了一种称为 Flogger 的开源 Java 日志框架。总所周知,“在开源 Java 日志 API 领域中已充斥了多种产品”。但据 Google 宣称,Flogger 可“比现有的日志 API 提供更多的优点”。其中包括:降低了禁用日志语句的代价、增加了总体的可读性,以及对可扩展性的支持。
“Flogger”源自于“Fluent”和“logger”的混合。Flogger 宣称其主要优点之一是“对于已禁用日志层级的完全无代价实现”,而其他所有日志记录框架依然可能会对已禁用的日志语句生成字节码。Flogger 在设计上考虑了完全避免产生额外的代价。
具体而言,由于无法预先确定日志方法调用中的参数数量,为避免维护成百上千难以预测的各异方法签名,日志框架通常采用了 varargs 机制。但使用 varargs 会额外生成字节码,特别是需要分配 Object [] 对象存储 varargs。尽管在通常情况下并不需要特别关注这些字节码,但如果应用中日志记录的粒度非常细,或是日志记录语句出现在程序循环体中,那就不容忽视了。
Flogger 通过 API 设计避免产生此类额外的代价。Fluent 调用链始终以选择器(selector)为开始。该选择器指定了 atInfo() 等特定的日志级别,并返回该日志记录级别的一个实现。在禁用日志语句的情况下,选择器返回一个单例(singleton)空操作(np-op)实现。
Flogger 正着力改进的另一个方向是可读性。据 Google 介绍,Flogger 提供了更具表现力的 Fluent API,支持更丰富的“自记录日志语句”。下例给出了一个典型的日志记录语句,用于记录错误及异常。
复制代码
log.error("The arg, '{}' caused an error",arg, exception)
在 Flogger 中,同一语句实现为:
复制代码
logger.atError() .withCause(exception) .log("The arg, ‘%s’ caused an error", arg);
除了可读性方面的改进之外,Flogger 还在设计中考虑了可扩展性,并支持自定义扩展。使用 Flogger,开发人员“可以局部扩展日志 API,并在 Fluent 方法链中添加其他方法”。
目前,Flooger 自定义扩展的文档和示例还很有限。Google 只提供了一个创建 UserLogger 的示例。UserLogger 对每个用户给出了独立于主日志文件的单独日志记录。
复制代码
logger.at(INFO) .forUserId(id) .log("Message: %s", param);
Flogger 项目的 GitHub 网站 提供了更多信息,其中包括 新手指南 和 最佳实践 文档。
译者注:使用日志框架中,另一个需要考虑的主要代价来自于日志的实时组装。Flogger 中考虑了惰性评估( lazy evaluation)技术,即在代码实际运行时执行定义的操作。当然,该技术也被所有主流日志框架使用,例如 log4j 和 SLF4j 等,并非 Flogger 独具的亮点。
查看英文原文: Google Releases New Java Logging Framework