我有一个Kubernetes
群集,我正在尝试聚合节点上的容器日志并将其发送到MongoDB
。但是我需要能够根据日志记录中的值将日志记录发送到不同的MongoDB服务器。
我正在使用fluent-plugin-kubernetes_metadata_filter插件将来自Kubernetes的其他信息附加到日志记录中。其中一个字段是kubernetes_namespace_name
。是否可以使用该字段创建一个标签,我可以用它来匹配mongodb输出插件。
例如。下面我只使用一个输出,但想法是有多个,让我们根据字段kubernetes_namespace_name
中的值将日志发送到该mongodb数据库:
<source>
@type tail
@label @KUBERNETES
path /var/log/containers/*.log
pos_file /var/log/es-containers.log.pos
time_format %Y-%m-%dT%H:%M:%S
tag kubernetes.*
format json
keep_time_key true
read_from_head true
</source>
<label @KUBERNETES>
<filter kubernetes.**>
@type kubernetes_metadata
kubernetes_url "#{ENV['K8S_HOST_URL']}"
bearer_token_file /var/run/secrets/kubernetes.io/serviceaccount/token
ca_file /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
include_namespace_id true
</filter>
<filter kubernetes.**>
@type flatten_hash
separator _
</filter>
# < Tag 'kubernetes.namespace.default' is created here somehow >
<match kubernetes.namespace.default>
@type mongo
host "#{ENV['MONGO_HOST']}"
port "#{ENV['MONGO_PORT']}"
database "#{ENV['MONGO_DATABASE']}"
collection "#{ENV['MONGO_COLLECTION']}"
capped
capped_size 1024m
user "#{ENV['MONGO_USER']}"
password "#{ENV['MONGO_PASSWORD']}"
time_key time
flush_interval 10s
</match>
</label>
答案 0 :(得分:0)
而不是使用标记,您可以使用消息内容使用Fluentd的grep
过滤器进行过滤。您可以在kubernetes元数据过滤器之后和数据分隔器之前添加过滤器。这允许您指定密钥kubernetes_namespace_name,然后根据其中的值进行路由。正如您可能使用标签的其他MongoDB输出可以帮助分离流程工作流程。
文档:https://docs.fluentd.org/v0.12/articles/filter_grep
示例:
<filter kubernetes.**>
@type grep
<regexp>
key kubernetes_namespace_name
pattern cool
</regexp>
</filter>
<YOUR MONGO CONFIG HERE>