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

Jor*_*ble 5 production logback slf4j

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

protected final Logger logger = LoggerFactory.getLogger(Myclass.class);
...
logger.debug("Some debug information");
Run Code Online (Sandbox Code Playgroud)

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

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

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

我确实有代码来配置算法:

/**
* Read algorithm confirguration from properties file
**/    
protected Configuration(Properties properties){...}
Run Code Online (Sandbox Code Playgroud)

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

she*_*tem 4

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

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

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

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

logger.debug(MY_MARKER, "Some debug information");
Run Code Online (Sandbox Code Playgroud)

这允许您使用应用程序的 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>
Run Code Online (Sandbox Code Playgroud)

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

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