如何处理登录生产代码 (logback/slf4j)

how to deal with logging in production code (logback/slf4j)

我实现了一个由多个 classes 组成的算法框架。对于日志记录,我使用 slf4j 和 logback。我的很多 classes 都有这样的代码:

protected final Logger logger = LoggerFactory.getLogger(Myclass.class);
...
logger.debug("Some debug information");

现在我想打包我的代码并使其做好生产准备。我如何处理日志代码?

  1. 当 运行 代码时,出于性能原因,开发人员通常希望关闭日志记录。
  2. 在开发代码时,调试信息非常有用,因此删除所有调试语句不是一个好主意。

因此理想情况下,用户应该能够 enable/disable 登录。我通常有一个 logback.xml 配置文件,它在每个 class 的基础上指定日志级别。我应该在包中包含这样的文件吗?还是我应该期望用户自己编写或提供默认配置文件?

我有配置算法的代码:

/**
* Read algorithm confirguration from properties file
**/    
protected Configuration(Properties properties){...}

此函数读取属性文件并相应地设置一些算法参数。这对 enable/disable 各种 class 的日志记录有用吗?

如果记录到关闭的级别,SLF4J 和 logback 对性能的影响非常小。我从来没有遇到过只保留日志记录代码的问题。它还有一个额外的好处,就是您能够在生产环境中打开调试日志记录以获取有关偶发问题的更多信息。

由于您使用 类 创建了记录器,如果您不想从您的框架中输出任何日志记录,您可以简单地将这些记录器配置为没有附加程序。或者将级别设置为您在生产环境中感到满意的值 - 只需记住关闭可加性,这样事件就不会传播到根记录器。语法描述如下:http://logback.qos.ch/manual/configuration.html#syntax

另一个使您的用户能够通过简单的开关从您的框架关闭日志记录的简单想法是使用带有适当过滤器的标记。您可以将所有记录调用更改为以标记开头:

private Marker MY_MARKER = MarkerFactory.getMarker("FrameworkMarker");

logger.debug(MY_MARKER, "Some debug information");

这允许您使用在您的应用程序 logback.xml:

中定义的单个 TurboFilter 来抑制标有此特定标记的所有日志记录输出

http://logback.qos.ch/manual/filters.html#TurboFilter

<turboFilter class="ch.qos.logback.classic.turbo.MarkerFilter">
    <Marker>FrameworkMarker</Marker>
    <OnMatch>DENY</OnMatch>
</turboFilter>

MarkerFilter 具有不关心级别的额外好处。任何具有指定标记的日志记录事件都被过滤掉(并且以一种有效的方式,如文档中所述)。

就我个人而言,我会选择两者。这样您就可以使用框架中的所有日志记录级别,并在需要时通过 MarkerFilter 完全停用其日志记录,但也可以在需要时获得详细的特定级别日志记录的好处。

可以通过调用以下命令在运行时关闭 Logback:

logger.setLevel(Level.OFF);

这将关闭调用记录器的所有级别(TRACE、DEBUG、INFO WARN、ERROR 将被关闭)

Logback 手动状态:

Logging performance when logging is turned off entirely

You can turn off logging entirely by setting the level of the root logger to Level.OFF, the highest possible level. When logging is turned off entirely, the cost of a log request consists of a method invocation plus an integer comparison. On a 3.2Ghz Pentium D machine this cost is typically around 20 nanoseconds.

Logback manual architechture page

阅读更多相关信息

高级:一个好的做法是gradle根据构建类型设置构建级别。开发或生产等(设置运行时代码稍后可以读取的变量)