有时当我看到我的日志记录代码时,我想知道我是否做对了。可能没有明确的答案,但我有以下担忧:
图书馆课程
我有几个库类可能会记录一些 INFO
消息。致命错误被报告为异常。目前我的类中有一个静态记录器实例,类名作为日志名称。 (Log4j 的: Logger.getLogger(MyClass.class)
)
这是正确的方法吗?也许这个库类的用户不想要来自我的实现的任何消息,或者想要将它们重定向到特定于应用程序的日志。我应该允许用户从“外部世界”设置记录器吗?您如何处理此类情况?
一般日志
在某些应用程序中,我的类可能希望将日志消息写入未由类名标识的特定日志。 (即: HTTP Request log
)做这样的事情最好的方法是什么?我想到了一个查找服务……
原文由 Malax 发布,翻译遵循 CC BY-SA 4.0 许可协议
您的约定非常标准且非常好(恕我直言)。
需要注意的一件事是过多的未调试调用造成的内存碎片,因此,使用 Log4J(和大多数其他 Java 日志记录框架),您最终会得到如下结果:
因为构建该日志消息(您可能没有使用)可能很昂贵,尤其是在完成数千或数百万次的情况下。
您的 INFO 级别日志记录不应该太“健谈”(从您所说的来看,这听起来不是)。 INFO 消息通常应该有意义和重要,例如正在启动和停止的应用程序。如果您遇到问题,您可能想知道的事情。调试/精细级别日志记录更多地用于当您实际遇到要尝试诊断的问题时。调试/精细日志记录通常只在需要时打开。信息通常一直在线。
如果有人不想要来自您的类的特定 INFO 消息,他们当然可以自由更改您的 log4j 配置以不获取它们。 Log4j 在这方面非常简单(与 Java 1.4 日志记录相反)。
至于你的 HTTP 事情,我通常不认为这是 Java 日志记录的问题,因为通常一个类负责你感兴趣的内容,所以你只需要将它放在一个地方。在(我的经验中很少见)当你想要跨看似不相关的类的公共日志消息时,只需放入一些可以很容易地被 grepped 的标记。