通过 metadata 使logstash配置更简洁

Leon J 发表了文章 • 0 个评论 • 83 次浏览 • 2018-09-04 13:17 • 来自相关话题

从Logstash 1.5开始,我们可以在logstash配置中使用metadata。metadata不会在output中被序列化输出,这样我们便可以在metadata中添加一些临时的中间数据,而不需要去删除它。

我们可以通过以下方式来访问metadata:

<br /> [@metadata][foo]<br />



用例


假设我们有这样一条日志:

<br /> [2017-04-01 22:21:21] production.INFO: this is a test log message by leon<br />



我们可以在filter中使用grok来做解析:

ruby<br /> grok {<br /> match => { "message" => "\[%{TIMESTAMP_ISO8601:timestamp}\] %{DATA:env}\.%{DATA:log_level}: %{DATA:content}" }<br /> }<br />

解析的结果为

ruby<br /> {<br /> "env" => "production",<br /> "timestamp" => "2017-04-01 22:21:21",<br /> "log_level" => "INFO",<br /> "content" => "{\"message\":\"[2017-04-01 22:21:21] production.INFO: this is a test log message by leon\"}"<br /> }<br />



假设我们希望

  1. 能把log_level为INFO的日志丢弃掉,但又不想让该字段出现在最终的输出中
  2. 输出的索引名中能体现出env,但也不想让该字段出现在输出结果里

    对于1,一种方案是在输出之前通过mutate插件把不需要的字段删除掉,但是一旦这样的处理多了,会让配置文件变得“不干净”。

    通过 metadata,我们可以轻松地处理这些问题:

    ruby<br /> grok {<br /> match => { "message" => "\[%{TIMESTAMP_ISO8601:timestamp}\] %{DATA:[@metadata][env]}\.%{DATA:[@metadata][log_level]}: %{DATA:content}" }<br /> }<br /> <br /> if [@metadata][log_level] == "INFO"{<br /> drop{} <br /> }<br /> <br /> output{<br /> elasticsearch {<br /> hosts => ["127.0.0.1:9200"]<br /> index => "%{[@metadata][env]}-log-%{+YYYY.MM}"<br /> document_type => "_doc"<br /> }<br /> }<br />

    除了简化我们的配置文件、减少冗余字段意外,同时也能提高logstash的处理速度。





    Elasticsearch input插件


    有些插件会用到metadata这个特性,比如elasticsearch input插件:

    ```ruby
    input {
    elasticsearch {
    host => "127.0.0.1"

    把 ES document metadata (_index, _type, _id) 包存到 @metadata 中

    docinfo_in_metadata => true
    }
    }

    filter{
    ......
    }

    output {
    elasticsearch {
    document_id => "%{[@metadata][_id]}"
    index => "transformed-%{[@metadata][_index]}"
    type => "%{[@metadata][_type]}"
    }
    }
    ```



    调试


    一般来说metadata是不会出现在输出中的,除非使用 rubydebug codec 的方式输出:

    <br /> output { <br /> stdout { <br /> codec => rubydebug {<br /> metadata => true<br /> }<br /> }<br /> }<br />

    日志经过处理后输出中会包含:

    ruby<br /> {<br /> ....,<br /> "@metadata" => {<br /> "env" => "production",<br /> "log_level" => "INFO"<br /> }<br /> }<br />



    总结


    由上可见,metadata提供了一种简单、方便的方式来保存中间数据。这样一方面减少了logstash配置文件的复杂性:避免调用remove_field,另一方面也减少了输出中的一些不必要的数据。通过这篇对metadata的介绍,希望能对大家有所帮助。

    ![elasticTalk,qrcode](http://p8z8qq24s.bkt.clouddn.c ... 24.png)

测试logstatsh 接收kafka topic 性能有这么低嘛?

回复

zhangshuai 发起了问题 • 1 人关注 • 0 个回复 • 77 次浏览 • 2018-09-04 11:54 • 来自相关话题

logstash 删除filed中部分字段

zqc0512 回复了问题 • 3 人关注 • 3 个回复 • 1407 次浏览 • 2018-08-31 09:20 • 来自相关话题

logstash能动态添加导入的表吗

medcl 回复了问题 • 2 人关注 • 1 个回复 • 97 次浏览 • 2018-08-30 21:42 • 来自相关话题

elk安装在一台服务器上,cpu爆满

sweetpotato 回复了问题 • 4 人关注 • 4 个回复 • 281 次浏览 • 2018-08-30 11:41 • 来自相关话题

elasticsearch6 的配置文件中已经不能配置shard数了,logstash 写入elasticsearch的时候如何指定shard 数?

AndrewOYLK 回复了问题 • 6 人关注 • 8 个回复 • 216 次浏览 • 2018-08-30 11:10 • 来自相关话题

filebeat->haproxy->logstash-es

回复

juneryang 发起了问题 • 1 人关注 • 0 个回复 • 107 次浏览 • 2018-08-28 15:23 • 来自相关话题

filebeat向logstash传值的配

zyy 回复了问题 • 2 人关注 • 3 个回复 • 101 次浏览 • 2018-08-28 10:40 • 来自相关话题

logstash log转成json格式输出

zyy 回复了问题 • 2 人关注 • 1 个回复 • 147 次浏览 • 2018-08-27 10:12 • 来自相关话题

logstash 已启动采集logback的日志,我再配置一个文件,利用filebeat采集nginx的日志,可以启动两个logstash实例吗?

zyy 回复了问题 • 2 人关注 • 1 个回复 • 145 次浏览 • 2018-08-27 10:02 • 来自相关话题

使用logstash作数据增量同步时怎么监控数据导入了多少

codxiao 回复了问题 • 4 人关注 • 3 个回复 • 243 次浏览 • 2018-08-26 10:12 • 来自相关话题

logstash 截取kafka 中的json中为空值的 不要这一个字段能做到么?

回复

zhangshuai 发起了问题 • 1 人关注 • 0 个回复 • 133 次浏览 • 2018-08-24 14:39 • 来自相关话题

logstash-input-syslog接收多台设备日志的编码问题

tyb1222 回复了问题 • 3 人关注 • 2 个回复 • 106 次浏览 • 2018-08-24 12:01 • 来自相关话题

logstach时间解析失败

百衲本 回复了问题 • 3 人关注 • 3 个回复 • 134 次浏览 • 2018-08-23 11:35 • 来自相关话题

logstash syslog Facility级别问题

chinaxushi 回复了问题 • 3 人关注 • 5 个回复 • 165 次浏览 • 2018-08-22 17:38 • 来自相关话题