概述

logstash 之所以强大和流行,与其丰富的过滤器插件是分不开的

过滤器提供的并不单单是过滤的功能,还可以对进入过滤器的原始数据进行复杂的逻辑处理,甚至添加独特的新事件到后续流程中

强大的文本解析工具 -- Grok

grok 是一个十分强大的 logstash filter 插件,他可以解析任何格式的文本,他是目前 logstash 中解析非结构化日志数据最好的方式

基本用法

Grok 的语法规则是:

  1. %{语法 : 语义}

“语法”指的就是匹配的模式,例如使用 NUMBER 模式可以匹配出数字,IP 则会匹配出 127.0.0.1 这样的 IP 地址:

  1. %{NUMBER:lasttime}%{IP:client}

默认情况下,所有“语义”都被保存成字符串,你也可以添加转换到的数据类型

  1. %{NUMBER:lasttime:int}%{IP:client}

目前转换类型只支持 int 和 float

覆盖 -- overwrite

使用 Grok 的 overwrite 参数也可以覆盖日志中的信息

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

日志中的 message 字段将会被覆盖

示例

对于下面的log,事实上是一个 HTTP 请求行:

  1. 55.3.244.1 GET /index.html 15824 0.043

我们可以使用下面的 logstash 配置:

  1. input {
  2. file {
  3. path => "/var/log/http.log"
  4. }
  5. }
  6. filter {
  7. grok {
  8. match => { "message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" }
  9. }
  10. }

可以看到收集结果:

  1. client: 55.3.244.1
  2. method: GET
  3. request: /index.html
  4. bytes: 15824
  5. duration: 0.043

将无结构的数据通过这样的方式实现了结构化输出

Grok 使用正则表达式

grok 是在正则表达式的基础上实现的(使用 Oniguruma 库),因此他可以解析任何正则表达式

创建模式

提取日志字段和正则表达式提取字段的规则一样:

  1. (?<field_name>the pattern here)

首先,创建一个模式文件,写入你需要的正则表达式:

  1. # contents of ./patterns/postfix:
  2. POSTFIX_QUEUEID [0-9A-F]{10,11}

然后配置你的 Logstash:

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

针对日志:

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

可以匹配出:

timestamp: Jan 1 06:25:43

logsource: mailserver14

program: postfix/cleanup

pid: 21403

queue_id: BEF25A72965

syslog_message: message-id=<20130101142543.5828399CCAF@mailserver14.example.com>

IP 位置插件 -- Geoip

Logstash 1.3.0 以上可以使用 geoip 插件获取 IP 对应的地理位置,对于 accesslog 等的统计来说,IP 来源是非常有用的一个信息

使用方法

  1. geoip {
  2. source => ...
  3. }

示例

  1. filter {
  2. geoip {
  3. source => "message"
  4. }
  5. }

运行结果:

  1. {
  2. "message" => "183.60.92.253",
  3. "@version" => "1",
  4. "@timestamp" => "2014-08-07T10:32:55.610Z",
  5. "host" => "raochenlindeMacBook-Air.local",
  6. "geoip" => {
  7. "ip" => "183.60.92.253",
  8. "country_code2" => "CN",
  9. "country_code3" => "CHN",
  10. "country_name" => "China",
  11. "continent_code" => "AS",
  12. "region_name" => "30",
  13. "city_name" => "Guangzhou",
  14. "latitude" => 23.11670000000001,
  15. "longitude" => 113.25,
  16. "timezone" => "Asia/Chongqing",
  17. "real_region_name" => "Guangdong",
  18. "location" => [
  19. [0] 113.25,
  20. [1] 23.11670000000001
  21. ]
  22. }
  23. }

可以看到,logstash 通过提取到的 message 字段中的 IP,解析到了地理位置相关的一系列信息

当然,对于解析出的众多数据,你也可以通过 fields 选项进行筛选

  1. filter {
  2. geoip {
  3. fields => ["city_name", "continent_code", "country_code2", "country_code3", "country_name", "dma_code", "ip", "latitude", "longitude", "postal_code", "region_name", "timezone"]
  4. }
  5. }

选项

上面我们看到了 source 和 fields 两个选项,geoip 还提供了下列选项:

geoip 提供的可选选项
选项 类型 是否必须 默认值 意义
add_field hash {} 为当前事件增加一个字段
add_tag array [] 为当前事件增加一个用于标识的tag
database path 位置信息库所在文件
fields array 在 geoip 的返回结果中筛选部分字段
lru_cashe_size int 1000 geoip 占用的缓存大小
periodic_flush bool false 是否定期调用刷新方e
remove_field array [] 从结果集中删除字段
remove_tag array [] 从结果集中删除tag
source string 需要解析的存有 IP 的字段名称
target string "geoip" 返回的结果中保存 geoip 解析结果的字段名

json

对于 json 格式的 log,可以通过 codec 的 json 编码进行解析,但是如果记录中只有一部分是 json,这时候就需要在 filter 中使用 json 解码插件

