我在一个项目中有 3 个开发人员,他们在写入日志时具有不同的风格。这些变体中哪个最好?
LOG.info("error = {}", errmsg);
LOG.info("error = ", errmsg);
LOG.info("error = " + errmsg);
这是最好的(在 SLF4J 之上的jcabi-log ):
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()
它比字符串连接更快。它不是。请参阅在 Java 中使用 String.format 而非字符串连接是否更好?.
第一种形式表现更好的原因是,如果info
禁用级别日志记录,那么日志记录框架就不必调用 errmsg.toString()
,也不必执行String.format()
。唯一errmsg.toString()
没有性能成本的情况是 iferrmsg
是 a String
。
我还建议=
像 Splunk 这样的日志聚合器周围没有空格会自动索引error=errmsg
到字段和值对。另外,如果这确实是一个错误,那么我会将其写入error()
级别,而不是info()
. 并且很可能Throwable
在此代码之前的某个地方存在应该进入Throwable
参数的异常。
而且,logger
虽然它可能被声明为final
,但它是一个可变对象,所以它应该是小写的。请参阅是否应以大写形式声明“静态最终记录器”?.
这意味着答案真的应该是
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.");
}
}
}