实现目标:
使用elasticsearch+kibana+logstash+filebeat搭建服务,以支持(日志收集切分展示查找)
架构:
10.6.14.77 es,kibana,logstash (三项默认的配置均为localhost,起在同一台服务器不再需要修改)
logstash 在单服务器上起多个实例,分别收集每个服务的日志,以隔离各个服务的日志收集
filebeat (起在各个需要收集日志的服务器上)
通过supervisor控制各个服务器上的响应服务
版本:
es 6.2.3 (基础日志数据存储)
kibana 6.2.3 (可视化web端服务)
logstash 6.2.3 (日志切分及归类)
filebeat 6.3.2 (各服务器日志收集)
前置:
需要安装java8
elastic stack 官网:https://www.elastic.co/products/
elasticsearch:
1.unzip elasticsearch-6.2.3.zip
2.启动 ./bin/elasticsearch
后台启动 ./bin/elasticsearch -d
检测是否启动成功:curl localhost:9200
3.若报错:can not run elasticsearch as root
原因:这是出于系统安全考虑设置的条件。由于ElasticSearch可以接收用户输入的脚本并且执行,为了系统安全考虑, 建议创建一个单独的用户用来运行ElasticSearch
解决方案:创建elsearch用户组及elsearch用户
groupadd elsearch
useradd elsearch -g elsearch -p elasticsearch
chown -R elsearch:elsearch elasticsearch
4.若报错:max virtual memory areas vm.maxmapcount [65530] is too low
sudo sysctl -w vm.max_map_count=262144
在本机查看启动信息:curl localhost:9200
5. 配置外网访问:
config/elasticsearch.yml
修改为:network.host: 0.0.0.0
filebeat:
下载地址:https://www.elastic.co/cn/downloads/beats/filebeat
1.修改filebeat.yml配置
hint: filebeat.yml的默认配置是将数据output至elasticsearch,需要将其注释掉,并启用logstash output
filebeat.inputs: # 设置输入源
# Change to true to enable this input configuration.
enabled: true
paths:
- /data/log/* # 读取日志路径
output.logstash: # 设置输出至logstash
hosts: ["10.6.14.77:5044"]
tail_files: true #从文件末尾开始读取,否则在启动时会读取全文件
# hint: 将es的output注释掉
2.命令行测试启动:
./filebeat -e -c filebeat.yml
logstash:
下载地址:https://www.elastic.co/cn/downloads/logstash
1.unzip logstash-6.2.3.zip
2.命令行测试启动:
./bin/logstash -e "input {stdin{}} output {stdout{}}"
可在命令行输入,并输出至命令行
3.配置文件测试启动:
-e:指定logstash的配置信息,可以用于快速测试;
-f :指定logstash的配置文件;可以用于生产环境;
配置文件样例:
input { stdin { } }
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
}
date {
match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
}
}
output {
stdout { codec => rubydebug }
}
.bin/logstash -f test.conf
4.配置启动
input {
beats {
port => "5044"
}
} # 配置输入源为5044端口,filebeat默认打到5044端口
input {
beats {
add_field => {"log_type" => "pisces"} # 对于不同服务的filebeat打来的log,添加不同的log_type
port => 5044
}
beats {
add_field => {"log_type" => "aries"}
port => 5043
}
beats {
add_field => {"log_type" => "aquarius"}
port => 5045
}
}
filter {
if "pisces" in [tags]{
grok {
match => { "message" => "\[%{WORD:info_level} %{DATESTAMP:timestamp} %{WORD:temp}:%{NUMBER:temp}\] %{NUMBER:status} %{WORD:method} %{URIPATHPARAM:request} \(%{IP:ip}\) %{GREEDYDATA:C}"
}
} # 切分规则,grok中大写字母为grok规则中的匹配关键字
mutate {
split => ["request", "?"] # 将grok中