`

Java日志记录

Log 
阅读更多

转载地址:http://www.iteye.com/news/31284
日志记录是在软件开发过程中常常需要考虑的关键因素。

当产品运行出错时,日志文件通常是我们进行错误分析的首要选择。

而且,在很多情况下,它们是我们手上唯一可以用来查明发生状况和问题根本原因的信息。

可见,正确记录需要的信息是极其重要的。

以下5条日志规则,让我们可以检查和改进在代码中操作日志记录的方式。

同时也请注意,我们既不会讨论怎么配置一个日志引擎,也不会相互比较。

规则1、日志是面向读者的

日志消息不仅要对书写(日志)代码的人有意义,也应该对日志文件的读者有意义。

这似乎是一条很明显但却经常违背的规则。

举个例子吧,我们来看看下面这条日志信息:
Java代码
ERROR: Save failure - SQLException ..... 

保存什么呢?这条消息在开发者看来是能说明一些问题的,但是对于正在苦苦查看产品问题的可怜家伙来说,却毫无用处。

更合适的信息是这样的:
Java代码
RROR: Save failure- Entity=Person, Data=[id=123 surname="Mario"] - SQLException.... 

这就解释了你想要存储的东西(这里是一个 Person,是一个 JPA 实体)以及这个 Person 实例相关的内容。

请注意相关这个单词,并不是指泛泛的全体:我们不应该让无价值的信息使日志文件变得乱糟糟,比如说完整打印所有的实体字段。

通常,实体名字和其逻辑关键字足以识别在表格中的一条记录了。

规则2、匹配日志等级和执行环境

在 Java 系统中提供的所有日志管理工具和引擎都有日志等级(ERROR、INFO……)的概念,这将有可能过滤掉等级过低的消息。

例如,Java util logging 使用如下的等级:SEVERE、WARN、INFO、FINE、FINER、FINEST(+ CONFIG 和 OFF)。相反,两个最受欢迎的日志管理工具, Apache Commons Logging 和 SLFJ 更倾向于如下的等级:FATAL、ERROR、WARN、INFO、DEBUG、TRACE。

日志过滤等级则需要取决于代码的开发阶段:成品与仍处在测试、集成环境下的代码日志等级就不能相同。

更具体的来说,日志等级也应该参考代码的归属情况。

一般而言,我们自己的应用程序代码应该比使用的任何第三方开发库拥有更详细的日志记录。

比如说,Apache 的通用调试消息出现在我们的日志文件中,就没有多大意义。

我通常像这样配置日志记录:
成品阶段: 我的代码是 INFO 等级,第三方库是 WARN。
测试、集成阶段:我的代码是 DEBUG 等级,第三方库是 WARN(或者如果需要的话是 INFO)。
开发阶段:任何有意义的信息。

注意:个人而言,我不建议使用 TRACE/FINEST 等级(我并不是唯一持这种观点的人,可以参考 这里 的例子)。

我并没有发现 DEBUG 和 TRACE 有多大的区别,而年轻团队的成员常常苦恼于到底是使用 DEBUG 还是 TRACE 。

根据KISS原则,我建议只使用RROR、WARN、INFO和DEBUG等级。

规则3、提交前去除编码帮助日志
编码时,我们常常会使用 logger 或是 System.out 在代码中添加日志消息,来更好地掌握应用程序在执行、调试期间发生的状况。
Java代码
void aMethod(String aParam) { 
  LOGGER.debug(“Enter in aMethod”); 
  if (“no”.equals(aParam)) { 
  LOGGER.debug(“User says no”); 
  …. 

比如这样的代码:
Java代码
void aMethod(String aParam) { 
  LOGGER.debug(“Enter in aMethod”); 
  if (“no”.equals(aParam)) { 
  LOGGER.debug(“User says no”); 
  …. 

这些消息显示被调用的方法并且备份内部变量及方法参数值,主要是为了追踪应用程序的行为。这在非测试驱动开发中相当受欢迎。

但糟糕的是,一旦代码发布(测试之后成为成品)这些消息通常就无用武之地了。

所以,这条规则简单来说就是:一旦你已经完成开发工作,在将代码提交到使用中的 SCM 系统(git、svn……)之前,要去除所有临时的和不必要的日志消息。

这条规则并不是要求去除所有的 DEBUG 消息,只是针对那些在应用程序完成和发布后就没有意义的消息,或者是说当我们有理由相信应用程序能正确运行时就失去意义的那些消息。

规则4、log DEBUG消息之前检查日志等级

根据第2条规则,在产品日志中,我们只会显示ERROR、WARN、INFO 等级的消息,但是在代码中我们也可以使用一些不会影响产品运行的DEBUG消息。
Java代码
if ( LOGGER.isDebugEnabled((){ 
LOGGER.debug (…….) 


每次你想要 log 一个 DEBUG 消息时(在使用了规则3后的留下的所有消息),需要在前面添加一个检查来明确是否启用了 DEBUG 日志:
Java代码
if ( LOGGER.isDebugEnabled((){ 
LOGGER.debug (…….) 


这种做法可以阻止代码去创建日志消息和调用 logger,提高产品运行程序的效率。

规则5、了解你的 logger

我们使用 logger 方法的方式可能会带来巨大的开销:
创建消息字符串
组织包含在消息字符串中的数据

我们应该查阅所选择的日志管理工具、引擎的 javadoc 文档,了解使用它们 logger 的最有效的方法。
Java代码
LOGGER.info(“Person name is “ + person.getName()); 

例如,我们可以创建一条这样的消息:
Java代码
LOGGER.info(“Person name is “ + person.getName()); 

这就创建了不必要的字符串实例。
Java代码
LOGGER.info(“Person name is {}“, person.getName()); 

使用SLF4J,正确的用法应该是:
Java代码
LOGGER.info(“Person name is {}“, person.getName()); 

这里的格式化字符串是常量,不可变消息只有在允许 logging 的情况下才会被创建。
分享到:
评论

相关推荐

    Java日志记录的5条规则Java开发Java经验技巧共5

    以下就是基于标题和描述所提到的“Java日志记录的5条规则”进行的详细阐述: 1. **选择合适的日志框架** Java有多个流行的日志框架,如Log4j、Logback、Java内置的日志API(java.util.logging)等。选择哪个框架取...

    java日志记录组件log4j-1.2.14和commons-logging-1.1.1

    Java日志记录是开发过程中必不可少的部分,用于跟踪应用程序运行时的行为,排查问题,以及收集性能数据。Log4j和Commons-Logging是两个在Java世界中广泛使用的日志记录库。 1. **Log4j**: Log4j是Apache组织开发的...

    java日志记录工具类

    调用方法:IndexDataLog.print(入参),可以设置文件大小,文件写满以后自动创建新的日志文件。一般用来记录用户的搜索词,或操作记录。目前以json格式保存日志,入参稍作修改,可以传入对象,linux和windows都支持。

    通用java日志记录开发包,短小而精悍,适合各种大小项目

    #是否在日志记录前加日期时间字符串,取值0或1(立即生效) isAddDateTimeStringToHead=1 #当isAddDateTimeStringToHead为1时有效,表示时间串的格式,必须为java认识的时间格式;特别的,如果为“UNIX_TIMESTAMP”...

    Java 日志记录 log4j 最简明教程

    首先,log4j是一个开源的日志记录工具,由Apache软件基金会开发,主要服务于Java应用程序。它的核心组件包括Logger(日志器)、Appender(输出端)和Layout(布局)。Logger负责生成日志消息,Appender负责将这些...

    splunk-library-javalogging:适用于流行Java日志记录框架的Splunk日志记录附加程序

    您可以使用三种主要的Java日志记录框架: , 和 。 Java的Splunk日志记录也启用了Java的 。 Java的Splunk日志记录提供: 将事件打包成适合您所使用输入类型(HTTP事件收集器或TCP)的正确格式的Appender类。 ...

    JAVA实现通用日志记录方法

    JAVA实现通用日志记录方法 JAVA实现通用日志记录方法是指在JAVA应用程序中实现日志记录的通用方法。日志记录是软件开发中不可或缺的一部分,它可以帮助开发者追踪程序的执行过程,诊断错误,提高程序的可靠性和安全...

    Java日志记录的5条规则

    Java日志记录是软件开发中不可或缺的部分,它在问题排查和系统监控中起着至关重要的作用。以下是关于Java日志记录的五条关键规则,旨在帮助开发者提高日志的质量和实用性。 1. 日志是面向读者的 日志消息应该为所有...

    一个可靠、通用、快速且灵活的 Java 日志记录框架

    Java EE 和 Jakarta EE 版本 鉴于下游用户可能在其项目中依赖 Java EE(在 javax 命名空间中)或 Jakarta EE(在 jakarta 命名空间中),因此 logback 支持这两种 EE 替代方案被认为很重要。 版本 1.3.x 支持 Java ...

    clogg-java:轻量级的Java日志记录库

    **clogg-java:轻量级的Java日志记录库** 在Java编程中,日志记录是必不可少的一个环节,它能够帮助开发者追踪程序运行时的状态,定位错误和异常,以及进行性能分析。clogg-java是一个轻量级的日志库,旨在为Java...

    Logging:简单的Java日志记录库

    **Java日志记录库概述** 在Java开发中,日志记录是不可或缺的一部分,它帮助开发者追踪应用程序的行为,诊断错误,以及进行性能分析。"Logging:简单的Java日志记录库" 提供了一个轻量级的日志解决方案,旨在简化...

    java日志记录

    Logger类和LoggerFactory类没有的话,下载这个包

    java日志文件过滤

    日志记录是程序运行过程中的诊断工具,它记录了程序运行时的事件和异常,帮助开发者追踪错误、优化性能。本项目提供了一个自用的日志文件过滤软件,该软件具有简单易用的特点,只需指定写入路径,就能实现对日志文件...

    Java项目记录日志

    本文主要探讨的是在Java项目中如何进行日志记录,以及涉及到的一些工具和库。 首先,日志记录的基本概念是将程序运行过程中的信息、警告、错误等输出到一个文件或者控制台,以便于后期分析。Java项目中常见的日志...

    使用Log4j进行日志操作.zip_java 操作日志_java 日志_log4j_系统日志

    Log4j是Java编程语言中广泛使用的日志记录框架...总的来说,Log4j作为Java日志记录的标准工具,因其灵活性、可配置性和强大的功能而备受推崇。了解和熟练掌握Log4j的使用,对任何Java开发者来说都是非常有价值的技能。

    使用Java注解处理器实现一个简单的日志记录系统.txt

    #### 二、Java日志记录基础 在Java中,`java.util.logging`包提供了内置的日志框架,可以通过`Logger`类来记录应用程序中的事件。`Logger`是Java标准库中的一部分,它提供了一种简单而强大的方式来记录程序运行时的...

    log4j日志记录工具

    **Log4j:Java日志记录的首选工具** 在Java编程中,日志记录是调试、性能分析和问题排查不可或缺的一部分。Log4j是Apache软件基金会的一个开源项目,它为Java应用程序提供了一种灵活且强大的日志记录框架。Log4j自...

    java-操作记录-对比操作前后不同

    5. **事务管理**:在涉及数据库操作时,确保日志与事务同步,以便在回滚事务时也能撤销相应的日志记录。 在代码层面,对比操作前后,我们可以通过单元测试或集成测试来模拟不同的输入和场景,观察并验证操作记录...

    java Log日志规范

    Java日志规范是Java开发中不可或缺的一部分,它用于记录应用程序运行过程中的各种信息,包括错误、警告、调试信息等,帮助开发者追踪问题、优化性能。本文将深入探讨Java的日志规范,以log4j2.properties、log4j....

    log6j:基于log5j的现代Java日志记录库

    Java日志记录是数十年来积累的相互竞争和不兼容的框架的烂摊子。 很为这个可悲的复杂世界添加另一个变体。 与更流行的SLF4J API相比,Log5j的API实际上要好用得多。 例如,它具有printf样式的格式,比{}样式的格式...

Global site tag (gtag.js) - Google Analytics