Java 消息中不需要记录器参数的结构化日志记录

Java 消息中不需要记录器参数的结构化日志记录,java,spring-boot,logstash,slf4j,spring-logback,Java,Spring Boot,Logstash,Slf4j,Spring Logback,我正在使用logstash在Spring启动应用程序中使用结构化日志记录,有时我想在日志中包含我不想在日志消息中使用的键值。是否有允许这种情况的结构或类似结构 我目前正在做的一个例子如下: // import lombok.extern.slf4j.Slf4j; // import static net.logstash.logback.argument.StructuredArguments.kv; // import static net.logstash.logback.argument.

我正在使用logstash在Spring启动应用程序中使用结构化日志记录,有时我想在日志中包含我不想在日志消息中使用的键值。是否有允许这种情况的结构或类似结构

我目前正在做的一个例子如下:

// import lombok.extern.slf4j.Slf4j;
// import static net.logstash.logback.argument.StructuredArguments.kv;
// import static net.logstash.logback.argument.StructuredArguments.v;

log.info(
  "My message with one arg {}", 
  v("key1":"arg I want to include value in place of placeholder in message and in json as key/value"), 
  kv("key2", "arg I only want in the json and not in the message"))

一切都按照我的预期工作,我的意思是日志包含两个键值对,消息只包含第一个值来代替占位符。问题是,我从编译器那里得到一个警告,该警告由intellij(Placeholder CountMatchesArgumentCount)标记,关于第二个结构化参数,我希望避免这种情况,而不必抑制/忽略它

您可以在日志消息之前使用并传递它-更多详细信息,请参阅

我个人不喜欢这样,因为标记有不同的用途,所以若结构化参数适合你们,就忽略IDE中的警告

无论如何,所有这些json/结构化实现都是SLF4J 1.*的变通方法,而SLF4J 1.*还没有为此构建。差不多一年前就有了SLF4J 2.0.0-alpha1版本,但它仍然是alpha版本,我还没有使用过。但是,它的API应该为当前分布式日志管理系统中至关重要的关键值做好准备。

您可以在日志消息之前使用并传递它-更多详细信息

我个人不喜欢这样,因为标记有不同的用途,所以若结构化参数适合你们,就忽略IDE中的警告


无论如何,所有这些json/结构化实现都是SLF4J 1.*的变通方法,而SLF4J 1.*还没有为此构建。差不多一年前就有了SLF4J 2.0.0-alpha1版本,但它仍然是alpha版本,我还没有使用过。但是它的API应该为当前分布式日志管理系统中非常重要的键值做好准备。

您可以将日志消息设置为常量字符串,那么代码质量检查将不会对此发出警告。

您可以将日志消息设置为常量字符串,那么代码质量检查将不会对此发出警告

logger.info(append("key2", "only json"), 
               "My message with one arg {}", 
               v("key1":"arg in msg and json"));