2017-09-05 63 views
0

我有一个Kubernetes群集,其中我试图在节点上聚合容器日志并将它们发送到MongoDB。不过,我需要能够根据日志记录中的值自行发送日志记录到不同的MongoDB服务器。Fluentd根据字段值创建标记

我正在使用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

,而不是使用的标签,你可以使用消息内容使用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> 
+0

所以你的意思,我需要有1点光源和多个标签每个都有它自己的流量? – amofasser

+0

正确的配置将会有相当多的依赖性,但这应该会起作用。 –