初探ELK-logstash使用小结

2016/9/12

【写在前言】

说起处理日志的手段,大家或多或少都听说过ELK(elasticsearch+logstash+kibana),怎么入门呢?咱们从一个小小的目标开始。

目标:收集nginx日志,集中展示。

不少人对 ELK 的第一印象,容易觉得它这个工具组合似乎挺难上手的,错!只需动手试试就知道啦!

目标分解:

1)熟悉 logstash 的安装和基本操作

2)熟悉 elasticsearch 的安装和基本操作,然后结合 logstash 使用

3)熟悉 kibana 的安装和基本操作,然后结合 elasticsearch 使用

本文主要是带你进入 logstash 的世界,其余内容请参考相关文章(elasticsearch使用小结,kibana使用小结)。

一、安装
1、jdk 和 环境变量
支持jdk-1.7以上,推荐jdk-1.8
在环境变量配置:JAVA_HOME

2、安装
有2种方式下载,推荐缓存rpm包到本地yum源
1)直接使用rpm
wget https://download.elastic.co/logstash/logstash/packages/centos/logstash-2.4.0.noarch.rpm

2)使用yum源
[[email protected] ~]# rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
[[email protected] ~]# vim /etc/yum.repos.d/logstash.repo
[logstash-2.4]
name=Logstash repository for 2.4.x packages
baseurl=https://packages.elastic.co/logstash/2.4/centos
gpgcheck=1
gpgkey=https://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1

[[email protected] ~]# yum install logstash
[[email protected] ~]# whereis logstash
logstash: /etc/logstash /opt/logstash/bin/logstash /opt/logstash/bin/logstash.bat

二、使用
1、命令行测试
[[email protected] ~]# /opt/logstash/bin/logstash -e ‘input { stdin { } } output { stdout {} }‘
hi, let us go(输入)
Settings: Default pipeline workers: 4
Pipeline main started
2016-09-12T02:42:59.110Z 0.0.0.0 hi, let us go(输出)
why not TRY IT OUT(输入)
2016-09-12T02:43:11.904Z 0.0.0.0 why not TRY IT OUT(输出)

(CTRL-D 退出)
Pipeline main has been shutdown
stopping pipeline {:id=>"main"}

2、使用配置文件
目的:从日志文件中读取数据,输出到另一个文件中来查看。
前提:已经配置了一个nginx服务,生成了以下日志文件:
]# ls /var/log/nginx/
access.log  access_www.test.com_80.log  error.log  error_www.test.com_80.log

首先,我们尝试这样配置 logstash 来收集日志:
[[email protected] ~]# cat /etc/logstash/conf.d/nginx.conf 
input {
    file {
        path => "/var/log/nginx/access_*.log"
        start_position => beginning 
        ignore_older => 0 
    }
}

filter {
    grok {
        match => { "message" => "%{COMBINEDAPACHELOG}"}
    }
}

output {
    file {
        path => "/tmp/test.log"
    }
}

上面使用到以下插件:
file:日志数据的输入和输出
grok:来匹配标准的apache日志格式

【细节延伸】
显然,在3个环节)中,都有改进和调整的地方。
input:使用 filebeat
filter:使用其他插件和规则
output:使用ES,redis等
具体请参考:
https://www.elastic.co/guide/en/logstash/current/pipeline.html

3、测试配置文件:
[[email protected] ~]# service logstash configtest
Configuration OK

4、启动服务:
[[email protected] ~]# service logstash start

5、测试请求nginx服务,然后观察输出的内容:
[[email protected] ~]# cat /tmp/test.log

符合预期。

6、比较
去掉 filter 这一节,我们来对比一下 /tmp/test.log 收集到的内容的差异

