【问题标题】: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 说这是一个“实验性功能”——所以我认为对无意中淹没日志的担忧是合理的。但是:如果它只是一个(可能)错误的地方,也许另一种选择是设置一个“死时间”?

标签: java logging exception-handling slf4j


【解决方案1】:

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

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

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

【讨论】:

  • @FedericoPeraltaSchaffner - 记录两次很糟糕,因为......? Op 没有说任何关于(有争议的,极端情况)性能的事情,他关心的是堆栈跟踪。此外,仅在发生实际异常并且日志级别设置为调试或更详细的情况下才会记录两次,所以我认为这毕竟不是一个大的权衡。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-11
  • 2016-09-16
  • 2021-08-23
  • 2015-06-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多