Logback允许向事件添加键-值对.但我发现使用它们的唯一方法是格式化程序中的%kvp选项,它只转储所有key="value"对.

没有任何方法可以在格式中的特定位置插入分隔开的值(我不在乎记录键)吗?

对于MDC元素,使用%X似乎是可行的,但对于简单的密钥对则不可行.

或者,我想我可以使用mdc来实现这一点,但我基本上会更改每个事件的值.在我看来,它不是为这种用途而设计的.

推荐答案

幸运的是,我今天也遇到了这个问题!

这不是一个很棒的解决方案,但一种方法是使用如下的正则表达式,假设您的键值对列表中有一个名为myProperty的属性,并假设您像大多数人一样使用模式编码器:

%replace(%kvp){'.*myProperty="([^"]+)".*', '$1'}

分析正则表达式:

  • .*-匹配任意字符0次或更多次
  • myProperty=-字符串完全匹配
  • "([^"])"-一个或多个位于下两个双引号之间的非双引号字符,放入捕获组1
  • .*-任意字符0次或更多次

然后,第二个参数中的$1用捕获组1的内容替换整个键值字符串

现在,我们只需要从我们放入日志(log)消息中的%kvp输出中删除这个键值,它是类似的.假设您的日志(log)消息中有一些additionalData字段:

additionalData={%replace(%kvp{DOUBLE}){'[\s]{0,1}myProperty="[^"]"', ''}}

请注意,如果这个正则表达式是第一个元素,那么它可能会在结果字符串中留下额外的空格.要解决此问题,可以将此正则表达式包装在第二个正则表达式中,以删除所有前导空格:

additionalData={%replace(%replace(%kvp{DOUBLE}){'[\s]{0,1}myProperty="[^"]"', ''}}){'^\s+', ''}

它很简洁,但是您可以在regex101或其他类似的交互工具中使用正则表达式.

如果你想避免所有这些正则表达式的丑陋,你也可以try 注册custom conversion specifier来为你做繁重的工作,尽管我还没有try 过这条路由.

Java相关问答推荐

在spring—data中自动发现native—sql查询期间遇到重复的SQL别名[id]

不推荐使用的Environment.getExternalStorageDirectory().getAbsolutePath()返回的值不同于新的getExternalFilesDir(空)?

在springboot 3中,当我调用api endpoint时,会出现404

我如何解释这个错误?必需类型:供应商R,提供:收集器对象,捕获?,java.util.List java.lang.Object>>

MimeMessage emlMessage=new MimeMessage(Session,emlInputStream);抛出InvocationTargetException

内存和硬盘中的Zip不同,这会导致下载后的Zip损坏

是否为计划任务补偿系统睡眠?

如何在Spring Boot中创建可以将值传递给配置的&Enable&Quot;注释?

删除打印语句会影响功能...腐败在起作用?

如何使用Criteria Builder处理一对多关系中的空值?

Spring动态反序列化JSON可以是列表,也可以只是一个对象

Java 21中泛型的不兼容更改

如何处理两个几乎相同的XSD文件?

将java.util.Date(01.01.0001)转换为java.time.LocalDate将返回29.12.0000

在Java中将.GRF转换为图像文件

我们可以在方法中声明接口吗?

如何修复Spring Boot应用程序中的RestDocumentationGenerationException:java.io.FileNotFoundException:/curl-request.adoc(只读文件系统)?

如何在特定关键字后提取与模式匹配的多个值?

Java 8 中 ByteBuffer 和 BitSet 的奇怪行为

Hibernate 命名策略导致 Java Spring Boot 应用程序中出现未知列错误