【使用了 filter 的结果a】
{"message":"10.50.200.219 - - [12/Sep/2016:13:00:03 +0800] \"GET / HTTP/1.1\" 200 13 \"-\" \"curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2\" \"-\" 0.000 \"-\" \"-\"","@version":"1","@timestamp":"2016-09-12T05:00:04.140Z","path":"/var/log/nginx/access_www.test.com_80.log","host":"0.0.0.0","clientip":"10.50.200.219","ident":"-","auth":"-","timestamp":"12/Sep/2016:13:00:03 +0800","verb":"GET","request":"/","httpversion":"1.1","response":"200","bytes":"13","referrer":"\"-\"","agent":"\"curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2\""}

【未使用 filter 的结果b】
{"message":"10.50.200.219 - - [12/Sep/2016:13:07:49 +0800] \"GET / HTTP/1.1\" 200 13 \"-\" \"curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2\" \"-\" 0.000 \"-\" \"-\"","@version":"1","@timestamp":"2016-09-12T05:07:49.917Z","path":"/var/log/nginx/access_www.test.com_80.log","host":"0.0.0.0"}

a的内容中,多出来的地方,正是使用了 grok 分析和结构化数据
---------------------------------------------------
Information	              Field Name
-----------               ----------
IP Address                clientip
User ID                   ident
User Authentication	      auth
timestamp	      	      timestamp
HTTP Verb	      	      verb
Request body	      	  request
HTTP Version	          httpversion
HTTP Status Code	      response
Bytes served	          bytes
Referrer URL	          referrer
User agent	              agent
---------------------------------------------------

7、改进
Logstash 默认自带了 apache 标准日志的 grok 正则:
如何使用自定义的日志格式呢?
例如,默认的 nginx 日志是:
    log_format  main  ‘$remote_addr - $remote_user [$time_local] "$request" ‘
                      ‘$status $body_bytes_sent "$http_referer" ‘
                      ‘"$http_user_agent" "$http_x_forwarded_for"‘;

改成自定义的日志格式:
                      
    log_format  online ‘$remote_addr [$time_local] "$request" ‘
                   ‘"$http_content_type" "$request_body" "$http_referer" ‘
                   ‘$status $request_time $body_bytes_sent‘;
                   
对应的数据:
【GET】# curl -H "Content-Type: text/html; charset=UTF-8" --referer ‘www.abc.com/this_is_a_referer‘ http://www.test.com/a/b/c.html?key1=value1
【结果】10.50.200.219 [12/Sep/2016:15:11:04 +0800] "GET /a/b/c.html?key1=value1 HTTP/1.1" "text/html; charset=UTF-8" "-" "www.abc.com/this_is_a_referer" 404 0.000 168

【POST】# curl -H "Content-Type: application/xml" -d "{"name": "Mark Lee" }" "http://www.test.com/start"
【结果】10.50.200.218 [12/Sep/2016:15:02:07 +0800] "POST /start HTTP/1.1" "application/xml" "-" "-" 404 0.000 168

尝试一下:
[[email protected] ~]# mkdir -p /etc/logstash/patterns.d
[[email protected] ~]# vim /etc/logstash/patterns.d/extra_patterns
NGINXACCESS %{IPORHOST:clientip} \[%{HTTPDATE:timestamp}\] "%{WORD:verb} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}" (?:%{QS:content_type}|-) (?:%{QS:request_body}|-) (?:"(?:%{URI:referrer}|-)"|%{QS:referrer}) %{NUMBER:response} %{BASE16FLOAT:request_time} (?:%{NUMBER:bytes}|-)

调整配置为:
[[email protected] ~]# cat /etc/logstash/conf.d/nginx.conf 
input {
    file {
        path => "/var/log/nginx/access_*.log"
        start_position => beginning
        ignore_older => 0
    }
}

filter {
    grok {
        patterns_dir => ["/etc/logstash/patterns.d"]
        match => {
            "message" => "%{NGINXACCESS}"
        }
    }
}

output {
    file {
        path => "/tmp/test.log"
    }
}

