最近在用k8s
管理项目, 每个容器都会打印自己的日志, 目前的解决方案是用nfs4
在线文件系统统一存储, 考虑到性能问题, 还是将日志打印到宿主机, 然后通过elk
分布式日志收集. 但如果在每台服务器部署logstash
是比较耗资源的, 毕竟是java
项目. 好在作者重新用golang
写了一套新的采集工具filebeat
, 性能更高, 暂用资源也更少, 所以这里在每台服务器部署filebeat
采集日志, 然后统一缓存到redis
, 而elk
所在的服务器通过logstash
从redis
里面取数据, 然后发送给elasticsearch
分析, 通过kibana
显示
此图是盗用别人的, 但能够很好的展示流程, 所以自己就不画了
一. 日志服务器配置
下载二进制文件到/mnt
挂在目录
# 进入挂载目录
cd /mnt
# 创建elk文件夹
mkdir elk
# 下载elasticsearch
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.5.1.tar.gz
# 下载kibana
wget https://artifacts.elastic.co/downloads/kibana/kibana-5.5.1-linux-x86_64.tar.gz
# 下载logstash
wget https://artifacts.elastic.co/downloads/logstash/logstash-5.5.1.tar.gz
# 分别解压
tar -zxvf elasticsearch-5.5.1.tar.gz
tar -zxvf kibana-5.5.1.tar.gz
tar -zxvf logstash-5.5.1.tar.gz
# 移动到elk目录
mv elasticsearch-5.5.1 elk/elasticsearch
mv kibana-5.5.1 elk/kibana
mv logstash-5.5.1 elk/logstash
1.配置Elasticsearch
# 进入目录(`ES_HOME`所在的目录)
cd /mnt/elk/elasticsearch
# 安装X-Pack
bin/elasticsearch-plugin install x-pack
# 编辑配置文件
vi config/elasticsearch.yml
# 头部添加
#################################################
cluster.name: yinnote-elastic
network.host: 127.0.0.1
#################################################
cluster.name
集群的名称
network.host
服务监听地址, 最好设置成本机, 没有必要对外开放
http.port
默认9200
path.logs
默认ES_HOME/logs
path.data
默认ES_HOME/data
# 启动(daemon方式)
bin/elasticsearch -d
配置登录认证, 从5.5
版本开始, Shield
已经集成到X-Pack
, 不需要额外安装
# 配置elastic账号的密码(第一次执行需要输入默认密码 changeme )
curl -XPUT -u elastic 'localhost:9200/_xpack/security/user/elastic/_password'
-H "Content-Type: application/json" -d '{
"password" : "123456"
}'
# 配置kibana账号的密码
curl -XPUT -u elastic 'localhost:9200/_xpack/security/user/kibana/_password'
-H "Content-Type: application/json" -d '{
"password" : "123456"
}'
# 配置logstash_system账号的密码
curl -XPUT -u elastic 'localhost:9200/_xpack/security/user/logstash_system/_password'
-H "Content-Type: application/json" -d '{
"password" : "123456"
}'
# 生成密钥
bin/x-pack/syskeygen
注意这个密钥的证书只有一个月的时间, 如果想长期使用, 大家可以自己找方法...
# 修改配置文件, 重启
vi config/elasticsearch.yml
# 添加密钥支持
#################################################
xpack.security.audit.enabled: true
#################################################
# 重启Elasticsearch
kill -9 [pid]
bin/elasticsearch -d
2.配置Kibana
# 进入目录(KIBABA_HOME所在的目录)
cd /mnt/elk/kibana
# 安装X-Pack
bin/kibana-plugin install x-pack
# 配置文件
vi config/kibana.yml
# 头部添加
#################################################
server.host: "0.0.0.0"
elasticsearch.username: "elastic"
elasticsearch.password: "123456"
#################################################
server.port
对外端口, 默认5601
server.host
对外监听ip
, 如果有nginx
代理, 可以设置成127.0.0.1
elasticsearch.url
es地址, 默认http://127.0.0.1:9200
elasticsearch.username
elastic账号
elasticsearch.password
elastic密码
# 启动
bin/kibana
3.配置Logstash
模式一: 从filebeat
获取采集数据
# 进入目录(LOGSTASH_HOME所在的目录)
cd /mnt/elk/logstash
# 创建配置文件
vi client-http.conf
# 添加
#################################################
input {
beats {
port => 5044
codec => "json"
}
}
output {
elasticsearch {
hosts => ["127.0.0.1:9200"]
index => "logstash-nginx-error-%{+YYYY.MM.dd}"
user => "elastic"
password => "123456"
}
stdout {codec => rubydebug}
}
#################################################
# 启动服务(监听模式, 便于查看数据)
bin/logstash -f client-http.conf
模式二: 从redis
获取采集数据
# 创建配置文件
vi client-redis.conf
# 添加
#################################################
input {
redis {
host => "127.0.0.1"
port => "6379"
key => "filebeat"
data_type => "list"
password => "redis的密码"
threads => 20
}
}
output {
elasticsearch {
hosts => ["127.0.0.1:9200"]
index => "logstash-nginx-error-%{+YYYY.MM.dd}"
user => "elastic"
password => "123456"
}
stdout {codec => rubydebug}
}
#################################################
# 启动服务(监听模式, 便于查看数据)
bin/logstash -f client-http.conf
二. 客户端数据采集配置
# 下载安装
cd /mnt
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-5.5.1-linux-x86_64.tar.gz
tar -zxvf filebeat-5.5.1-linux-x86_64.tar.gz
mv filebeat-5.5.1-linux-x86_64 filebeat
# 进入目录
cd filebeat
模式一: 通过RESTful
接口发送数据 (同Logstash
模式一对应)
# 创建配置文件
vi client-http.yml
# 添加
#################################################
filebeat.prospectors:
- input_type: log
paths:
- /mnt/logs/nginx/error.log
fields:
feature: nginx-err
multiline:
pattern: '^\['
negate: true
match: after
output.logstash:
hosts: ["yinnote.com:5044"]
#################################################
# 启动服务(监听模式, 便于查看数据)
./filebeat -e -c client-http.yml
模式二: 通过Redis
接口发送数据 (同Logstash
模式二对应)
# 创建配置文件
vi client-redis.yml
# 添加
#################################################
filebeat.prospectors:
- input_type: log
paths:
- /mnt/logs/nginx/error.log
fields:
feature: nginx-err
multiline:
pattern: '^\['
negate: true
match: after
output.redis:
hosts: ["yinnote.com"]
password: "redis的密码"
#################################################
# 启动服务(监听模式, 便于查看数据)
./filebeat -e -c client-redis.yml
input 相关:
fields
可以自定义多个键值对, 便于在kibana
后台筛选日志
multiline
设置多行支持, 对于很多异常日志, 不是单行显示的, 这个让一段报错日志打成一条记录
output 相关:
hosts
指定redis
地址, 默认端口是6379
, 如果需要指定其他端口, 直接在地址后面加, 如yinnote.com:26379
,v5.5
版本已经不支持port
参数
db
可省略, 默认0
key
可省略, 默认filebeat
datatype
, 可省略, 默认list
访问后台
1. 浏览器访问 http://yinnote.com:5601
2. 输入elastic用户和密码即可登录
3. 点击左侧的 discover 菜单, 即可查看日志采集情况
时间比较匆忙, 写得比较简洁, 这里主要是介绍最精简的配置方式部署, 所以很多配置参数没有介绍, 另外关于
Elasticsearch
集群的部署没有介绍, 后续会专门写一篇.