我在这里滥用日志级别的想法吗?

Posted

技术标签:

【中文标题】我在这里滥用日志级别的想法吗?【英文标题】:Am I abusing the idea of log levels here? 【发布时间】:2018-08-30 05:56:15 【问题描述】:

我有一个案例,我想介绍一些错误日志记录。但在这一点上,我不确定这里会多久发生一次异常(实验性功能,错误取决于用户输入),我有点担心堆栈跟踪会淹没日志。

所以我想出了这个解决方案:

catch (Exception ex) 
    if (LOGGER.isDebugEnabled()) 
        LOGGER.error("Exception during save()", ex); // log with stacktrace
     else 
        LOGGER.error("Exception during save(): ", ex.toString());
    

但我对此并不真正满意,因为我觉得我想滥用调试级别来登录错误级别。我用org.slf4j.Logger

【问题讨论】:

这不是“滥用”——实际上我觉得它很聪明。事实是:它仍然一个错误,只是你想在调试时有更详细的日志。因此,如果这是您的意图,那么这正是您的代码所做的。合法的,恕我直言。 你用的是什么Logger? 是org.slf4j.Logger 另一种选择可能是拥有两个记录器 - 一个“详细”和一个“简要” - 大概可以单独配置和启用。 @Henry 同意生产代码。但是 OP 说这是一个“实验性功能”——所以我认为对无意中淹没日志的担忧是合理的。但是:如果它只是一个(可能)错误的地方,也许另一种选择是设置一个“死时间”? 【参考方案1】:

如果您只关心不使用不相关的堆栈跟踪向日志发送垃圾邮件,您仍然可以不滥用日志级别的想法,而是接受它:

catch (Exception ex) 
  LOGGER.error("Exception during save(): ", ex.toString()); 
  LOGGER.debug("Detailed exception output:", ex);

在性能方面,您提出的使用isDebugEnabled 的解决方案的得分要好一些,因为除非您真的需要,否则不会为第二次调用创建字符串对象(第一个参数)。而且您还可以在调用堆栈上保留一个级别。

【讨论】:

@FedericoPeraltaSchaffner - 记录两次很糟糕,因为......? Op 没有说任何关于(有争议的,极端情况)性能的事情,他关心的是堆栈跟踪。此外,仅在发生实际异常并且日志级别设置为调试或更详细的情况下才会记录两次,所以我认为这毕竟不是一个大的权衡。跨度>

以上是关于我在这里滥用日志级别的想法吗?的主要内容,如果未能解决你的问题,请参考以下文章

logback 更改日志级别需要重启吗

有人真的使用 WARN 作为日志记录级别吗? [关闭]

XCGLogger - 如何设置所有日志的日志级别

我可以在运行时更改 syslog 或 syslog-ng 日志级别吗?

我们可以在运行时更改log4j的日志记录级别吗?

Java 日志级别 - 何时使用啥