[[email protected] ~]# service logstash restart
结果:
{"message":"10.50.200.218 [12/Sep/2016:15:28:23 +0800] \"POST /start HTTP/1.1\" \"application/xml\" \"-\" \"-\" 404 0.000 168","@version":"1","@timestamp":"2016-09-12T07:28:24.007Z","path":"/var/log/nginx/access_www.test.com_80.log","host":"0.0.0.0","clientip":"10.50.200.218","timestamp":"12/Sep/2016:15:28:23 +0800","verb":"POST","request":"/start","httpversion":"1.1","content_type":"\"application/xml\"","request_body":"\"-\"","response":"404","request_time":"0.000","bytes":"168"}

{"message":"10.50.200.219 [12/Sep/2016:15:28:24 +0800] \"GET /a/b/c.html?key1=value1 HTTP/1.1\" \"text/html; charset=UTF-8\" \"-\" \"www.abc.com/this_is_a_referer\" 404 0.000 168","@version":"1","@timestamp":"2016-09-12T07:28:25.019Z","path":"/var/log/nginx/access_www.test.com_80.log","host":"0.0.0.0","clientip":"10.50.200.219","timestamp":"12/Sep/2016:15:28:24 +0800","verb":"GET","request":"/a/b/c.html?key1=value1","httpversion":"1.1","content_type":"\"text/html; charset=UTF-8\"","request_body":"\"-\"","referrer":"\"www.abc.com/this_is_a_referer\"","response":"404","request_time":"0.000","bytes":"168"}

符合预期。

三、输出到 redis+elasticsearch+kibana
1、测试环境(已经部署了服务)
【客户端】10.50.200.49: logstash, nginx(www.test.com, www.work.com)
【服务端】10.50.200.220: logstash, redis, elasticsearch, kibana
【测试端】10.50.200.218, 10.50.200.219: curl 请求 nginx
[[email protected] ~]# for i in `seq 1 5000`;do curl -H "Content-Type: application/xml" -d "{"name": "York vm218" }" "http://www.test.com/this_is_vm218";sleep 1s;done
[[email protected] ~]# for i in `seq 1 5000`;do curl -H "Content-Type: text/html; charset=UTF-8" --referer ‘www.vm219.com/referer_here‘ http://www.test.com/a/b/c.html?key1=value1;sleep 1s;done

hosts文件:
10.50.200.49 www.test.com
10.50.200.49 www.work.com

2、单域名场景
目的:将 www.test.com 的 access 日志收集起来集中展示
【客户端】
输入:file
输出:redis

[[email protected] ~]# cat /etc/logstash/conf.d/nginx.conf 
input {
    file {
        type => "nginx_access"
        path => "/var/log/nginx/access_*.log"
        start_position => beginning
        ignore_older => 0
    }
}

filter {
    if[type] == "nginx_access" {
        grok {
            patterns_dir => ["/etc/logstash/patterns.d"]
            match => {
                "message" => "%{NGINXACCESS}"
            }
        }
    }
}

output {
    if[type] == "nginx_access" {
        redis {
            host => "10.50.200.220"
            data_type => "list"
            key => "logstash:redis:nginxaccess"
        }
    }
}
[[email protected] ~]# service logstash restart

【服务端】
输入:redis
输出:elasticsearch

[[email protected] ~]# vim /etc/logstash/conf.d/redis.conf
input {
    redis {
        host => ‘127.0.0.1‘
        data_type => ‘list‘
        port => "6379"
        key => ‘logstash:redis:nginxaccess‘
        type => ‘redis-input‘
    }
}

output {
    if[type] == "nginx_access" {
        elasticsearch {
            hosts => "127.0.0.1:9200"
            index => "nginxaccess-%{+YYYY.MM.dd}"
        }
    }
}
[[email protected] ~]# service logstash restart

可以通过命令行去观察 redis 的状态:
[[email protected] ~]# redis-cli monitor

结果:符合预期。

