几乎在每个项目中,我都使用Log4j或Slf4j并使用logback来记录事件,几乎在任何地方我都要编写类似
的内容if (log.isDebugEnabled()) {
log.debug("I'm here doing this stuff");
}
有时您看不到所有这些日志记录代码的实际方法逻辑。
我无法删除log.isDebugEnabled()
检查,因为即使我使用带有{}
功能的Slf4j,如果未启用调试(或任何级别),也可能会计算并删除某些日志信息。
log.debug("Here is the data: {}", calculateDataFromSeveralDataSourcesDuh());
问题是:有没有办法推迟日志信息计算,所以只有在没有检查应用程序代码的情况下启用适当的日志级别时才计算它?
如果我不能使用Java 8并且我正在使用Slf4j api,那么有什么可能的选择,所以Log4j2不可用?
答案 0 :(得分:1)
通过使用Log4j2和Java 8,您可以轻松地使用here所述的lambdas,因此在您的情况下使用debug(Message, Supplier),例如
log.debug("Here is the data: {}", () -> calculateDataFromSeveralDataSourcesDuh());
如果您不能使用log4j2或java 8,请查看log4j中object rendering的概念。您可以为特定类设置自己的对象渲染器,与渲染相比,它的构造会很便宜(包括您的calculateDataFromSeveralDataSourcesDuh调用)。 假设只有部分调试信息的计算成本很高,那么识别这些情况并为它们创建自定义类(以及相应的对象渲染器)可能是值得的。