示例

  1. filter {
  2. json {
  3. source => "message"
  4. target => "jsoncontent"
  5. }
  6. }

运行结果:

  1. {
  2. "@version": "1",
  3. "@timestamp": "2014-11-18T08:11:33.000Z",
  4. "host": "web121.mweibo.tc.sinanode.com",
  5. "message": "{\"uid\":3081609001,\"type\":\"signal\"}",
  6. "jsoncontent": {
  7. "uid": 3081609001,
  8. "type": "signal"
  9. }
  10. }

上面的例子中,解析结果被放到了 target 所指向的节点下,如果希望将解析结果与 log 中其他字段保持在同一层级输出,那么只需要去掉 target 即可:

  1. {
  2. "@version": "1",
  3. "@timestamp": "2014-11-18T08:11:33.000Z",
  4. "host": "web121.mweibo.tc.sinanode.com",
  5. "message": "{\"uid\":3081609001,\"type\":\"signal\"}",
  6. "uid": 3081609001,
  7. "type": "signal"
  8. }

时间分割 -- split

mutiline 让 logstash 将多行数据变成一个事件,当然了,logstash 同样支持将一行数据变成多个事件

logstash 提供了 split 插件,用来把一行数据拆分成多个事件

示例:

  1. filter {
  2. split {
  3. field => "message"
  4. terminator => "#"
  5. }
  6. }

运行结果:

对于 "test1#test2",上述 logstash 配置将其变成了下面两个事件:

  1. {
  2. "@version": "1",
  3. "@timestamp": "2014-11-18T08:11:33.000Z",
  4. "host": "web121.mweibo.tc.sinanode.com",
  5. "message": "test1"
  6. }
  7. {
  8. "@version": "1",
  9. "@timestamp": "2014-11-18T08:11:33.000Z",
  10. "host": "web121.mweibo.tc.sinanode.com",
  11. "message": "test2"
  12. }

需要注意的是,当 split 插件执行结束后,会直接进入 output 阶段,其后的所有 filter 都将不会被执行

数据修改 -- mutate

logstash 还支持在 filter 中对事件中的数据进行修改

重命名 -- rename

对于已经存在的字段,重命名其字段名称

  1. filter {
  2. mutate {
  3. rename => ["syslog_host", "host"]
  4. }
  5. }

更新字段内容 -- update

更新字段内容,如果字段不存在,不会新建

  1. filter {
  2. mutate {
  3. update => { "sample" => "My new message" }
  4. }
  5. }

替换字段内容 -- replace

与 update 功能相同,区别在于如果字段不存在则会新建字段

  1. filter {
  2. mutate {
  3. replace => { "message" => "%{source_host}: My new message" }
  4. }
  5. }

数据类型转换 -- convert

  1. filter {
  2. mutate {
  3. convert => ["request_time", "float"]
  4. }
  5. }

文本替换 -- gsub

gsub 提供了通过正则表达式实现文本替换的功能

  1. filter {
  2. mutate {
  3. gsub => [
  4. # replace all forward slashes with underscore
  5. "fieldname", "/", "_",
  6. # replace backslashes, question marks, hashes, and minuses
  7. # with a dot "."
  8. "fieldname2", "[\\?#-]", "."
  9. ]
  10. }
  11. }

大小写转换 -- uppercase、lowercase

  1. filter {
  2. mutate {
  3. uppercase => [ "fieldname" ]
  4. }
  5. }

去除空白字符 -- strip

类似 php 中的 trim,只去除首尾的空白字符

  1. filter {
  2. mutate {
  3. strip => ["field1", "field2"]
  4. }
  5. }

删除字段 -- remove、remove_field

remove 不推荐使用,推荐使用 remove_field

  1. filter {
  2. mutate {
  3. remove_field => [ "foo_%{somefield}" ]
  4. }
  5. }

删除字段 -- remove、remove_field

remove 不推荐使用,推荐使用 remove_field

  1. filter {
  2. mutate {
  3. remove_field => [ "foo_%{somefield}" ]
  4. }
  5. }

分割字段 -- split

将提取到的某个字段按照某个字符分割

  1. filter {
  2. mutate {
  3. split => ["message", "|"]
  4. }
  5. }

针对字符串 "123|321|adfd|dfjld*=123",可以看到输出结果:

  1. {
  2. "message" => [
  3. [0] "123",
  4. [1] "321",
  5. [2] "adfd",
  6. [3] "dfjld*=123"
  7. ],
  8. "@version" => "1",
  9. "@timestamp" => "2014-08-20T15:58:23.120Z",
  10. "host" => "raochenlindeMacBook-Air.local"
  11. }

聚合数组 -- join

将类型为 array 的字段中的 array 元素使用指定字符为分隔符聚合成一个字符串

如我们可以将 split 分割的结果再重新聚合起来:

  1. filter {
  2. mutate {
  3. split => ["message", "|"]
  4. }
  5. mutate {
  6. join => ["message", ","]
  7. }
  8. }

