Logback允许向事件添加键-值对.但我发现使用它们的唯一方法是格式化程序中的%kvp选项,它只转储所有key="value"对.
没有任何方法可以在格式中的特定位置插入分隔开的值(我不在乎记录键)吗?
对于MDC元素,使用%X似乎是可行的,但对于简单的密钥对则不可行.
或者,我想我可以使用mdc来实现这一点,但我基本上会更改每个事件的值.在我看来,它不是为这种用途而设计的.
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 过这条路由.