我在一个项目中有3个开发人员,他们在写日志时有不同的风格。哪种变化最好?
LOG.info("error = {}", errmsg);
LOG.info("error = ", errmsg);
LOG.info("error = " + errmsg);
这是最好的(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
级别日志记录。然后记录器会打印堆栈跟踪。LOG.info("error={}", errmsg);
是最好的。原因不是因为String.format()
比字符串连接更快。它不是。请参见在Java中使用String.format还是字符串连接更好的做法?。info
级别的日志记录,则日志记录框架不必调用errmsg.toString()
,也不必执行String.format()
。唯一的情况是errmsg.toString()
没有性能损失的情况是errmsg
是一个字符串。=
周围没有空格,因为许多日志聚合器(如Splunk)将error = errmsg
自动索引到字段和值对中。此外,如果这真的是一个错误,那么我会将其写入error()
级别,而不是info()
级别。最可能是在此代码之前有一个Throwable
异常,应该放进Throwable
参数中。logger
很可能被声明为final
,但它是一个可变对象,所以应该用小写字母表示。请参见“static final Logger”应该声明为大写字母吗?。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.");
}
}
}
errmsg
让我误以为这不是一个异常。已经更正了我的答案。 - Tomasz NurkiewiczLOG.info("error = {}", errmsg);
。不应考虑其他选项。此外,参见 https://dev59.com/EGkv5IYBdhLWcg3wfA8P - Yang Liu