Java日志API开销

Ben*_*n G 3 java logging conditional-compilation overhead

我已经阅读了一些关于使用Java记录调试消息的各种方法,并且来自C背景我的关注点如下:

这些库声称在禁用日志记录(例如生产环境)的情况下开销最小,但由于log()仍在评估其功能的参数,我担心的是实际情况中的开销实际上根本不可忽略.

例如,log(myobject.toString(), "info message")仍然有一个评估的开销myobject.toString(),即使日志函数本身什么都不做也可能相当大.

有没有人有这个问题的解决方案?

PS:对于那些想知道为什么我提到C背景的人:C允许你使用预处理器宏和编译时指令,这些指令将在编译时完全删除与调试相关的所有代码,包括宏参数(根本不会出现).

编辑:在阅读了第一批答案之后,似乎java显然没有任何可以解决这个问题的东西(想想在每个CPU都很重要的移动环境中在一个大循环中记录数字的余弦).所以我要补充一点,我甚至会选择基于IDE的解决方案.我的最后一招是构建类似"查找所有/替换"宏的东西.我首先想到的是,从面向方面的框架中抓取的东西可能会有所帮助......任何人?

mat*_*t b 9

我认为log4j FAQ可以很好地解决这个问题:

对于一些记录器l,写作,

l.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
Run Code Online (Sandbox Code Playgroud)

导致构造消息参数的成本,即将整数i和entry [i]转换为String,并连接中间字符串.这,无论是否记录消息.

如果你担心速度,那就写吧

 if(l.isDebugEnabled()) {
     l.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
 }
Run Code Online (Sandbox Code Playgroud)

这样,如果对logger l禁用调试,则不会产生参数构造的成本.另一方面,如果记录器启用了调试,则会产生评估记录器是否启用的成本,两次:一次在debugEnabled中,一次在调试中.这是一个微不足道的开销,因为评估记录器所花费的时间不到实际记录语句所需时间的1%.

使用保护子句是避免字符串构造的一般方法.

其他流行的框架,例如slf4j,采用使用格式化字符串/参数化消息的方法,以便除非需要,否则不会对消息进行评估.