ELK日志分析系统(原创)

不羁的心 提交于 2019-12-21 03:59:49

一、简介

ELK由Elasticsearch、Logstash和Kibana三部分组件组成;

Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。

Logstash是一个完全开源的工具,它可以对你的日志进行收集、分析,并将其存储供以后使用

kibana 是一个开源和免费的工具,它可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助您汇总、分析和搜索重要数据日志。

 

二、工作流程

在需要收集日志的服务器(本文用nginx服务器,地址为192.168.5.148)上部署logstash,用于监控并过滤收集日志,将过滤后的内容按照特定的格式收集在一起交给全文搜索服务ElasticSearch,可以用ElasticSearch进行自定义搜索通过Kibana 来结合自定义搜索进行页面展示。

 

三、ELK帮助手册

ELK官网:https://www.elastic.co/

ELK官网文档:https://www.elastic.co/guide/index.html

ELK中文手册:http://kibana.logstash.es/content/elasticsearch/monitor/logging.html

视频教程:http://edu.51cto.com/index.php?do=lession&id=101607

 

四、安装平台以及软件

运行平台:Ubuntu 14.04 32位系统

软件:Logstash-5.1.2、Elasticsearch-5.1.2、kibana-5.1.2

软件安装命令: 在下载的三个组件,解压后,在各自的目录下的bin目录中,运行各自的执行文件即可。

注意: Logstash的运行方式为:./bin/logstash -f ./脚本配置文件

elasticsearch要在普通用户下运行,在root下运行系统会报错。如果在普通用户下提示运行权限问题,只要设置下可执行权限即可。命令:chown 普通用户名.普通用户名 elasticsearch文件夹名 -R

 

五、具体流程

1、首先运行nginx,确保nginx服务能够正常运行,如果不能,开启nginx即可 (etc/init.d/nginx start)。输入服务器ip地址,如果出现欢迎界面,即表示nginx服务器正常运行。

2、改变nginx日志保存格式,便于后面Logstash分析、过滤从而以特定的格式输出。

打开/etc/nginx/nginx.conf,在http段中插入如下内容把nginx日志格式保存为特定格式

log_format logstash_json '{"@timestamp":"$time_iso8601",'

'"client_ip":"$remote_addr",'

'"remote_user":"$remote_user",'

'"body_bytes_sent":"$body_bytes_sent",'

'"request_time":"$request_time",'

'"status":"$status",'

'"request":"$request",'

'"request_method":"$request_method",'

'"http_referrer":"$http_referer",'

'"body_bytes_sent":"$body_bytes_sent",'

'"http_x_forwarded_for":"$http_x_forwarded_for",'

'"http_user_agent":"$http_user_agent"}';

 

access_log /var/log/nginx/access.log logstash_json;

 

3、在logstash 目录下新建一个目录,用来存放logstash执行的脚本。脚本示例如下:

input {

file {

path => ["/var/log/nginx/access.log"]

start_position => "beginning"

type => "nginx"

codec => "json"

}

}

 

 

output {

stdout { codec => rubydebug{} }

elasticsearch {

hosts => ["192.168.5.148:9200"]

index => "logstash-%{+YYYY.MM.dd}"

}

}

 

如上脚本可以把nginx日志按照json格式输出,并存储到elasticsearch,然后传给kibana显示分析。

logstash过滤nginx日志按照json格式输出原理:客户端访问nginx服务器,nginx服务器会自动产生访问日志保存到nginx服务器的access.log中,当我们给nginx服务器的日志设置了json格式后,logstash的file{}插件才能够识别nginx日志并按照json格式切割(解析)输出。

 

 

4、运行顺序:

nginx——>elasticsearch——>logstash——>kibana

运行成功的标志是elk三个组建均会阻塞。

然后刷新一下192.168.5.148这个地址,也即访问nginx服务器,即可产生数据.

 

5、kibana使用

在浏览器(用火狐或者google chrome,不要用360浏览器)地址栏输入 服务器地址:5601,即可访问Kibana主页。

如果以上步骤都没问题,kibana就会接受到elasticsearch传给它的数据并显示出来,如下图,如果没有数据产生,那么就会提示”no result”。

 

 

接下来,点击左侧”visualize”模块,选择“create new visualization”,选择一个视图显示数据分析图标。以饼图为例。选择“pipe chart”,进入饼图界面,在”buckets”下面选择过滤条件。

其中aggregation,下拉选择“Terms”,field,下拉选择“client_ip”,点击“apply changes”按钮,即可按照过滤规则生成饼状图。

其他分析图表(柱状图、曲线图)都有类似的设置。

 

6、kibana tile map地图定位功能。

1、所具备的工具:logstash的filter.geoip{}插件、GeoLite2-City.mmdb城市ip数据库。

2、修改第五步中第3点logstash的执行脚本,增加filter.geoip()插件。

示例如下:(相关附件也已同步)

input {

file {

path => ["/var/log/nginx/access.log"]

start_position => "beginning"

type => "nginx"

codec => "json"

}

}

 

filter {

geoip {

source => “client_ip” ------”client_ip”为日志中的ip地址字段名

database => “GeoLite2-City.mmdb的绝对路径”

target => “geoip”

add_field => [ “[geoip][coordinates]”, “%[geoip][longitude]” ]

add_field => [ “[geoip][coordinates]”,”%[geoip][latitude]” ]

}

mutate [

convert => [ “[geoip][coordinates]”,”float” ]

}

}

 

output {

stdout { codec => rubydebug{} }

elasticsearch {

hosts => ["192.168.5.148:9200"]

index => "logstash-%{+YYYY.MM.dd}"

}

}

 

3、由于GeoLite2-City.mmdb只存有外网ip的地址,因此用内网Ip测试geoip无法解析,会造成失败。因此,可以在nginx日志中手动添加外网Ip地址,只有外网ip地址geoip才能解析成功。

 

4、重新启动kibana,在visualize模块中选择tile map,进入tile map界面,然后Aggregation选择Geohash,Field选择geoip.location,点击Apply changes即可在右边的地图界面,亮点标示ip地址对应的城市。

 

5、geoip解析日志中的ip地址并定位城市的原理:GeoLite2-City.mmdb是一个大型的ip数据库,内含ip地址及其对应的城市名。geoip插件会根据json解析出来的日志中的ip地址,去GeoLite2-City.mmdb中寻找对应的ip地址,然后把ip地址对应的一系列包括城市名、国家等等信息给解析出来,然后一并发给elasticsearch,最后通过kibana的地图功能进行定位并显示。

 

 

这是作者在工作中的实践总结,原创,转载需注明出处。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!