logstash-logback-encoder - 如何配置 LoggingEventCompositeJsonEncoder 的自定义 PatternLayout?
问题描述
我已经创建了一个自定义 PatternLayout,我在 logback 的 Access 和 File appender 中使用它,我也想将它用于 LoggingEventCompositeJsonEncoder。
是否可以使用我的布局配置编码器,我该如何实现?
文件 appender 配置示例:
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="com.me.util.logging.PatternLayoutFiltered">
<pattern>${LOG_PATTERN}</pattern>
</layout>
</encoder>
<file>${LOG_FILE}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- rotate every day -->
<fileNamePattern>${logback.rollingPolicy.file.fileNamePattern}</fileNamePattern>
<!-- Days of history -->
<maxHistory>${logback.maxHistory.retention:-7}</maxHistory>
</rollingPolicy>
</appender>
我的logstash编码器:
<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<timestamp>%d{ISO8601}</timestamp>
<message/>
<loggerName/>
<context/>
<mdc/>
<pattern>
<pattern>
{
"appVersion": "${build.version}",
"appName": "${build.artifact}",
"resourceType": "${logback.application.resource.type}",
"resourceID": "${logback.application.resource.id}",
"level": "%level",
"hostname": "${logback.server.host}",
"indexType": "${logback.logstash.index.type}"
}
</pattern>
</layout>
</pattern>
<stackTrace/>
</providers>
</encoder>
我在哪里可以在这里定义相同的 PatternLayout ?我在这里读过
模板中的每个值都被视为 logback 标准 PatternLayout 的模式,因此它可以是文字字符串(对于某些常量)和各种转换说明符(如 %d 表示日期)的组合。
那么我如何配置我自己的呢?谢谢你的帮助。
解决方案
为了解决这个问题,我不得不使用自定义valueMasker
进行过滤,并应用与我的布局相同的过滤方法来过滤字段值。
添加到 logback.xml :
<jsonGeneratorDecorator class="net.logstash.logback.mask.MaskingJsonGeneratorDecorator">
<valueMasker class="com.me.util.logging.CustomValueMasker"/></jsonGeneratorDecorator>
Java 类类似于:
package com.me.util.logging;
import com.fasterxml.jackson.core.JsonStreamContext;
import net.logstash.logback.mask.ValueMasker;
public class CustomValueMasker implements ValueMasker {
@Override
public Object mask(JsonStreamContext jsonStreamContext, Object o) {
if (o instanceof CharSequence) {
return doTransform((String) o);
}
return o;
}
/**
* Do the message filtering
*
* @param msg the message of the event log
*
* @return the filtered message
*/
private String doTransform(String msg) {
// Do whatever filtering needed here
return msg;
}
}
推荐阅读
- r - How do i compare each row of a timeseries against a constant in R
- java - OpenApi 3.0 注册过滤器以排除具有特定标签的方法
- python - 使用“for”循环结构,生成数字并通过“length”和“%(mod)”结构过滤
- python - Open CV Contour 面积计算错误
- javascript - 如何在 JSX React 中循环遍历对象
- azure - 如何使用 ARM 模板将基础映像添加到开发测试实验室中的公式?
- firebase - 关于在firestore中将数据存储在数组中的问题
- docker - 如何使用 docker 容器创建 kubernetes pod
- javascript - 当我运行 npm run dev 时如何知道编译哪个文件
- tensorflow - 使用机器学习或深度学习在两个节点之间进行链接概率预测,其中给出了节点到节点的映射