1.使用的软件
我们这里用到的是filebeat+elk(elasticsearch+logstash+kibana)来进行系统日志的收集。filebeat安装在各个服务器中,Logstash+ElasticSearch+Kibana安装在一台专门用于基础服务的服务器上。
其架构如下2.各软件说明
2.1 filebeat
Filebeat是一个轻量级的托运人,用于转发和集中日志数据. Filebeat作为代理安装在服务器上,监视您指定的日志文件或位置,收集日志事件,并将它们转发到ElasticSearch或Logstash进行索引.
官方中文文档:https://s0www0elastic0co.icopy.site/guide/en/beats/filebeat/current/index.html
2.2 Logstash
Logstash是一个开源的服务器端数据处理管道,可以同时从多个数据源获取数据,并对其进行转换,然后将其发送到你最喜欢的“存储”。
官方中文文档:https://s0www0elastic0co.icopy.site/guide/en/logstash/current/index.html
2.3 ElasticSearch
Elasticsearch 是一个开源的搜索引擎,建立在一个全文搜索引擎库 Apache Lucene™ 基础之上。Lucene 可以说是当下最先进、高性能、全功能的搜索引擎库--无论是开源还是私有。
官方中文文档:https://s0www0elastic0co.icopy.site/guide/en/elasticsearch/reference/current/index.html
《Elasticsearch:权威指南》:https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html
2.4 Kibana
Kibana 是一款开源的数据分析和可视化平台,它是 Elastic Stack 成员之一,设计用于和 Elasticsearch 协作。您可以使用 Kibana 对 Elasticsearch 索引中的数据进行搜索、查看、交互操作。您可以很方便的利用图表、表格及地图对数据进行多元化的分析和呈现。
官方中文文档:https://www.elastic.co/guide/cn/kibana/current/index.html
3.配置文件说明
3.1 nginx配置文件
nginx.conf中设置日志文件格式:
log_format main $time_iso8601 | $remote_addr | $http_host | $request_method | $request_uri | $server_protocol | $status | $body_bytes_sent | $http_referer | $http_user_agent | $request_time |;
access_log /var/log/nginx/access.log main;
各字段解释:访问时间和时区 | 客户端ip | 请求地址(浏览器输入的ip或域名) | http请求方法(get或post等) | 客户端请求的原始uri | 服务器的HTTP版本,通常为 "HTTP/1.0" 或 "HTTP/1.1 | http状态码 | 传给客户端的字节 | url跳转来源,用来记录从那个页面链接访问过来的 | 用户浏览器信息 | 客户端请求时间 |
修改完成后,通过sudo nginx -t
来检查配置文件是否正确,然后sudo nginx -s reload
来重启
3.2 filebeat配置文件
filebeat各系统安装教程详见官方文档。
我这里安装的deb包(rpm包也同样),配置文件在/etc/filebeat/filebeat.yml,
filebeat.inputs: #filebeat的输入部分
- type: log #输入的类型
enabled: true #filebeat6.0之后需要设置为true
#收集的日志路径
paths:
- /var/log/nginx/access.log
#
fields: #额外添加的字段 添加字段用来logstash输出时判断传入哪个索引
log_source: yg_access
log_type: accesslog
tags: ["yg-accesslog"] #分组标志 该信息用于logstash对该组数据进行处理
#scan_frequency: 1s
close_inactive: 1m
- type: log
enabled: true
paths:
- /var/log/nginx/error.log
fields:
log_source: yg_error
log_type: errorlog
tags: ["yg-errorlog"]
output.logstash:
# The Logstash hosts 输入到logstash
hosts: ["172.16.1.1:5044"]
filebeat命令:
systemctl start filebeat #启动filebeat服务
systemctl enable filebeat #设置开机自启动
systemctl disable filebeat #停止开机自启动
systemctl status filebeat #查看服务当前状态
systemctl restart filebeat #重新启动服务
3.3 logstash配置
docker run -p 5601:5601 -p 9200:9200 -p 5044:5044 -d --restart=always -v /usr/local/logstash:/etc/logstash -v /etc/localtime:/etc/localtime --name elk sebp/elk:624
参数介绍:
-p 指定容器和宿主机映射端口
5601: kibana服务端口 HTTP (web访问)
9200: Elasticsearch 开发端口 HTTP,保存数据到Elasticsearch中使用
5044: logstash 收集日志端口 TCP
-d 后台运行
--restart=always docker重启是总是运行
-v 挂载目录 可以将logstash 的配置文件挂载在宿主机的目录上,方便随时修改,修改后的配置文件会同步到容器中。
挂载 /etc/localtime 该目录是为了保证容器和宿主机的时区相同。
通过-v参数,冒号前为宿主机目录,必须为绝对路径,冒号后为镜像内挂载的路径。
现在镜像内就可以共享宿主机里的文件了。
在/usr/local/文件夹下依次创建logstash/conf.d/logstash.conf
input {
beats {
port => 5044
}
}
filter {
if "yg-accesslog" in [tags] {
grok {
match => { "message" => "%{TIMESTAMP_ISO8601:timestamp}\|%{IP:remote_addr}\|%{DATA:http_host}\|%{DATA:request_method}\|%{DATA:request_uri}\|%{DATA:server_protocol}\|%{NUMBER:status}\|(?:%{NUMBER:body_bytes_sent}|-)\|(?:%{DATA:http_referer}|-)\|%{DATA:http_user_agent}\|(?:%{DATA:request_time}|-)\|"}
}
mutate {
convert => ["status","integer"]
convert => ["body_bytes_sent","integer"]
convert => ["request_time","float"]
}
geoip {
source=>"remote_addr"
}
useragent {
source=>"http_user_agent"
}
}
#如果需要可以一些errorlog的处理语句
}
output {
if [fields][log_type] == "accesslog" {
elasticsearch {
hosts => ["127.0.0.1:9200"]
index => "yg-nginx-accesslog" ##根据不同的日志存入不同的索引中
}
}
if [fields][log_type] == "errorlog" {
elasticsearch {
hosts => ["127.0.0.1:9200"]
index => "yg-nginx-errorlog" ##对应es索引名
}
}
}
!!!注意:grok中的正则如果不符合日志的格式,需要及时修改正则
grok正则在线验证地址:http://grokdebug.herokuapp.com
正则代表的含义:https://github.com/elastic/logstash/blob/v1.4.2/patterns/grok-patterns
配置成功后,执行如下命令重启docker中的logstash (有时会重启失败,多试几次吧)
docker exec elk /etc/init.d/logstash restart
3.4 kibana设置
在浏览器中输入 http://ip:5601 进入kibana
然后如下设置
然后创建 index pattern
然后选择@timestamp
最后在Discover标签页就可以看到了