【问题标题】:Do you provide DEBUG logging level for private methods?您是否为私有方法提供 DEBUG 日志记录级别?
【发布时间】:2011-05-31 23:23:18
【问题描述】:

我为 Java 类添加日志记录。特别是 logger.debug 级别(用于开发模式)。

至于在公共方法中调用的私有方法,在私有方法中提供日志记录是否有意义?
是否有效?

谢谢。

【问题讨论】:

    标签: java debugging logging methods private


    【解决方案1】:

    是的,如果你想在维护模式或开发中“调试”你的私有方法,为什么不呢? 在生产中,您将设置日志级别,警告或错误!这取决于你...

    【讨论】:

    • 在开发模式下或在搜索错误时,您无需考虑效率,而您基本上是在“调试”您的代码:) 设置您的调试级别错误/警告正在生产中。
    【解决方案2】:

    这不一定是效率问题。您必须问自己:“该私有方法是否有值得记录的事情?”

    为了避免性能问题,您始终可以在实际记录这些消息之前检查记录器是否记录调试消息。在 log4j 中,你会写

    if (logger.isDebugEnabled()) {
      logger.debug("complicated" + "innefficient" + "string concatenation");
    }
    

    我想,其他记录器也提供类似的概念

    【讨论】:

    • 使用slf4j 消除了if (logger.isDebugEnabled()) {...} 的需要,因此减少了样板代码。
    • 没错,我将 logger.isDebugEnabled() 用于“重”对象
    • darioo,检查是为了避免冗长的字符串连接和其他操作之前 logger.debug(...) 方法调用。如果有问题的“私有方法”被调用了 100 万次,那么在实际进行日志记录之前,首先检查是否启用了调试级别可能很重要
    【解决方案3】:

    当然。私有方法通常隐藏实现细节,而这正是大多数 bug 潜伏的地方。将您的日志记录语句放在您认为需要的地方,并在生产环境中禁用它们。

    【讨论】:

    • 实际上,我使用 slf4j 和 logger.isDebugEnabled()。是开销吗?
    • @sergionni:这不是开销,但没有必要,因为当调用logger.debug(...) 时,slf4j 将在后台检查是否启用了调试。
    【解决方案4】:

    当您不需要时,记录可能看起来很浪费,但当您需要时,它是必不可少的。始终在您的类和函数中提供有意义的日志消息。日志级别可以让您过滤掉噪音,并在需要时增加详细程度。好的记录器提供了在运行时更改日志级别的功能。

    不过,如果您出于某种原因担心性能,您可以使用一些简单的防护措施来减少日志记录的开销,尤其是调试日志记录,这很少启用。以 log4j/slf4j 为例,您可以将日志调试语句包装在:

    if(logger.isDebugEnabled()) {
        logger.debug("something");
    }
    

    slf4j 还具有类似 printf 的语法,仅在日志级别正确时才进行字符串格式化。

    logger.debug("Object {} is not valid!", obj);
    

    就像 darioo 评论的那样,第二种形式消除了在日志语句之前检查日志级别的需要。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-03
    • 2019-10-24
    • 2011-05-06
    • 1970-01-01
    • 2019-06-05
    • 2014-03-29
    • 1970-01-01
    相关资源
    最近更新 更多