如何处理产品代码中的日志记录(logback/slf4j)



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

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

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

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

所以理想情况下用户应该能够启用/禁用日志记录。我通常有一个logback.xml配置文件,该文件在每个类的基础上指定日志级别。我应该把这样的文件包含在包里吗?或者我应该期望用户自己编写或提供默认配置文件?

我有代码来配置算法:

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

该函数读取属性文件并设置相应的算法参数。这是否可以用于启用/禁用各种类的日志记录?

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

由于您使用类创建了日志记录器,如果您不希望从框架中输出任何日志,则可以简单地配置这些日志记录器,使其不具有appender。或者将级别设置为您在生产环境中可以接受的值—只需记住关闭可加性,这样事件就不会传播到根日志记录器。语法描述如下: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手册状态:

完全关闭日志记录时的日志性能

您可以通过设置根级别来完全关闭日志记录记录器到级别。OFF,可能的最高级别。当日志记录是完全关闭后,日志请求的开销由一个方法组成调用加上一个整数比较。在3.2Ghz的Pentium D处理器上此成本通常在20纳秒左右。

在Logback手册架构页面阅读更多信息

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

最新更新