Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 记录器格式和可丢弃,slf4j,参数_Java_Logging_Slf4j - Fatal编程技术网

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"));