Java 消息中不需要记录器参数的结构化日志记录
我正在使用logstash在Spring启动应用程序中使用结构化日志记录,有时我想在日志中包含我不想在日志消息中使用的键值。是否有允许这种情况的结构或类似结构 我目前正在做的一个例子如下: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.
// 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"));