标签归档:Logstash

logstash filters/grok 插件

GROK在线调试:http://grokdebug.herokuapp.com/
Grok 是 Logstash 最重要的插件,对于一些格式不规范的日志,可以通过正则自定义输出字段。
对于下面这条日志:
55.3.244.1 GET /index.html 15824 0.043
可以这样解析:

filter {
grok {
match=>{ "message"=>"%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" }
}
}

得到的结果为:

[root@server120 log]# /opt/logstash/bin/logstash -f /opt/logstash/etc/test.conf
Settings: Default pipeline workers: 8
Pipeline main started
{
"message" => "55.3.244.1 GET /index.html 15824 0.043",
"@version" => "1",
"@timestamp" => "2016-07-12T08:03:57.423Z",
"path" => "/tmp/log/2016-7-11.log",
"host" => "0.0.0.0",
"client" => "55.3.244.1",
"method" => "GET",
"request" => "/index.html",
"bytes" => "15824",
"duration" => "0.043"
}

grok提供了哪些SYNTAX?可以查看文件grok-patterns,它默认放在路径/usr/local/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-0.3.0/patterns下。
例如上面例子中的IP正则,我们把patterns下的所有文件合并输出到一个文件中,然后查找下IP,如下所示:

IPV6 ((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?
IPV4 (?<![0-9])(?:(?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])[.](?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])[.](?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])[.](?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5]))(?![0-9])
IP (?:%{IPV6}|%{IPV4})

可以看到IP包括了IPV4和IPV6的正则。
WORD的正则:
WORD \b\w+\b

假设现在要匹配一个正则表达式为regexp的字符串,而grok预定义的SYNTAX都不满足,也可以自己定义一个SYNTAX

自定义SYNTAX 方式有两种:
(1)匿名SYNTAX
将%{SYNTAX:SEMANTIC} 写为(?<SEMANTIC>regexp)
(2)命名SYNTAX
在dir下创建一个文件,文件名随意
将dir加入grok路径: patterns_dir => “./dir”
将想要增加的SYNTAX写入: SYNTAX_NAME regexp
使用方法和使用默认SYNTAX相同:%{SYNTAX_NAME:SEMANTIC}

另外如果你把 “message” 里所有的信息都 grok 到不同的字段了,数据实质上就相当于是重复存储了两份。所以你可以用 remove_field 参数来删除掉 message 字段只保留最重要的部分。
filter {
grok {
patterns_dir => “/path/to/your/own/patterns”
match => {
“message” => “%{SYSLOGBASE} %{DATA:message}”
}
overwrite => [“message”]
}
}
我们来找一条Nginx的日志,如下所示:
223.117.212.182 – – [09/Jul/2016:23:58:52 +0800] “GET /ssl.gif HTTP/1.1” 200 43 “http://www.xxoo.com/” “Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0)”
那么匹配的正则如下:

grok {
match=>{ "message"=>"%{IPORHOST:client} (%{USER:ident}|-) (%{USER:auth}|-) \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:http_version})?|-)\" %{NUMBER:response} %{NUMBER:bytes} \"(%{GREEDYDATA:referrer}|-)\" \"(%{GREEDYDATA:agent}|-)\"" }
}

需要注意的是符号” [ ]都需要转义。

logstash input/file插件使用详解

这个插件可以从指定的目录或者文件读取内容,输入到管道处理,也算是logstash的核心插件了,大多数的使用场景都会用到这个插件。

