2009-09-29 43 views
5

在大型应用程序中,日志记录至关重要,但是当许多开发人员使用代码时,日志可能变得混乱。有人可能会写:在大型Java应用程序中标准化日志记录的方法

log.info("Loaded " + rowCount + " recodrs from the database."); 

另一个可能做这样的事情:

log.debug("Records read={}", rowCount); 

第三个开发者可能会认为这是正确的方法:

log.trace("Record(s) read: " + NumberFormat.getInstance().format(rowCount) 
      + ", values: " + values); 

这将导致难以日志阅读,而且更难解析。

您可以为开发人员提供哪些指导来制作有机会保持一致并且实际上可供其他人使用的日志?关于伐木的政策会有什么好处?如果是这样,它应包括什么?是否应该有一个API(在日志框架之上)来执行此策略?

我也很好奇如何使代码看起来相似,但更重要的问题是关于实际输出。

回答

5

什么构成了良好的日志语句级恕我直言,伐木指导是罕见的甚至在大框架和产品,这主要是由于更重要指导方针,涉及

  • 日志级别 - 更详细的说明应该作为调试语句,并呼吁到log.debug()应该通过调用包装来检查是否启用了调试。开发人员经常需要区分FATAL,ERROR,INFO,DEBUG和TRACE之间的区别 - 并非所有的异常都是致命的,并非所有的消息都是信息性的。
  • 使用TRACE或等价物 - 应该保留执行流程。理想情况下,不需要其他日志语句来指示控制流。
  • DEBUG vs INFO - DEBUG语句通常用于开发人员和支持人员; INFO通常用于用户和管理员。
  • 覆盖的toString() - 它是用于记录复杂的对象

这就是说的状态很有帮助,我跟随在最低级别数一般拇指规则:

  • 日志数据是,没有格式化。这样,如果出现错误,我知道导致问题的数据是什么,而不是同时怀疑记录器,格式化器和应用程序。
  • 避免创建太多的String对象,除非在DEBUG或TRACE打开的情况下运行。总之,避免连接太多的字符串。即使log4j最终检查是否启用了DEBUG,String对象也已创建,这就是为什么日志调用换行很重要。 slf4j helps avoids this via the use of parameterized messages
+0

关于你的最后一点,真的建议你使用slf4j(Simple Log Facade 4 Java),它可以帮助处理这个问题,并允许在日志消息中插入字符串。由于slf4j只是一个外观,您可以轻松切换使用的日志框架实现。 – 2009-09-29 22:37:22

+0

@DJ,同意你在slf4j上的观点。我想避免对日志框架过于放肆,因为只有问题中的第二个代码片段指示使用slf4j。 – 2009-09-29 23:07:48

1

您可以使用AOP(AspectJ是最好的)来记录传入方法的内容。你甚至可以做切入点方法,所以它不会是太多的日志记录。您可以像@Loggable一样编写方法注释并在其上设置切入点,因此每个带有这些参数的方法都会被记录下来。

我认为方面是最好的方式去这里。

example

+0

记录是面向方面编程闪耀的例子!定义一个方面,您可以在所有代码中轻松编织它,并在产品发货时将其全部弃用。 – NomeN 2009-09-29 23:19:23

2

规范的消息,无论是经由API或字符串格式构建日志语句时开发商引用。他们不应该在程序中输入类似的文本,即使是在记录日志中,也是出于您呼吁的原因。当然,这意味着你也需要一个政策,并进行审查,以确保政策得到尊重。

相关问题