ELK日志分析系统(原创)
一、简介
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的地图功能进行定位并显示。
这是作者在工作中的实践总结,原创,转载需注明出处。