1.1 Logstash配置详解
Logstash 是一个开源的数据收集引擎,它具有备实时数据传输能力。它可以统一过滤来自不同源的数据,并按照开发者的制定的规范输出到目的地。
Logstash 通过管道进行运作,管道有两个必需的元素,输入和输出,还有一个可选的元素,过滤器。输入插件从数据源获取数据,过滤器插件根据用户指定的数据格式修改数据,输出插件则将数据写入到目的地。
- 输入 input { ... }
- 过滤器 filter { ... }
- 输出 output { ... }
使用Logstash之前,需要了解一个概念:事件,Logstash 每读取一次数据的行为叫做事件。Logstach 目录中创建一个配置文件,命名为 logstash.conf或者其他名称;
Logstash过滤器插件位于 Logstash 管道的中间位置,对事件执行过滤处理,配置在 filter {},且可以配置多个,使用 grok 插件演示,grok 插件用于过滤杂乱的内容,将其结构化,增加可读性,如下案例一:
input { stdin {} } filter { grok { match => { "message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" } } } output { stdout { codec => "rubydebug" } } |
输入如下代码:
192.168.0.111 GET /index.html 13843 0.059
Grok内置的默认类型有很多种,可以通过官网查看支持的类型:
USERNAME [a-zA-Z0-9._-]+ USER %{USERNAME} EMAILLOCALPART [a-zA-Z][a-zA-Z0-9_.+-=:]+ EMAILADDRESS %{EMAILLOCALPART}@%{HOSTNAME} INT (?:[+-]?(?:[0-9]+)) BASE10NUM (?<![0-9.+-])(?>[+-]?(??:[0-9]+(?:\.[0-9]+)?)|(?:\.[0-9]+))) NUMBER (?:%{BASE10NUM}) BASE16NUM (?<![0-9A-Fa-f])(?:[+-]?(?:0x)?(?:[0-9A-Fa-f]+)) BASE16FLOAT \b(?<![0-9A-Fa-f.])(?:[+-]?(?:0x)?(??:[0-9A-Fa-f]+(?:\.[0-9A-Fa-f]*)?)|(?:\.[0-9A-Fa-f]+)))\b POSINT \b(?:[1-9][0-9]*)\b NONNEGINT \b(?:[0-9]+)\b WORD \b\w+\b NOTSPACE \S+ SPACE \s* DATA .*? GREEDYDATA .* QUOTEDSTRING (?>(?<!\\)(?>"(?>\\.|[^\\"]+)+"|""|(?>'(?>\\.|[^\\']+)+')|''|(?>`(?>\\.|[^\\`]+)+`)|``)) UUID [A-Fa-f0-9]{8}-(?:[A-Fa-f0-9]{4}-){3}[A-Fa-f0-9]{12} # URN, allowing use of RFC 2141 section 2.3 reserved characters URN urn:[0-9A-Za-z][0-9A-Za-z-]{0,31}?:%[0-9a-fA-F]{2}|[0-9A-Za-z()+,.:=@;$_!*'/?#-])+ |
使用自定义的Grok类型,更多时候logstash grok没办法提供你所需要的匹配类型,这个时候我们可以使用自定义; n 直接使用oniguruma语法去匹配文本片段,语法如下:
(?<field_name>the pattern here)
假设你需要匹配的文本片段为一个长度为10或11的十六进制的值,使用下列语法可以获取该片段,并把值赋予queue_id,如下配置:
(?<queue_id>[0-9A-F]{10,11})
192.168.0.111 GET /index.html 15824 0.043 1
n 创建自定义pattern文件,语法如下:
创建文件夹patterns,在此文件夹下面创建一个文件,文件名随意,例如:postfix;
mkdir patterns
POSTFIX_QUEUEID [0-9A-F]{10,11}
input { stdin {} } filter { grok { patterns_dir => ["./patterns"] match => { "message" => "%{IP:client_id_address} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:http_response_time} %{POSTFIX_QUEUEID:queue_id}" } } } output { stdout { codec => "rubydebug" } } |
192.168.0.111 GET /index.html 15824 0.043 ABC24C98567
|