Logstash的grok以及Ruby


  logstash的grok插件的用途是提取字段,將非格式的內容進行格式化,

input {
    file {
        path => "/var/log/http.log"
    }
}
filter {
    grok {
        match => { "message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" }
    }
}         

  匹配字段如下:

client: 55.3.244.1

method: GET

request: /index.html

bytes: 15824

duration: 0.043

 

  更加震撼的是logstash內置很多的正則表達式,參見參考部分的鏈接。

  例如:對於字符串:

Jan 1 06:25:43 mailserver14 postfix/cleanup[21403]: BEF25A72965: message-id=<20130101142543.5828399CCAF@mailserver14.example.com>

  可以用如下的解析

1 filter {
2     grok {
3         patterns_dir => ["./patterns"]
4         match => { "message" => "%{SYSLOGBASE} %{POSTFIX_QUEUEID:queue_id}: %{GREEDYDATA:syslog_message}" }
5     }
6 }         

 

 

  其中SYSLOGBASE以及GREEDYDATA都是logstash里面內置好的解析規則,可以再上面提供的github中找到,是不是很省勁?

  對於POSTFIX_QUEUEID而言,是一個我們自己定制的一個解析,放在根目錄的patterns路徑下,那么需要前面的patterns_dir參數中指定一下路徑即可。文件的內容如下:

  # contents of ./patterns/postfix:

  POSTFIX_QUEUEID [0-9A-F]{10,11}

  我們來看一下grok里面令人興奮的幾個例子:

  1. override:

  消息:

May 29 16:37:11 sadness logger: hello world

  grok規則:

1 filter {
2     grok {
3         match => { "message" => "%{SYSLOGBASE} %{DATA:message}" }
4         overwrite => [ "message" ]
5     }
6 }         

  解析結果:

  hello world

 

  2. addtag,addfield

  處於測試目的,你能希望添加一些字段來輔助跟蹤,或者增強表達內容可以通過addtag以及addfield來進行統一設置。tag表達式有一個點,就是可以一次性添加多個,因為這些options的類型都是array,如果是多個,需要用"[... ...]"來包裹。

filter {
  grok {
    add_field => { "foo_%{somefield}" => "Hello world, from %{host}" }
  }
}
# You can also add multiple fields at once:
filter {
  grok {
    add_field => {
"foo_%{somefield}" => "Hello world, from %{host}"
"new_field" => "new_static_value"
    }
  }
}
filter {
    grok {
      add_tag => [ "foo_%{somefield}" ]
    }
}
# You can also add multiple tags at once:
filter {
    grok {
        add_tag => [ "foo_%{somefield}", "taggedy_tag"]
    }
} 

 

 

  3. 多個規則匹配

 

1 filter {
2     grok {
3          match => { "message" => [ "%{NUMBER:duration}",  "%{NUMBER:speed}" ] } }
4 } 

  關於Grok解析

 

  想要測試我們的grok而是解析正確可以通過下面的網站進行測試:

http://grokdebug.herokuapp.com/

  例如,

  1. 匹配名字
1 Demo:Lorry 2018-9-8 11:20:54
2 
3 模式:^%{USERNAME:name}$
4 
5 匹配結果:
6 
7 { "name": [ [ "Lorry" ] ] }

  2.匹配時間

1 Demo:2018-9-8T11:19:57.333
2 模式:%{TIMESTAMP_ISO8601 :lorry}
3 匹配結果
4 { "TIMESTAMP_ISO8601": [ [ "2018-9-8T11:19:57.333" ] ], "YEAR": [ [ "2018" ] ], "MONTHNUM": [ [ "9" ] ], "MONTHDAY": [ [ "8" ] ], "HOUR": [ [ "11", null ] ], "MINUTE": [ [ "19", null ] ], "SECOND": [ [ "57.333" ] ], "ISO8601_TIMEZONE": [ [ null ] ] } 

  3.下面是一個比較復雜的demo,就是匹配多部分:

1 DemoLorry 2018-9-8T11:19:57.333
2 %{USERNAME:Lorry}%{SPACE}%{TIMESTAMP_ISO8601:time} 

 

Ruby

最后是關於ruby,下面鏈接中就是一個比較好的Ruby教程,就ruby的語法以及日期等處理方式都有說明。

 

參考:

  1. 關於grok內置好的正則表達式

https://github.com/elastic/logstash/blob/v1.4.2/patterns/grok-patterns

  2. 下面是一篇很好的介紹logstash的文章(唉,只有google可以搜得到)

https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html

  3. Ruby教程

https://code.ziqiangxuetang.com/ruby/ruby-tutorial.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM