日志(Log)是什么?字典对其的解释是"对某种机器工作情况或某项任务进展情况的记载"。对于应用系统来说,日志就应该记录应用系统的运行状况了。
是否需要记录日志?这个问题无需回答,这是毋庸置疑的--当然要记了。
剩下的问题就是应该如何记录日志才能确保日志具有高可用性和低耗性了。日志信息过于简化,乃至于没有日志,则用户无法找到解决问题所需的信息,进而妨碍问题的解决;然而日志信息过于详细不仅会降低系统的性能而且会使真正有用的信息淹没在文字的海洋中。
为此JDK给出了建议的日志分级标准。将不同的信息根据其重要性分级。与此同时可以根据实际需要在JRE中设置需要记录的日志级别--级别高于此值的日志才被记录。依照JDK提供的标准(java.util.logging.Level)将日志划分为OFF、SEVERE、WARNING、INFO、CONFIG、FINE、FINER、FINEST、ALL等从高到低九个级别。他们都分别对应着唯一的整数值,即OFF=Integer.MAX_VALUE、SEVERE=1000、WARNING=900、INFO=800、CONFIG=700、FINE=500、FINER=400、FINEST=300、ALL=Integer.MIN_VALUE。通过对java.util.logging.Level的泛化(扩展),开发人员可以在JDK提供的标准基础之上定义自己的日志分级标准。
在这九个级别中OFF、SEVERE、WARNING、INFO、CONFIG、ALL比较容易理解。
OFF级别主要用于JRE日志输出控制,表示不输出任何信息。
SEVERE(严重)级别描述组织程序正常运行的重大事件。这些事件的表述必须能够让最终用户和系统管理员清晰地了解到底发生了什么事情。
WARNING(警告)级别描述了最终用户或系统管理员维护时比较感兴趣的事件,或指示系统存在潜在问题的事件。这些事件都需要特别提醒最终用户或系统管理员注意。
INFO(信息)级别主要用于描述输出到控制台或其替代品的,具有相当程度重大意义的事件。譬如系统的心跳信息,以及其他系统希望告知最终用户或系统管理员的信息等。
CONFIG(配置)级别主要用于描述可以辅助调试解决问题的静态配置信息。譬如CPU类型、操作系统类型、内存容量、系统语言等等。
ALL级别也是主要用于JRE日志输出控制,表示输出所有日志信息。
FINE、FINER、FINEST等三个级别被用于描述不同程度的跟踪信息。这三个级别被sun分别翻译为"良好","较好"和"最好",但是笔者认为翻译为"略细","较细","最细"更合适。这三个级别比较容易使人难于区分。到底什么样的信息应该以哪个级别输出呢?
一般说来,FINE级别用于输出开发人员广泛关注的信息。包括小的可恢复的故障,潜在的性能问题、数据源连接不足、服务超时等。
FINER级别描述比FINE级别更详细的信息。包括进入/返回方法调用,抛出了一个异常等信息。
FINEST级别描述更详细的调试信息。包括开发人员在方法内为了调试方便而输出的调试信息,即某些日志分级系统中定义的DEBUG级别信息。
将方法调用/返回信息作为一个单独的级别处理是一个明智的选择。在解决系统运行问题时,通常根据方法调用/返回过程就能大致确定问题所在。
此日志分级标准被广泛地应用于中小型系统中。更详细的信息可以参考JDKAPI文档的java.util.logging部分。