为啥要使用SLF4J而不是Log4J
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥要使用SLF4J而不是Log4J相关的知识,希望对你有一定的参考价值。
参考技术A 在代码中编写日志记录语句使用SLF4J的主要动机是让程序独立于任何特定的日志记录库,这些日志记录库可能需要与现在配置不同的配置,而且还会引入更多令人头疼的维护问题。然而除了这个之外,SLF4J API还有一个让您使用SLF4J而不是用长期感兴趣的 Log4j 更让人信服的功能,就是占位符功能,在代码中用来表示。占位符功能与 String的format()方法中的%s非常相似,因为它在运行时刻才提取所提供的真正的字符串。这不仅缩减了代码中的许多字符串连接,而且减少了创建String对象所需要的资源。即便在生产环境日志级别比如DEBUG和INFO级别的字符串连接可能不需要的时候,仍然可以起到同样的效果。由于字符串是不可更改的 ,而它们是在字符串池中创建的,这些字符串使用了堆内存 ,当应用在生产环境中运行在ERROR级别的时候,字符串在大多数情况下就不是必须的,比如DEBUG语句里的字符串就不是必须的。通过使用SLF4J可以延迟字符串的创建到运行时刻,这意味着只有在需要字符串的时候才创建它。如果已经使用了log4j,那么您已经熟悉把调试语句放入if()条件内的工作场景,而SLF4J占位符功能比log4j更适合这种场景。下面是用Log4j时的做法,当然这并不好玩而且它增加了不必要的公式化的代码,减少了代码的可读性。
1
2
3
if (logger.isDebugEnabled())
logger.debug("Processing trade with id: " + id + " symbol: " + symbol);
如果使用SLF4J,可以使用更简洁的格式达到同样的效果,如下:
logger.debug("Processing trade with id: and symbol : ", id, symbol);
在SLF4J中,我们不需要进行字符串拼接,不会导致使用临时字符串带来的消耗。相反,我们使用带占位符的模板消息来记录日志信息,并提供实际值作为参数。在为日志信息产生最终的字符串之前,该方法会检查是否开启了特定的日志级别,这不仅降低了内存占用,而且预先减少了执行字符串拼接所消耗的CPU时间。下面的SLF4J日志方法的代码,来自于slf4j-log4j12-1.6.1.jar包里的Log4j的适配器类
Log4jLoggerAdapter.
public void debug(String format, Object arg1, Object arg2) if (logger.isDebugEnabled()) FormattingTuple ft = MessageFormatter.format(format, arg1, arg2); logger.log(FQCN, Level.DEBUG, ft.getMessage(), ft.getThrowable());
日志也会对应用程序的性能产生压力,大家通常宣扬的是只在生产环境中才强制记录日志。
以上是关于为啥要使用SLF4J而不是Log4J的主要内容,如果未能解决你的问题,请参考以下文章
为啥使用 SLF4J 而不是 Log4J 来做 Java 日志