登录Java和一般:最佳实践?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (14)

有时当我看到我的日志代码时,我想知道我是否正确。对此可能没有明确的答案,但我有以下担忧:

库类

我有几个库类可能会记录一些INFO消息。致命错误被报告为例外情况。目前我在我的类中有一个静态记录器实例,类名是记录名。(Log4j的:Logger.getLogger(MyClass.class)

这是正确的方式吗?也许这个库类的用户不想从我的实现中得到任何消息,或者想要将它们重定向到特定于应用程序的日志。我应该允许用户从“外部世界”设置记录器吗?你如何处理这种情况?

一般日志

在某些应用程序中,我的类可能希望将日志消息写入未由类名称标识的特定日志。(即:)HTTP Request log做这样的事情最好的方法是什么?想到一个查找服务...

提问于
用户回答回答于

你的约定是相当标准和相当好。

有一点需要注意的是内存碎片来自过多的未经编辑的调试调用,因此,使用Log4J(以及大多数其他Java日志记录框架),您最终会得到如下结果:

if (log.isDebugEnabled()) {
  log.debug("...");
}

因为构建该日志消息(您可能没有使用)可能会很昂贵,尤其是在完成数千次或数百万次的情况下。

您的INFO级别日志记录不应该太“健谈”(并且从您所说的话来看,听起来好像不是这样)。INFO消息通常应该是有意义和重要的,就像正在启动和停止的应用程序一样。如果遇到问题,您可能想知道的事情。调试/精确级别日志记录更适用于实际遇到问题时尝试诊断。调试/精细记录通常只在需要时打开。信息通常始终在运行。

如果有人不想从你的类中获取特定的INFO消息,那么他们当然可以自由地改变你的log4j配置而不能获取它们。Log4j在这个部门非常简单(与Java 1.4日志记录相反)。

至于你的HTTP事情,我一般不会发现这是Java日志记录的问题,因为通常一个类负责你感兴趣的内容,所以你只需要把它放在一个地方。在(我的经验中很少见),当你需要跨看似无关的类的通用日志消息时,只需输入一些可以很容易理解的标记即可。

用户回答回答于

关于实例化记录器,我使用Eclipse Java Template设置记录器取得了一些成功:

private static Logger log = Logger.getLogger(${enclosing_type}.class);

这样可以避免JVM利用堆栈跟踪进行操作的问题,并且可以减少(也许平均而言)首先创建堆栈跟踪的开销。

使用这种模板的好处在于,如果您想为伐木工人设置一致的标准,您可以与团队分享。

它看起来像IntelliJ支持代表封闭类型名称的模板变量的相同概念。我看不出在NetBeans中轻松实现的方法。

扫码关注云+社区