3、多域名场景
目的:将 www.test.com 和 www.work.com 的 access 日志收集起来集中展示
【客户端】
输入:file
输出:redis

[[email protected] ~]# cat /etc/logstash/conf.d/nginx.conf 
input {
    file {
        type => "nginx_access_www.test.com"
        path => "/var/log/nginx/access_www.test.com*.log"
        start_position => beginning
        ignore_older => 0
    }
    file {
        type => "nginx_access_www.work.com"
        path => "/var/log/nginx/access_www.work.com*.log"
        start_position => beginning
        ignore_older => 0
    }
}

filter {
    if[type] =~ "nginx_access" {
        grok {
            patterns_dir => ["/etc/logstash/patterns.d"]
            match => {
                "message" => "%{NGINXACCESS}"
            }
        }
    }
}

output {
    if[type] =~ "nginx_access" {
        redis {
            host => "10.50.200.220"
            data_type => "list"
            key => "logstash:redis:nginxaccess"
        }
    }
}
[[email protected] ~]# service logstash restart

【服务端】
输入:redis
输出:elasticsearch

[[email protected] ~]# vim /etc/logstash/conf.d/redis.conf
input {
    redis {
        host => ‘127.0.0.1‘
        data_type => ‘list‘
        port => "6379"
        key => ‘logstash:redis:nginxaccess‘
        type => ‘redis-input‘
    }
}

output {
    if[type] == "nginx_access_www.test.com" {
        elasticsearch {
            hosts => "127.0.0.1:9200"
            index => "nginxaccess-www.test.com-%{+YYYY.MM.dd}"
        }
    } else if[type] == "nginx_access_www.work.com" {
        elasticsearch {
            hosts => "127.0.0.1:9200"
            index => "nginxaccess-www.work.com-%{+YYYY.MM.dd}"
        }
    }

}
[[email protected] ~]# service logstash restart

当然了,要调整kibana的索引名称。

结果:符合预期。

四、小结
1、数据流向
------------------------------------------------------------------
log_files  ->  logstash  ->  redis  ->  elasticsearch  ->  kibana
------------------------------------------------------------------

2、TODO
1)filebeat 的使用
2)redis 是否被替换? 
3)Elasticsearch索引数据的清理
4)kibana的权限
5)ELK的性能和监控

ZYXW、参考
1、官网
https://www.elastic.co/guide/en/logstash/current/introduction.html
https://www.elastic.co/guide/en/logstash/current/getting-started-with-logstash.html
https://www.elastic.co/guide/en/logstash/current/installing-logstash.html
https://www.elastic.co/guide/en/logstash/current/first-event.html
https://www.elastic.co/guide/en/logstash/current/advanced-pipeline.html
https://www.elastic.co/guide/en/logstash/current/pipeline.html
https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html
2、ELK中文
http://kibana.logstash.es/content/
http://kibana.logstash.es/content/beats/file.html
3、用ELK搭建简单的日志收集分析系统
http://blog.csdn.net/lzw_2006/article/details/51280058
时间: 2024-07-31 14:32:42

初探ELK-logstash使用小结的相关文章

ELK logstash 处理MySQL慢查询日志(初步)

