原文地址:http://techlog.cn/article/list/10182917

概述

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

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

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

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

基本用法

Grok 的语法规则是:

%{语法 : 语义}

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

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

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

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

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

覆盖 -- overwrite

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

filter {
grok {
match => { "message" => "%{SYSLOGBASE} %{DATA:message}" }
overwrite => [ "message" ]
}
}

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

示例

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

55.3.244.1 GET /index.html  0.043

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

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:
duration: 0.043

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

Grok 使用正则表达式

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

创建模式

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

(?<field_name>the pattern here)

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

# contents of ./patterns/postfix:
POSTFIX_QUEUEID [-9A-F]{,}

然后配置你的 Logstash:

filter {
grok {
patterns_dir => "./patterns"
match => { "message" => "%{SYSLOGBASE} %{POSTFIX_QUEUEID:queue_id}: %{GREEDYDATA:syslog_message}" }
}
}

针对日志:

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 来源是非常有用的一个信息

使用方法

geoip {
source => ...
}

示例

filter {
geoip {
source => "message"
}
}

运行结果:

{
"message" => "183.60.92.253",
"@version" => "",
"@timestamp" => "2014-08-07T10:32:55.610Z",
"host" => "raochenlindeMacBook-Air.local",
"geoip" => {
"ip" => "183.60.92.253",
"country_code2" => "CN",
"country_code3" => "CHN",
"country_name" => "China",
"continent_code" => "AS",
"region_name" => "",
"city_name" => "Guangzhou",
"latitude" => 23.11670000000001,
"longitude" => 113.25,
"timezone" => "Asia/Chongqing",
"real_region_name" => "Guangdong",
"location" => [
[] 113.25,
[] 23.11670000000001
]
}
}

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

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

filter {
geoip {
fields => ["city_name", "continent_code", "country_code2", "country_code3", "country_name", "dma_code", "ip", "latitude", "longitude", "postal_code", "region_name", "timezone"]
}
}

选项

上面我们看到了 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 解码插件

示例

filter {
json {
source => "message"
target => "jsoncontent"
}
}

运行结果:

{
"@version": "",
"@timestamp": "2014-11-18T08:11:33.000Z",
"host": "web121.mweibo.tc.sinanode.com",
"message": "{\"uid\":3081609001,\"type\":\"signal\"}",
"jsoncontent": {
"uid": ,
"type": "signal"
}
}

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

{
"@version": "",
"@timestamp": "2014-11-18T08:11:33.000Z",
"host": "web121.mweibo.tc.sinanode.com",
"message": "{\"uid\":3081609001,\"type\":\"signal\"}",
"uid": ,
"type": "signal"
}

时间分割 -- split

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

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

示例:

filter {
split {
field => "message"
terminator => "#"
}
}

运行结果:

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

{
"@version": "",
"@timestamp": "2014-11-18T08:11:33.000Z",
"host": "web121.mweibo.tc.sinanode.com",
"message": "test1"
}
{
"@version": "",
"@timestamp": "2014-11-18T08:11:33.000Z",
"host": "web121.mweibo.tc.sinanode.com",
"message": "test2"
}

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

数据修改 -- mutate

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

重命名 -- rename

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

filter {
mutate {
rename => ["syslog_host", "host"]
}
}

更新字段内容 -- update

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

filter {
mutate {
update => { "sample" => "My new message" }
}
}

替换字段内容 -- replace

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

filter {
mutate {
replace => { "message" => "%{source_host}: My new message" }
}
}

数据类型转换 -- convert

filter {
mutate {
convert => ["request_time", "float"]
}
}

文本替换 -- gsub

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

filter {
mutate {
gsub => [
# replace all forward slashes with underscore
"fieldname", "/", "_",
# replace backslashes, question marks, hashes, and minuses
# with a dot "."
"fieldname2", "[\\?#-]", "."
]
}
}

大小写转换 -- uppercase、lowercase

filter {
mutate {
uppercase => [ "fieldname" ]
}
}

去除空白字符 -- strip

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

filter {
mutate {
strip => ["field1", "field2"]
}
}

删除字段 -- remove、remove_field

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

filter {
mutate {
remove_field => [ "foo_%{somefield}" ]
}
}

删除字段 -- remove、remove_field

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

filter {
mutate {
remove_field => [ "foo_%{somefield}" ]
}
}

分割字段 -- split

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

filter {
mutate {
split => ["message", "|"]
}
}

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

{
"message" => [
[] "",
[] "",
[] "adfd",
[] "dfjld*=123"
],
"@version" => "",
"@timestamp" => "2014-08-20T15:58:23.120Z",
"host" => "raochenlindeMacBook-Air.local"
}

聚合数组 -- join

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

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

filter {
mutate {
split => ["message", "|"]
}
mutate {
join => ["message", ","]
}
}

输出:

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

合并数组 -- merge

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

filter {
mutate {
merge => [ "dest_field", "added_field" ]
}
}

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

Logstash filter 的使用的更多相关文章

  1. logstash filter 处理json

    根据输入的json字段,分别建立索引.循环生成注册log和登录log保存到testlog文件中,结果如下: {"method":"register"," ...

  2. LogStash filter介绍(九)

    LogStash plugins-filters-grok介绍 官方文档:https://www.elastic.co/guide/en/logstash/current/plugins-filter ...

  3. logstash filter grok 用法

    在elk+filebeat都安装好,且明白了基本流程后,主要的就是写logstash的filter了,以此来解析特定格式的日志 logstash的filter是用插件实现的,grok是其中一个,用来解 ...

  4. Logstash filter 插件之 grok

    本文简单介绍一下 Logstash 的过滤插件 grok. Grok 的主要功能 Grok 是 Logstash 最重要的插件.它可以解析任意文本并把它结构化.因此 Grok 是将非结构化的日志数据解 ...

  5. logstash filter geoip 转换IP为详细地址等内容。

    使用logstash geoip筛选器可以将ip地址解析为更丰富的内容. 结果类似于这样: "geoip": { "city_name": "Ürüm ...

  6. 使用Logstash filter grok过滤日志文件

    Logstash提供了一系列filter过滤plugin来处理收集到的log event,根据log event的特征去切分所需要的字段,方便kibana做visualize和dashboard的da ...

  7. logstash filter plugin

    1. 基本语法%{NUMBER:duration} %{IP:client} 2. 支持的数据类型默认会把所有的匹配都当作字符串,比如0.043, 想要转成浮点数,可以%{NUMBER:num:flo ...

  8. Elasticsearch logstash filter

    参照官方文档: https://www.elastic.co/guide/en/logstash/current/advanced-pipeline.html demo-pipeline.conf i ...

  9. Logstash filter 插件之 date

    使用 date 插件解析字段中的日期,然后使用该日期或时间戳作为事件的 logstash 时间戳.对于排序事件和导入旧数据,日期过滤器尤其重要.如果您在事件中没有得到正确的日期,那么稍后搜索它们可能会 ...

随机推荐

  1. 口碑订单,ERP本地加/退菜无法回流至手机端的解决办法-订单金额不统一erp本地加菜H5没有

    关于 口碑订单,ERP本地加/退菜无法回流至手机端的解决办法-订单金额不统一erp本地加菜H5没有 1. 2. 3. PS:是正餐后付的务必要选择口碑后付 完成以上设置即可

  2. 老K漫谈区块链的共识(1)——免信任的共识机制

    老k,柏链道捷CTO.清华阿尔山区块链研究中心高级工程师,超过17年的系统软件开发经验,在操作系统.编译器.虚拟机和符号执行方面都有实战经验.主持开发多个开眼项目,目前主要从事区块链底层系统开发工作. ...

  3. EOS与以太坊有哪些区别?

    以太坊是一个专门为开发和运行去中心化应用(DAPP)搭建的智能合约平台:EOS与以太坊类似,同样是基于智能合约和区块链而搭建.但是,从技术和设计理念等方面来看,这两者之间实际上存在明显的区别. 那么E ...

  4. python——函数之生成器

    1 生成器函数的含义    生成器是一个返回可以迭代对象的函数,它是一个特殊的迭代器,但迭代器的抽象层级更高且比较复杂需要实现很多方法.相较迭代器而言,生成器简单使用. 2 生成器的创建方式 2.1 ...

  5. 4.7Python数据处理篇之Matplotlib系列(七)---matplotlib原理分析

    目录 目录 前言 (一)总框架分析 (二)函数式的绘图 1.说明: 2.函数绘图的缺优点 3.绘图类的函数 4.操作类的函数 5.例子: (三)面向对象式的绘图 1.基本概念 2.基本对象 3.面向对 ...

  6. 持续代码质量管理-SonarQube-7.3部署

    Sonar 是一个用于代码质量管理的开放平台.通过插件机制,Sonar 可以集成不同的测试工具,代码分析工具,以及持续集成工具.与持续集成工具(例如 Hudson/Jenkins 等)不同,Sonar ...

  7. ubuntu下定时任务的执行

    概述 linux系统由 cron (crond) 这个系统服务来控制例行性计划任务.Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的. 另外, 由于使用者自己也可以设置计划 ...

  8. (转)Spring Boot 2 (九):【重磅】Spring Boot 2.1.0 权威发布

    http://www.ityouknow.com/springboot/2018/11/03/spring-boot-2.1.html 如果这两天登录 https://start.spring.io/ ...

  9. C#深度学习の委托深度解析

    一.我们在使用C#的过程中,不可避免的用到了委托. 委托的本质是什么呢? 从语法上看,委托是对方法的抽象封装,例如:public void print1(),public void print2(), ...

  10. w3m 在ubuntu中的使用

    w3m 使用总结 安装 sudo apt install w3m终端 w3m www.baidu.com 即可打开w3m是个开放源代码的命令行下面的网页浏览器.一般的linux系统都会自带这个工具,可 ...