作者:Danbo 2016-03-09

1.Grok正则捕获

input {stdin{}}
filter {
grok {
match => {
"message" => "\s+(?<request_time>\d+(?:\.\d+)?)\s+"
}
}
}
output {stdout{ codec => rubydebug }}

运行logstash输出结果如下:

[root@centos-linux logstash]# bin/logstash -f conf/grok.conf
Logstash startup completed
begin 123.456 end
{
"message" => "begin 123.456 end",
"@version" => "",
"@timestamp" => "2016-03-09T12:30:58.976Z",
"host" => "centos-linux.shared",
"request_time" => "123.456"
}

不过这里request_time应该是数值而不是字符串。

grok表达式的打印复制格式的完整语法是下面这样的:

%{PATTERN_NAME:capture_name:data_type}

date_type 目前只支持两个值:int 和 float。

我们将配置修改成下面这样:

input {stdin{}}
filter {
grok {
match => {
"message" => "%{WORD} %{NUMBER:request_time:float} %{WORD}"
}
}
}
output {stdout{ codec => rubydebug }}

运行结果如下:

[root@centos-linux logstash]# bin/logstash -f conf/grok1.conf
Logstash startup completed
begin 123.456 end
{
"message" => "begin 123.456 end",
"@version" => "",
"@timestamp" => "2016-03-09T12:46:29.913Z",
"host" => "centos-linux.shared",
"request_time" => 123.456

此时request_time 变成数值类型了。

实际运用中,我们需要处理各种各样的日志文件,如果都是在配置文件里各自写一行自己的表达式,就完全不可管理了。我们建议把所有的grok表达式统一写入到一个地方。然后用filter/grok的patterns_dir 选项来指明。

重点:如果你把"message"里所有的信息都grok到不同的字段了,数据数值上就相当于是重复复制存储了两份。所以你可以用remove_field 参数来删除掉message字段,或者用overwrite参数来重写默认的message字段,只保留最重要的部分。

重写参数示例:

input { stdin {} }
filter {
grok {
patterns_dir => "/path/to/your/own/patterns"
match => {
"message" => "%{SYSLOGBASE} %{DATA:message}"
}
overwrite => ["message"]
}
}

2.多项选择

在和codec/multiline搭配使用的时候,需要注意一个问题,grok正则和普通正则一样,默认是不支持匹配回车换行的。就像你需要 =~ //m一样也需要单独指定,具体写法是在表达式开始位置加上(?m)标记。

具体如下所示:

match => {
"message" => "(?m)\s+(?<reuqest_time>\d+(?:\.\d+)?)\s+"
}

有时我们会碰上一个日志有多种可能格式的情况。这时候要写成单一正则就比较困难,或者全用| 隔开比较丑陋。

实际上logstash/filters/grok插件的match参数应该接受的是一个Hash值。但是因为早期的logstash语法中Hash值也是用数组这种方式书写的,因此我们传递Array值给match参数也是可以的,我们这里是可以传递多个正则来匹配同一个字段:

match => [
"message", "(?<request_time>\d(?:\.\d+)?)",
"message", "%{SYSLOGBASE} %{DATA:message}",
"message", "(?m)%{WORD}"
]

logstash会按照这个定义次序以此尝试匹配,到匹配成功为止。虽说效果跟用 | 大大的正则是一样的,但是阅读性提高了很多。

3.GeoIP地址查询归类

GeoIP是最常见的免费IP地址归类查询库。GeoIP库可以根据IP地址提供对应的地域信息,包括国别、省市、经纬度等,对于可视化地图和区域统计非常有用。

配置信息:

[root@centos-linux logstash]# cat conf/geoip.conf
input {stdin{}}
filter {
geoip {
source => "message"
}
}
output {stdout { codec => rubydebug }}

运行结果:

[root@centos-linux logstash]# bin/logstash -f conf/geoip.conf
Logstash startup completed
114.114.114.114
{
"message" => "114.114.114.114",
"@version" => "1",
"@timestamp" => "2016-03-09T13:57:36.182Z",
"host" => "centos-linux.shared",
"geoip" => {
"ip" => "114.114.114.114",
"country_code2" => "CN",
"country_code3" => "CHN",
"country_name" => "China",
"continent_code" => "AS",
"region_name" => "19",
"city_name" => "Chaoyang",
"latitude" => 41.5703,
"longitude" => 120.45859999999999,
"timezone" => "Asia/Harbin",
"real_region_name" => "Liaoning",
"location" => [
[0] 120.45859999999999,
[1] 41.5703
]
}
}

GeoIP库数据较多,如果你不需要这么多内容,可以通过fields选项指定自己所需要的。

注意geoip库内只存有公网上的IP信息,查询不到内网结果的,会直接返回null,

4.Key-Value切分

在很多情况下,日志内容本身都是一个类似于key-value的格式,但是格式具体的样式确实多样的。Logstash提供 filters/kv 插件,帮助处理不同样式的key-value日志,变成实际的LogStash::Event数据。

配置示例:

Nginx访问日志中的$request,通过这段配置,可以详细切分成method,url_path,verb,url_a,url_b

我们看kv { } 这个字段。

上例即表示,除了url_uid 和 url_cip 两个字段以外,其他url_* 都不保留。

5.数据修改(Mutate)

数据类型转化:(可以设置的转换类型包括:“integer”,“float”,“sting”)

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

注意:mutate除了转换简单的字符值,还支持对数组类型的字段进行转换,即将["1", "2"]转换成[1,2]。但不支持对哈希类型字段做类似处理。

字符串处理

-gsub

仅对字符串类型字段有效

input { stdin { } }

filter {
mutate {
gsub => ["message", "[\\?#]", "_"]
}
} output {
stdout { codec => rubydebug }
}

运行结果如下:

fight?for?you
{
"message" => "fight_for_you",
"@version" => "",
"@timestamp" => "2016-03-12T07:05:30.419Z",
"host" => "cen

-split

input { stdin { } }

filter {
mutate {
split => ["message", "|"]
}
} output { stdout { codec => rubydebug } }

随意输入一串以 | 分隔的字符,比如“123|321|abc|??!”,可以看到如下输出:

||abc|??!
{
"message" => [
[] "",
[] "",
[] "abc",
[] "??!"
],
"@version" => "",
"@timestamp" => "2016-03-12T07:10:26.352Z",
"host" => "centos-linux.shared"
}

-join

仅对数组类型字段有效,我们在之前已经用split割切的基础再join回去。配置改成:

input { stdin { } }

filter {
mutate {
split => ["message", "|"]
}
mutate {
join => ["message", ","]
}
} output { stdout { codec => rubydebug } }

filter区段之内,是顺序执行,我们看到最后的输出结果是:

||abc|??!
{
"message" => "123,321,abc,??!",
"@version" => "",
"@timestamp" => "2016-03-12T07:18:32.835Z",
"host" => "centos-linux.shared"
}

-merge

合并两个数组或者哈希字段。依然在之前的split基础上继续:

input { stdin { } }

filter {
mutate {
split => ["message", "|"]
}
mutate {
merge => ["message", "message"]
}
} output { stdout { codec => rubydebug } }

当我们输入123|321|abc|??!*=123 之后我们会看到输出:

||abc|??!*=
{
"message" => [
[] "",
[] "",
[] "abc",
[] "??!*=123",
[] "",
[] "",
[] "abc",
[] "??!*=123"
],
"@version" => "",
"@timestamp" => "2016-03-12T07:27:34.886Z",
"host" => "centos-linux.shared"
}

如果src字段是字符串,会自动先转换成一个单元素的数组再合并

如果把上一示例中的来源字段改成“host”

运行结果如下所示:

||abc|??!
{
"message" => [
[] "",
[] "",
[] "abc",
[] "??!",
[] "centos-linux.shared"
],
"@version" => "",
"@timestamp" => "2016-03-12T07:32:16.231Z",
"host" => "centos-linux.shared"
}

看到目的字段“message”确实多了一个元素,但是来源字段"host"本身也由字符串变成数组类型了。

字段处理

-rename

顾名思义重命名某个字段,如果目的字段已经存在,会被覆盖掉:

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

-update

更新某个字段的内容。如果字段不存在,不会新建。

-replace

作用和update类似,但是当字段不存在的时候,它会起到add_field 参数一样的,自动添加新的字段。

6.split拆分事件

我们上章通过multiline插件将多行数据合并进一个事件里,那么反过来,也可以把一行数据,拆分成多个事件。这就是split插件。

配置示例:

input { stdin { } }

filter {
split {
field => "message"
terminator => "#"
}
} output { stdout { codec => rubydebug } }

输入fuck#you#man 运行结果如下所示:

fuck#you#man
{
"message" => "fuck",
"@version" => "",
"@timestamp" => "2016-03-12T16:31:05.564Z",
"host" => "centos-linux.shared"
}
{
"message" => "you",
"@version" => "",
"@timestamp" => "2016-03-12T16:31:05.564Z",
"host" => "centos-linux.shared"
}
{
"message" => "man",
"@version" => "",
"@timestamp" => "2016-03-12T16:31:05.564Z",
"host" => "centos-linux.shared"
}

重要提示

split插件中使用的是yield功能,其结果是split 出来的新事件,会直接结束其在filter阶段历程,也就是说写在split后面的其他filter插件都不起作用,进入output阶段。所以,一定要保证split配置写在全部filter配置的最后。

7.保存进Elasticsearch

Logstash可以试用不同的协议实现完成将数据写入Elasticsearch的工作。在不同时期,也有不同的插件实现方式。

P74

**************

elk示例-精简版的更多相关文章

  1. elk示例-精简版2

    作者:Danbo 时间:2016-03-13 1.保存进Elasticsearch Logstash可以试用不同的协议实现完成将数据写入Elasticsearch的工作,本节中介绍HTTP方式. 配置 ...

  2. Linux上oracle精简版客户端快速部署

    RHEL6 + Oracle 11g客户端快速部署 需求:只是用到客户端的sqlplus, sqlldr功能. 方案:用精简版实现客户端的快速部署 1.上传oracle精简版客户端到服务器/tmp目录 ...

  3. Vue精简版风格指南

    前面的话 Vue官网的风格指南按照优先级(依次为必要.强烈推荐.推荐.谨慎使用)分类,且代码间隔较大,不易查询.本文按照类型分类,并对部分示例或解释进行缩减,是Vue风格指南的精简版 组件名称 [组件 ...

  4. SXWIN7X64EN_20181104_NET_msu_LITE英文精简版

    SXWIN7X64EN_20181104_NET_msu_LITE英文精简版该版本为英文精简版!该版本为英文精简版!该版本为英文精简版!一.前言:关于极限精简版的说明 本系统为极限精简版,极限精简版系 ...

  5. SX_WIN10X64LTSB2016_EN_LITE英文精简版

    SX_WIN10X64LTSB2016_EN_LITE英文精简版该版本为英文版!该版本为英文版!该版本为英文版!因为论坛巴基斯坦的maanu兄弟PM我,所以抽空做了一个.介绍沿用原来的,中文用谷歌翻译 ...

  6. WIN10X64_LTSB2016极限精简版by双心

    WIN10X64LTSB2016极限精简版by双心http://www.cnblogs.com/liuzhaoyzz/p/9162113.html 一.前言:关于极限精简版的说明 本系统为极限精简版, ...

  7. WIN7X64SP1极限精简版by双心

     WIN7X64SP1极限精简版by双心 http://bbs.wuyou.net/forum.php?mod=viewthread&tid=405044&page=1&ext ...

  8. Adobe Fireworks CS5 | Adobe Dreamweaver CS5 | Adobe Photoshop CS5 Extended 绿色精简版最新下载地址

    下载地址可能已经不能直接下载,可以用迅雷下载试试 Adobe Photoshop CS5 简体中文绿色版 下载地址:Adobe_Photoshop_CS5_Extended.7z 此绿色版特点:1. ...

  9. WIN10X64LTSC2019中度精简版by双心

    WIN10X64LTSC2019中度精简版by双心https://www.cnblogs.com/liuzhaoyzz/p/11295032.html 一.前言:关于LTSC中度精简版的说明 一个MM ...

随机推荐

  1. 测试用例使用传统excel还是思维导图(Xmind、MindManager等)?

    一.使用感言 实习时随便使用了word文档编写测试用例,也没有人带.后来第一份正式测试工作,也没有人带测试,那时跟着大众学用思维导图写测试用例,发现思维导图非常灵活.目前使用xmind. 使用思维导图 ...

  2. 【已解决】iView-admin Editor 组件 绑定默认值问题

    iView-admin Editor 组件 绑定默认值问题 发现 editor 组件,设置v-model 后, 修改 v-model 数据, editor组件没有自动渲染,需要手动设置渲染  this ...

  3. PHP利用GD库绘图和生成验证码图片

    首先得确定php.ini设置有没有打开GD扩展功能,測试例如以下 print_r(gd_info()); 假设有打印出内容例如以下,则说明GD功能有打开: Array ( [GD Version] = ...

  4. HttpClient远程调用接口

    详细参考这个博文:http://www.cnblogs.com/itliucheng/p/5065619.html 一.get请求: //关键代码就这几行 String urlNameString = ...

  5. lua学习笔记(八)

      元表与元方法  基本概念         1.lua中每个值都有一个元表         2.table和userdata可以有各自独立的元表         3.其它类型的值共享其类型所属的单一 ...

  6. 解决 三星Note3 桌面小部件不实时更新/不刷新 的问题

    机型及问题描述:我的是三星note3 (国行 SM-N9008V),已ROOT,安装了LBE安全大师.在桌面小部件中,有些不会实时更新.比如有 滴答清单(办过的事项无法勾选),百度云音乐(歌曲播放更新 ...

  7. iOS中三种方式实现登录界面播放视频或gif效果

    现在app都做的越来越炫酷,各种动画效果,各种特效很好的提高了用户的体验.很多app在登录界面都使用了动画效果,比如Uber,Keep,QQ等等.这些动画效果基本都是使用gif或者MP4来实现的. 效 ...

  8. 【转】【Python学习】之哪些 Python 库让你相见恨晚?

    感谢作者:赖明星 文章链接地址:<哪些 Python 库让你相见恨晚?>

  9. 多媒体开发之视频格式---1080p逐行和1080i隔行

    (1)简介 (2)1080p和1080i的区别 (3) ------------------autho:pkf ----------------------time:2015-1-4 (1)简介 (2 ...

  10. 同步与异步区别,Invoke与BeginInoke的区别

    先说同步与异步的区别,总说同步异步的,其实一直不清楚什么是同步异步,今天找了一下: 同步:当一个消息发送后,等对方回应后继续发送下一条指令. 异步:当一个消息发送后,不等对方回应就发送下一条. 同步, ...