我在项目中有3个开发人员在写入日志时有不同的样式。哪种变体最好?
LOG.info("error = {}", errmsg);
LOG.info("error = ", errmsg);
LOG.info("error = " + errmsg);
答案 0 :(得分:8)
LOG.info("error = {}", errmsg);
正确且最好。
LOG.info("error = ", errmsg);
这很可能是错误的。除非errmsg
是例外,否则永远不会记录它。
LOG.info("error = " + errmsg);
这个表现不如第一次好。每次点击此行时都会运行String
连接,而在第一种情况下,只有在实际记录语句时才会发生变量替换。
答案 1 :(得分:3)
这是最好的(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()
进行文本格式化非常方便,因为您总能看到整个字符串并且可以轻松翻译它。
答案 2 :(得分:1)
第一种形式的改变是最好的
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()
,也不必执行{{1}完全没有。如果String.format()
为errmsg.toString()
,则errmsg
没有性能成本的唯一情况。
我还建议在String
周围没有空格,因为像Splunk这样的日志聚合器会自动将=
索引到字段和值对中。此外,如果这确实是一个错误,那么我会将其写入error=errmsg
级别,而不是error()
。并且很可能在此代码之前的某处存在info()
异常,该异常应该进入Throwable
参数。
而且,Throwable
虽然可能被声明为logger
,但它是一个可变对象,所以它应该是小写的。请参阅Should a "static final Logger" be declared in UPPER-CASE?。
这意味着答案应该是
final
答案 3 :(得分:0)
以下是来自实际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.");
}
}
}