【发布时间】:2012-08-26 15:56:53
【问题描述】:
我在一个项目中有 3 位开发人员,他们在写入日志时具有不同的风格。这些变体中哪一个最好?
LOG.info("error = {}", errmsg);
LOG.info("error = ", errmsg);
LOG.info("error = " + errmsg);
【问题讨论】:
我在一个项目中有 3 位开发人员,他们在写入日志时具有不同的风格。这些变体中哪一个最好?
LOG.info("error = {}", errmsg);
LOG.info("error = ", errmsg);
LOG.info("error = " + errmsg);
【问题讨论】:
【讨论】:
errmsg 让我相信这不是个例。更正了我的答案。
LOG.info("error = {}", errmsg);。不应考虑其他选项。还有stackoverflow.com/questions/10555409/…
这是最好的(jcabi-log 在 SLF4J 之上):
Logger.info(this, "error=%s", errmsg);
这是一个简短的替代:
private static Logger LOG = Logger.getLogger(Foo.class);
LOG.info(String.format("error=%s", errmsg));
首先,让一个实用程序类负责记录器的实例化很方便。其次,使用String.format() 进行文本格式化非常方便,因为您始终可以看到整个字符串并且可以轻松翻译它。
【讨论】:
改变第一种形式是最好的
log.info("error={}", errmsg);
正如其他人所说,第二个示例必须是错误的,因为没有格式标记可以将errmsg 插入"error = ",除非errmsg 是Throwable 并且启用了info 级别的日志记录。然后记录器将打印一个 stracktrace。
多年来,我更喜欢第三种形式的字符串连接。几个月或几年后,当我回去阅读代码时,我发现阅读起来更容易。
但是,正如Tomasz Nurkiewicz 回答的那样,第一种形式LOG.info("error={}", errmsg); 是最好的。不过,原因不在于String.format() 比字符串连接更快。它不是。见Is it better practice to use String.format over string Concatenation in Java?。
第一种形式表现更好的原因是如果info级别的日志被禁用,那么日志框架就不必调用errmsg.toString(),也不必执行String.format()。 errmsg.toString() 没有性能成本的唯一情况是 errmsg 是 String。
我还建议在 = 周围不要有空格,因为像 Splunk 这样的许多日志聚合器会自动将 error=errmsg 索引到字段和值对中。另外,如果这确实是一个错误,那么我会将其写入error() 级别,而不是info()。并且很可能在此代码之前的某处有一个 Throwable 异常应该进入 Throwable 参数。
而且,logger,虽然它可能被声明为final,但它是一个可变对象,所以它应该是小写的。见Should a "static final Logger" be declared in UPPER-CASE?。
这意味着答案应该是
log.info("error={}", errMsg, exception);
【讨论】:
以下是实际 slf4j javadoc 的精确复制粘贴。这里值得一游:http://www.slf4j.org/api/org/slf4j/Logger.html
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Wombat {
final static Logger logger = LoggerFactory.getLogger(Wombat.class);
Integer t;
Integer oldT;
public void setTemperature(Integer temperature) {
oldT = t;
t = temperature;
logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT);
if(temperature.intValue() > 50) {
logger.info("Temperature has risen above 50 degrees.");
}
}
}
【讨论】: