Java 记录器格式和可丢弃,slf4j,参数
在将一些旧的记录器从Java 记录器格式和可丢弃,slf4j,参数,java,logging,slf4j,Java,Logging,Slf4j,在将一些旧的记录器从String.format转换为较新的slf4j{}变体的过程中,我偶然发现了以下情况: logger.error(String.format("%s ... %s ... %s", ...), e); 但是,我只想使用{}并删除字符串格式, 包括可丢弃的记录器方法签名为: 错误(字符串msg,Throwable t) 所以在这种情况下,我必须保留字符串.format 为什么没有: 错误(Throwable t、字符串格式、对象…参数)自SLF4J 1.6.0起,在存在多个
String.format
转换为较新的slf4j{}变体的过程中,我偶然发现了以下情况:
logger.error(String.format("%s ... %s ... %s", ...), e);
但是,我只想使用{}并删除字符串格式,
包括可丢弃的记录器方法签名为:
错误(字符串msg,Throwable t)
所以在这种情况下,我必须保留字符串.format
为什么没有:
错误(Throwable t、字符串格式、对象…参数)
自SLF4J 1.6.0起,在存在多个参数的情况下,如果日志语句中的最后一个参数是异常,则SLF4J将假定用户希望最后一个参数被视为异常而不是简单参数
因此,编写(在SLF4J版本1.6.x和更高版本中)
:
“是的,从SLF4J 1.6.0开始,但不是在以前的版本中。SLF4J API
在出现异常时支持参数化,假设
“异常”是最后一个参数。“
好的,所以这在幕后是聪明的:)一个完全错误的答案被否决了。所描述的行为与SLF4J无关,可能是您对记录器实现感到困惑。实际上,在SLF4J 1.7.x中,记录器接口有方法签名:
public void error(字符串格式、对象…参数)代码>这显然与最后一个异常是否可丢弃无关。由实际的日志程序实现来解决这个问题。@antopryamostanov@antopryamostanov,这是一个完全正确的答案。是的,SLF4J选择接受Throwable作为最后一个参数,即使对于格式化方法也是如此,这意味着varargs重载不能静态地将其键入Throwable-签名(String,Object…,Throwable)
是不可能的,这是编译器错误,因为varargs必须是最后一个。因此,他们显然决定即使使用非varargs重载也不要麻烦地键入它。尽管如此,有明确的记录表明,如果您将Throwable作为最后一个参数传递,它将被视为Throwable,而不是消息格式参数。@AntonPryamostanov,我只是逐字解释了没有这样的签名及其原因。嗯,实际上这里有一个重复项:,但它在标题中使用了不同的关键字。。。也许我的会帮助别人googling@jmehrens正是我在上面的评论中发布的链接yours@ChristopheRoussy这是Google上“org.slf4j logger如何使用throwable格式”搜索字符串的第一项,谢谢!
logger.error("one two three: {} {} {}", "a", "b",
"c", new Exception("something went wrong"));