搜文章
推荐 原创 视频 Java开发 iOS开发 前端开发 JavaScript开发 Android开发 PHP开发 数据库 开发工具 Python开发 Kotlin开发 Ruby开发 .NET开发 服务器运维 开放平台 架构师 大数据 云计算 人工智能 开发语言 其它开发
Lambda在线 > ElasticTalk > ET005 通过 metadata 使logstash配置更简洁

ET005 通过 metadata 使logstash配置更简洁

ElasticTalk 2018-10-03

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

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

 
   
   
 
  1. [@metadata][foo]

用例

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

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

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

 
   
   
 
  1. grok {

  2.      match => { "message" => "\[%{TIMESTAMP_ISO8601:timestamp}\] %{DATA:env}\.%{DATA:log_level}: %{DATA:content}" }

  3.    }

解析的结果为

 
   
   
 
  1. {

  2.      "env" => "production",

  3.      "timestamp" => "2017-04-01 22:21:21",

  4.      "log_level" => "INFO",

  5.      "content" => "{\"message\":\"[2017-04-01 22:21:21] production.INFO: this is a test log message by leon\"}"

  6. }

假设我们希望

  1. 能把log_level为INFO的日志丢弃掉,但又不想让该字段出现在最终的输出中

  2. 输出的索引名中能体现出env,但也不想让该字段出现在输出结果里

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

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

 
   
   
 
  1. grok {

  2.    match => { "message" => "\[%{TIMESTAMP_ISO8601:timestamp}\] %{DATA:[@metadata][env]}\.%{DATA:[@metadata][log_level]}: %{DATA:content}" }

  3. }

  4. if [@metadata][log_level] == "INFO"{

  5.    drop{}    

  6. }

  7. output{

  8.    elasticsearch {

  9.        hosts => ["127.0.0.1:9200"]

  10.        index => "%{[@metadata][env]}-log-%{+YYYY.MM}"

  11.        document_type => "_doc"

  12.    }

  13. }

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

Elasticsearch input插件

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

 
   
   
 
  1. input {

  2.  elasticsearch {

  3.    host => "127.0.0.1"

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

  5.    docinfo_in_metadata => true

  6.  }

  7. }

  8. filter{

  9.    ......

  10. }

  11. output {

  12.  elasticsearch {

  13.    document_id => "%{[@metadata][_id]}"

  14.    index => "transformed-%{[@metadata][_index]}"

  15.    type => "%{[@metadata][_type]}"

  16.  }

  17. }

调试

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

 
   
   
 
  1. output {

  2.  stdout {

  3.    codec  => rubydebug {

  4.      metadata => true

  5.    }

  6.  }

  7. }

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

 
   
   
 
  1. {

  2.    ....,

  3.    "@metadata" => {

  4.        "env" => "production",

  5.        "log_level" => "INFO"

  6.    }

  7. }

总结

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


版权声明:本站内容全部来自于腾讯微信公众号,属第三方自助推荐收录。《ET005 通过 metadata 使logstash配置更简洁》的版权归原作者「ElasticTalk」所有,文章言论观点不代表Lambda在线的观点, Lambda在线不承担任何法律责任。如需删除可联系QQ:516101458

文章来源: 阅读原文

相关阅读

关注ElasticTalk微信公众号

ElasticTalk微信公众号:ElasticTalk

ElasticTalk

手机扫描上方二维码即可关注ElasticTalk微信公众号

ElasticTalk最新文章

精品公众号随机推荐