input {
    file {
        #监听文件的路径,默认不支持目录的递归,即目录中还有文件是不支持直接读取的,但是可以使用*/*进行匹配。
        path => [“E:/software/logstash-1.5.4/logstash-1.5.4/data/*”,”F:/test.txt”]
        #不想监听的文件,logstash会自动忽略该文件的监听。配置的规则与path类似,支持字符串或者数组,但是要求必须是绝对路径。
        exclude => "1.log"
        
        #添加自定义的字段
        add_field => {"test"=>"test"}
        #增加标签
        tags => "tag1"

        #设置新事件的标志
        delimiter => "\n"

        #设置多长时间扫描目录,发现新文件
        discover_interval => 15
        #设置多长时间检测文件是否修改
        stat_interval => 1

         #是监听的位置,默认是end,即一个文件如果没有记录它的读取信息,则从文件的末尾开始读取,也就是说,仅仅读取新添加的内容。对于一些更新的日志类型的监听,通常直接使用end就可以了;相反,beginning就会从一个文件的头开始读取。但是如果记录过文件的读取信息,这个配置也就失去作用了。
        start_position => beginning

        #这个选项配置了默认的读取文件信息记录在哪个文件中,默认是按照文件的inode等信息自动生成。其中记录了inode、主设备号、次设备号以及读取的位置。因此,如果一个文件仅仅是重命名,那么它的inode以及其他信息就不会改变,因此也不会重新读取文件的任何信息。类似的,如果复制了一个文件,就相当于创建了一个新的inode,如果监听的是一个目录,就会读取该文件的所有信息。
        sincedb_path => "E:/software/logstash-1.5.4/logstash-1.5.4/test.txt"
        #默认存储在:
[root@server120 ~]# locate *sincedb*
/root/.sincedb_15940cad53dd1d99808eeaecd6f6ad3f
/root/.sincedb_1f4cbbb2df53dc0623016829429f0b84
        #设置多长时间会写入读取的位置信息
        sincedb_write_interval => 15
        
    }
}

CentOS下ELK安装部署

下载地址:https://www.elastic.co/downloads
1)JDK

yum -y install java-1.7.0-openjdk*
[root@server120 elasticsearch]# java -version
java version "1.7.0_101"
OpenJDK Runtime Environment (rhel-2.6.6.4.el6_8-x86_64 u101-b00)
OpenJDK 64-Bit Server VM (build 24.95-b01, mixed mode)

2)ElasticSearch
ElasticSearch是一个基于Lucene构建的开源,分布式,RESTful搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。支持通过HTTP使用JSON进行数据索引。

[root@server120 opt]# wget https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/tar/elasticsearch/2.3.3/elasticsearch-2.3.3.tar.gz
[root@server120 opt]# tar zxvf elasticsearch-2.3.3.tar.gz
[root@server120 opt]# mv elasticsearch-2.3.3/ elasticsearch/

因为在2.x版本强调了安全性,不允许root账户启动,这里是测试,我们修改一下配置文件,然后root启动。
在bin目录修改elasticsearch.in.sh文件,添加如下配置项:

JAVA_OPTS="$JAVA_OPTS -Des.insecure.allow.root=true"

当然强烈不推荐root账户运行。

[vincent@server120 elasticsearch]$ ./bin/elasticsearch

使用 ./bin/elasticsearch -d后台启动

[root@server120 opt]# curl http://localhost:9200
{
"name" : "Postmortem",
"cluster_name" : "elasticsearch",
"version" : {
"number" : "2.3.3",
"build_hash" : "218bdf10790eef486ff2c41a3df5cfa32dadcfde",
"build_timestamp" : "2016-05-17T15:40:04Z",
"build_snapshot" : false,
"lucene_version" : "5.5.0"
},
"tagline" : "You Know, for Search"
}

3)Logstash
Logstash是一款轻量级的日志搜集处理框架,可以方便的把分散的、多样化的日志搜集起来,并进行自定义的处理,然后传输到指定的位置。

[root@server120 opt]# wget https://download.elastic.co/logstash/logstash/logstash-2.3.3.tar.gz
[root@server120 opt]# tar zxvf logstash-2.3.3.tar.gz
[root@server120 opt]# mv logstash-2.3.3 logstash

使用-e 参数,该参数允许Logstash直接通过命令行接受设置。测试一下:

[root@server120 opt]# ./logstash/bin/logstash -e 'input{stdin{}}output{stdout{codec=>rubydebug}}'
hello world
Settings: Default pipeline workers: 8
Pipeline main started
{
"message" => "hello world",
"@version" => "1",
"@timestamp" => "2016-07-06T02:51:14.091Z",
"host" => "0.0.0.0"
}

创建配置文件,将内容写入到ElasticSearch。

[root@server120 opt]# mkdir logstash/etc/
[root@server120 opt]# vim logstash/etc/test.conf
input {
stdin {
type => "human"
}
}

output {
stdout {
codec => rubydebug
}

elasticsearch {
hosts => "127.0.0.1:9200"
}
}
[root@server120 opt]# ./logstash/bin/logstash -f logstash/etc/test.conf

然后我们输入hello
4)Kibana
Kibana 是一个为 Logstash 和 ElasticSearch 提供的日志分析的 Web 接口。可使用它对日志进行高效的搜索、可视化、分析等各种操作。

[root@server120 opt]# wget https://download.elastic.co/kibana/kibana/kibana-4.5.1-linux-x64.tar.gz
[root@server120 kibana]# tar zxvf kibana-4.5.1-linux-x64.tar.gz
[root@server120 opt]# mv kibana-4.5.1-linux-x64 kibana
[root@server120 opt]# vim kibana/config/kibana.yml

将该行的注释去掉

elasticsearch.url: "http://localhost:9200"

修改ElasticSearch的配置文件,追加一行内容

[root@server120 opt]# vim /opt/elasticsearch/config/elasticsearch.yml
http.cors.enabled: true

重启ElasticSearch服务。

[root@server120 opt]# ./kibana/bin/kibana
log [09:18:17.785] [info][status][plugin:kibana] Status changed from uninitialized to green - Ready
log [09:18:17.828] [info][status][plugin:elasticsearch] Status changed from uninitialized to yellow - Waiting for Elasticsearch
log [09:18:17.845] [info][status][plugin:kbn_vislib_vis_types] Status changed from uninitialized to green - Ready
log [09:18:17.851] [info][status][plugin:markdown_vis] Status changed from uninitialized to green - Ready
log [09:18:17.861] [info][status][plugin:metric_vis] Status changed from uninitialized to green - Ready
log [09:18:17.880] [info][status][plugin:spyModes] Status changed from uninitialized to green - Ready
log [09:18:17.885] [info][status][plugin:statusPage] Status changed from uninitialized to green - Ready
log [09:18:17.894] [info][status][plugin:table_vis] Status changed from uninitialized to green - Ready
log [09:18:17.931] [info][listening] Server running at http://0.0.0.0:5601
log [09:18:22.960] [info][status][plugin:elasticsearch] Status changed from yellow to yellow - No existing Kibana index found
log [09:18:26.541] [info][status][plugin:elasticsearch] Status changed from yellow to green - Kibana index ready