最近在研究ELK 来分析日志,但是在安装的过程中,出现很多意想不到的问题,搞得比较头大,
但无论怎么样还是成功了.
一. 介绍
ELK是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是开源软件。ELK提供了一整套解决方案,并且都是开源软件,之间互相配合使用,完美衔接,高效的满足了很多场合的应用。
目前主流的一种日志系统。
我又多用了一个工具 Filebeat
二. 安装ELK
docker pull sebp/elk
我开始是是分开安装的,但发泄日志不能收集,可能我对docker的理解不是很到位,所以重新卸载,安装了 sebp/elk 容器。
我安装的是最新版本
docker images #命令查看安装的镜像是否有成功
* 运行容器
运行此容器的时候,需要将宿主机的端口转发到该容器,其中ES端口为9200,kibana端口为5601,logbate端口为5044;另外需要将配置文件和数据存放在宿主机,便于后期维护,因此还需要将宿主机目录挂载到容器/data当中;最后构造的命令如下:
docker run -p 5601:5601 -p 9200:9200 -p 5044:5044 -v /Users/song/dockerFile:/data -it -d --name elk sebp/elk
需要注意接口转发,防火墙等设置要开启这些接口的访问,我在安装完成后发现 logbate 的5044端口不能访问,防火墙也是设置好的,最后发现忘记重启防火墙了,耽误我不少时间,有时间太自信不是什么好事
-d 后台运行参数,-v 挂载容器
* 校验
通过浏览器访问kibana,如果正常出现界面,则代表启动成功,URL地址如下:
http://localhost:5601/ # localhost 为自己服务器的外网访问IP
验证kibana启动成功之后,接着继续验证ES服务是否启动成功,URL地址如下 # localhost 为自己服务器的外网访问IP
http://localhost:9200/_search?pretty # localhost 为自己服务器的外网访问IP
三. 启动logstash
* logstash配置
logstash配置主要有三个地方要处理,首先是输入源在什么位置,然后是对数据进行过滤或者格式化,最后是需要将数据输出到什么地方
vim /Users/song/dockerFile/config/logstash.yml # 可以自定义
配置文件内容参考如下
input {
beats {
port => 5044 # 此端口需要与 filebeat.yml 中的端口相同
}
#file {
#path => "/data/logs"
# start_position => "beginning"
#}
}
filter {
#grok {
# match => { "message" => "%{COMBINEDAPACHELOG}" }
#}
#date {
# match => ["timestamp", "dd/MMM/yyyy:HH:mm:ss Z"]
#}
grok {
#patterns_dir => "/etc/logstash/conf.d/patterns"
#match => {"message" => "%{TIMESTAMP_ISO8601:time}\S%{MYSELF:msgid}%{MYSELF:method}%{MYDATA:data}%{MYSELF:UserInfo}\S%{LOGLEVEL:level}\S%{MYSELF:thread}%{MYSELF:application}%{MYSELF:ip}"}
}
date {
#match => [ "time", "YYYY-MM-dd HH:mm:ss,SSS" ]
match => [ "time", "ISO8601" ]
target => "@timestamp"
timezone => "Asia/Phnom_Penh"
}
}
output {
stdout {
codec => rubydebug
}
elasticsearch {
action => "index"
hosts => ["172.17.10.114:9200"]
index => "%{[fields][indexname]}-%{+YYYY.MM.dd}"
}
}
在配置文件当中,可以看到日志文件存放的位置在 "/data/logs/access.log"当中,输出的地址是127.0.0.1:9200,这是本机的ES服务
* 运行logstash
先进入容器内
docker exec -it elk bash
/opt/logstash/bin/logstash -e 'input { stdin { } } output { elasticsearch { hosts => ["localhost"] } }' # 执行此命令
当命令成功被执行后,看到:Successfully started Logstash API endpoint {:port=>9600} 信息后,输入:welcome to logstash 然后回车,模拟一条日志进行测试。
打开 Kibana 创建索引 如果没有出错就会看到你输入的日志
当然我们是要启动logstash 实时监控日志,启动配置文件
/opt/logstash/bin/logstash --path.data /tmp/logstash/data -f /data/config/logstash.conf
如果看到这样的报错信息 Logstash could not be started because there is already another instance using the configured data directory. If you wish to run multiple instances, you must change the "path.data" setting. 请执行命令:service logstash stop 然后在执行就可以了
如果在启动logstash 的时候出现 端口已经被占用的错误,并且执行service logstash stop 命令无法解决情况下 可以尝试关闭终端,我就是这么好的
四. 启动Filebeat 进行日志的收集
filebeat有多种安装方式,我这里采用rpm包的安装方式,可自动注册为systemd的服务
- 下载filebeat的rpm包
cd /usr/local/
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.4.0-x86_64.rpm
或者到官网查看最新版本直接下载:https://www.elastic.co/downloads/beats/filebeat
- 安装filebeat
rpm -ivh filebeat-7.4.0-x86_64.rpm
- 配置filebeat
cd /etc/filebeat
vi filebeat.yml
WeChat29d95a795d758e987c94596217bd0685.png
WeChatad91107ebb84f11014a1c006edd4f0b3.png配置改为上图所示
enabled:filebeat 6.0后,enabled默认为关闭,必须要修改成true
paths:为你想要抓取分析的日志所在路径
配置改为上图所示。注释掉Elasticsearch output,开启Logstash output。
如果直接将日志发送到Elasticsearc,请编辑此行:Elasticsearch output
如果直接将日志发送到Logstash,请编辑此行:Logstash output
只能使用一行输出,其它的注掉即可
- 启动filebeat服务
启动filebeat
systemctl start filebeat.service
查看filebeat状态
systemctl status filebeat.service
查看filebeat日志
tail -f /var/log/filebeat/filebeat
关于filebeat logstash 的文件配置,还要继续研究研究,包括过滤器等
LogStash 错误:Logstash could not be started because there is already another instance usin
在 logstash.yml 文件中找到 Data path 的路径(默认在安装目录的data目录下)
查看是否存在 .lock 文件,如果存在把它删除
网友评论