如何配置Fluentd仅将log对象内的元素通过HTTP发送?
解决方案
要实现仅发送log对象内的元素,你可以通过添加**parser过滤器**来解析log字段的JSON内容,并替换整个日志记录为该内容,具体配置修改如下:
完整配置示例
<source> @type tail path /var/log/containers/*.log, /var/log/pods/*.log exclude_path ["/var/log/containers/fluentd-*.log", "/var/log/containers/argocd-*.log", "/var/log/containers/cilium-*.log", "/var/log/containers/csi-*.log", "/var/log/containers/cpc-*.log", "/var/log/containers/hubble-*.log", "/var/log/containers/kube-*.log", "/var/log/containers/cert-manager-*.log", "/var/log/containers/core-dns-*.log", "/var/log/containers/ingress-*.log"] pos_file /var/log/fluentd-containers.log.pos tag container_logs format /(?<log>\{[^{}]*"message"\s*:\s*"(?<message>[^"]*)"[^{}]*"level"\s*:\s*"(?<level>[^"]*)"[^{}]*"traceId"\s*:\s*"(?<traceId>[^"]*)"[^{}]*"namespace"\s*:\s*"(?<namespace>[^"]*)"[^{}]*"requestId"\s*:\s*"(?<requestId>[^"]*)"[^{}]*"service"\s*:\s*"(?<service>[^"]*)"[^{}]*\})/ </source> <!-- 添加这个过滤器解析log字段并替换记录 --> <filter container_logs> @type parser key_name log # 指定要解析的字段是log reserve_data false # 丢弃原有的所有字段,只保留解析后的内容 <parse> @type json # 按JSON格式解析log字段的内容 </parse> </filter> <match container_logs> @type http endpoint https://events.baselime.io/v1/logs headers {"x-api-key":"xxx", "baselime-data-source": "fluentd/k8s"} open_timeout 2 json_array true <format> @type json </format> </match>
配置说明
parser过滤器的作用:key_name log:告诉Fluentd要解析日志记录中的log字段(该字段是JSON字符串格式)reserve_data false:解析完成后,会清除原来的log字段以及其他可能存在的冗余字段,只保留解析后的JSON结构(也就是log对象内的所有元素)
- 修改
match块的tag为container_logs,确保只处理经过过滤器处理后的日志
如果你的log字段已经是解析完成的JSON对象(而非字符串),可以改用record_transformer过滤器直接替换记录:
<filter container_logs> @type record_transformer <record> ${record['log']} </record> </filter>
内容的提问来源于stack exchange,提问作者user24903323
相关产品推荐
相关产品推荐