写在前面:在做ELK logstash 处理MySQL慢查询日志的时候出现的问题: 1.测试数据库没有慢日志,所以没有日志信息,导致 IP:9200/_plugin/head/界面异常(忽然出现日志数据,删除索引后就消失了) 2.处理日志脚本问题 3.目前单节点 配置脚本文件/usr/local/logstash-2.3.0/config/slowlog.conf[详细脚本文件见最后] output { elasticsearch { hosts => "115.28.3.150:9200

ELK——Logstash 2.2 date 插件【翻译+实践】

官网地址 本文内容 语法 测试数据 可配置选项 参考资料 date 插件是日期插件,这个插件,常用而重要. 如果不用 date 插件,那么 Logstash 将处理时间作为时间戳.时间戳字段是 Logstash 自己添加的内置字段 @timestamp,在ES中关于时间的相关查询,必须使用该字段,你当然也可以修改该字段的值. 语法 该插件必须是用 date 包裹,如下所示: date { } 可用的配置选项如下表所示: 设置 输入类型 是否为必填 默认值 add_field hash No {}

ELK logstash邮件报警

input {    beats {      type => beats      port => 5089    }}filter {        multiline {                pattern => ".*#ELK#.*"                negate => true                what => "previous"        }            grok {  

初探 ELK - 每天5分钟玩转 Docker 容器技术(89)

在开源的日志管理方案中,最出名的莫过于 ELK 了.ELK 是三个软件的合称:Elasticsearch.Logstash.Kibana. Elasticsearch一个近乎实时查询的全文搜索引擎.Elasticsearch 的设计目标就是要能够处理和搜索巨量的日志数据. Logstash读取原始日志,并对其进行分析和过滤,然后将其转发给其他组件(比如 Elasticsearch)进行索引或存储.Logstash 支持丰富的 Input 和 Output 类型,能够处理各种应用的日志. Kiba

B/S初探之XML学习小结

XML 可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言. 近年来,随着 Web的应用越来越广泛和深入,人们渐渐觉得HTML不够用了,HTML过于简单的语法严重地阻碍了用它来表现复杂的形式.尽管HTML推出了一个又一个新版本,已经有了脚本.表格.帧等表达功能,但始终满足不了不断增长的需求. 有人建议直接使用SGML 作为Web语言,这固然能解决HTML遇到的困难.但是SGML太庞大了,用户学习和使用不方便尚且不说,要全面实现SGML的浏览器就非常困难,于是自

elk logstash中修改index

可以使用命令直接定义 input { udp { ... type => "foo" } file { ... type => "bar" } } output { if [type] == "foo" { elasticsearch { ... index => "foo-index" } } else { elasticsearch { ... index => "bar-index&qu

ELK 架构之 Logstash 和 Filebeat 安装配置

上一篇:ELK 架构之 Elasticsearch 和 Kibana 安装配置 阅读目录: 1. 环境准备 2. 安装 Logstash 3. 配置 Logstash 4. Logstash 采集的日志数据,在 Kibana 中显示 5. 安装配置 Filebeat 6. Filebeat 采集的日志数据,在 Kibana 中显示 7. Filebeat 采集日志数据,Logstash 过滤 8. Filebeat 采集的日志数据,Logstash 过滤后,在 Kibana 中显示 上一篇主要说

logstash filter plugin

1. 基本语法%{NUMBER:duration} %{IP:client} 2. 支持的数据类型默认会把所有的匹配都当作字符串,比如0.043, 想要转成浮点数,可以%{NUMBER:num:float}匹配,目前只支持int和float两种. 3. 举例说明有下面一段http日志:55.3.244.1 GET /index.html 15824 0.043 匹配模式:%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:by

ELK的安装配置使用

ELK的安装配置 一.ES集群的安装: 搭建ElasticSearch集群: 使用三台服务器搭建集群 node-1(主节点) 10.170.13.1 node-2(从节点) 10.116.35.133 node-3(从节点) 10.44.79.57 下载安装包 地址:https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.4.3.rpm 在三台服务器上分别下载安装elasticsearch-5.4.3.rpm 安装

搭建elk server通过rsyslog展示nginx和php日志

一.系统和所需软件版本介绍 系统版本:centos 6.5 64位 软件版本:jdk-8u60-linux-x64.tar.gz.elasticsearch-2.4.2.tar.gz.logstash-2.4.1.tar.gz.kibana-4.6.3-linux-x86_64.tar.gz 二.安装java环境 1)解压jdk软件压缩包. tar -zxvf jdk-8u60-linux-x64.tar.gz 2)在/etc/profile文件的最后边,添加下边这几行,设置一下环境变量. ex