输出:

  1. {
  2. "message" => "123,321,adfd,dfjld*=123",
  3. "@version" => "1",
  4. "@timestamp" => "2014-08-20T16:01:33.972Z",
  5. "host" => "raochenlindeMacBook-Air.local"
  6. }

合并数组 -- merge

对于几个类型为 array 或 hash 或 string 的字段,我们可以使用 merge 合并

  1. filter {
  2. mutate {
  3. merge => [ "dest_field", "added_field" ]
  4. }
  5. }

需要注意的是,array 和 hash 两个字段是不能 merge 的

原文地址;https://www.cnblogs.com/dyh004/p/9699813.html

【记录】logstash 的filter 使用的更多相关文章

  1. Logstash的filter插件介绍

    一 官网说明 过滤器插件对事件执行中介处理.通常根据事件的特征有条件地应用过滤器. 以下过滤器插件在下面可用. Plugin Description Github repository aggrega ...

  2. logstash之filter处理中括号包围的内容

    如题,logstash之filter处理中括号包围的内容: $grep -v "#" config/logstash-nlp.yml input { kafka { bootstr ...

  3. ELK 学习笔记之 Logstash之filter配置

    Logstash之filter: json filter: input{ stdin{ } } filter{ json{ source => "message" } } o ...

  4. 小姐姐教你定制一个Logstash Java Filter

    Logstash是用来收集数据,解析处理数据,最终输出数据到存储组件的处理引擎.数据处理流程为: Logstash Java Filter 就是基于Logstash的Filter扩展API开发一个用J ...

  5. logstash的filter之grok

    logstash的filter之grokLogstash中的filter可以支持对数据进行解析过滤. grok:支持120多种内置的表达式,有一些简单常用的内容就可以使用内置的表达式进行解析 http ...

  6. logstash 过滤filter

    logstash过滤器插件filter详解及实例   1.logstash过滤器插件filter 1.1.grok正则捕获 grok是一个十分强大的logstash filter插件,他可以通过正则解 ...

  7. LogStash的Filter的使用

    最近在项目中使用LogStash做日志的采集和过滤,感觉LogStash还是很强大的. input { file{ path => "/XXX/syslog.txt" sta ...

  8. logstash实战filter插件之grok(收集apache日志)

    有些日志(比如apache)不像nginx那样支持json可以使用grok插件 grok利用正则表达式就行匹配拆分 预定义的位置在 /opt/logstash/vendor/bundle/jruby/ ...

  9. logstash之Filter插件

    Logstash之所以强悍的主要原因是filter插件:通过过滤器的各种组合可以得到我们想要的结构化数据 1:grok正则表达式 grok**正则表达式是logstash非常重要的一个环节**:可以通 ...

随机推荐

  1. windows下如何安装pip

    在安装pip前,请确认win系统中已经安装好了python,和easy_install工具 Python完成后 配置环境变量 在环境变量中添加Python目录 (1) 右键点击"计算机&qu ...

  2. R语言把DataFrame的一行变成向量

    在R语言里面,DataFrame的一列数据本质上可以认为是一个向量或列表,但是一行数据不是. 今天有一个31列的数据集,由于放在第一行的变量名格式不规范,读入数据的时候不能顺带读入变量名.于是跳过首行 ...

  3. 对Promise的研究4

    Promise.reject() Promise.reject(reason)方法也会返回一个新的 Promise 实例,该实例的状态为rejected. const p = Promise.reje ...

  4. ueditor编辑器中从word中复制带图片的信息的操作演示

    我司需要做一个需求,就是使用富文本编辑器时,不要以上传附件的形式上传图片,而是以复制粘贴的形式上传图片. 在网上找了一下,有一个插件支持这个功能. WordPaster 安装方式如下: 直接使用Wor ...

  5. BZOJ 1596: [Usaco2008 Jan]电话网络 树形DP

    挺经典的,细节需要特别注意一下 Code: #include<bits/stdc++.h> using namespace std; #define setIO(s) freopen(s& ...

  6. [JSOI2004]平衡点 / 吊打XXX 题解

    预备概念: 金属退火:将金属缓慢加热到一定温度,保持足够时间,然后以适宜速度冷却 温度:一个逐渐减小的参数,表示接受次优解的概率 模拟退火是一种解决复杂问题的算法,相当于贪心,但以一个逐渐减小的该率接 ...

  7. 20180711-Java分支结构 – if…else/switch

    public class Test{ public static void main(String args[]){ int x = 10; if(x<20){ System.out .prin ...

  8. PHP操作Excel – PHPExcel 基本用法

    利用PHP实现对于Excel的写入和读取,主要借助于PHPExcel插件来完成. 准备工作: 1.下载PHPExcel的SDK,下载地址:https://github.com/PHPOffice/PH ...

  9. xxxxxxxxxxxxxxxxxxx

    <!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="Conten ...

  10. How to: Create a Windows Communication Foundation Client

    How to: Create a Windows Communication Foundation Client To create a Windows Communication Foundatio ...