ElasticSearch Logstash Kibana Filebeat 搭建与使用
日志介绍
日志主要包括系统日志、应用程序日志和安全日志。
开发人员可以通过日志了解服务器软硬件信息程序运行中的错误及原因。
通常,日志被分散在储存不同的设备上。
因此需要集中起来方便管理。
集中化管理日志后,日志的统计和检索又成为一件比较麻烦的事情,一般我们使用grep、awk和wc等Linux命令能实现检索和统计,
但是不够方便与可视化。
开源实时日志分析ELK平台能够完美的解决我们上述的问题
日志去向
-
日志分析
.log -> flume -> kafka -> hdfs -> mapreduce/spark -> hbase/*
-
日志监控
.log -> filebeat -> logstash -> elasticSearch
包含功能
- 1)收集-能够采集多种来源的日志数据
- 2)传输-能够稳定的把日志数据传输到指定机器
- 3)存储-存储日志数据
- 4)分析-可以支持 UI 分析
搭建环境
由于服务并不是太多选择单节点模式,若服务应用较多则选择集群模式搭建
使用docker容器启动相应服务
配置文件准备
- ElasticSearch
暂时不需要
- Logstash
- logstash.conf
input { beats { port => "5044" } } filter { mutate { split => ["source","/"] add_field => { "temp" => "%{[source][4]}" } remove_tag => ["beats_input_codec_plain_applied"] } mutate{ split => ["temp","."] add_field => { "level" => "%{[temp][0]}" } remove_field => [ "temp" ] } } output { stdout { codec => rubydebug } elasticsearch { hosts => ["http://xxxxxx:xxx"] index => "%{[@metadata][beat]}-%{[tags]}-%{+YYYY.MM.dd}" document_type => "logs" } }
- logstash.yml
# Options for log.level: # * fatal # * error # * warn # * info (default) # * debug # * trace # log.level: info path.logs: /var/log/logstash
- Filebeat
- filebeat.yml
filebeat.prospectors: - input_type: log paths: # 指定服务日志路径 - /var/logs/xxxxx/*.log multiline: pattern: '^\s*("{)' negate: true match: after max_lines: 1000 timeout: 30s # 指定服务tag 用于es index tags: ["xxxx"] - input_type: log paths: - /var/logs/xxxx/*.log tags: ["xxx"] output: logstash: # 输出到logstash地址和端口号 hosts: ["xxxxx:5044"]
- Nginx
- nginx.conf
#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; upstream kibana{ server xxxx:5601 weight=1; } server { listen xxxx; server_name localhost; location / { auth_basic "auth for kibana"; auth_basic_user_file /etc/nginx/htpasswd; proxy_pass http://kibana; } } }
准备挂在路径拷贝文件修改权限
mkdir -p /opt/data/{elasticsearch,filebeat,kibana,logstash,nginx}/{data,logs}
mkdir -p /opt/data/logstash/{config,pipeline}
cp logstash.conf /opt/data/logstash/pipeline
cp logstash.yml /opt/data/logstash/config
cp filebeat.yml /opt/data/kibana
cp nginx.conf /opt/data/nginx
printf "xxxxx:$(openssl passwd -crypt xxxxx)\n" >> ./htpasswd
cp ./htpasswd /etc/nginx/
chmod o+rw -R /opt/data
启动
- ElasticSearch
docker run -itd --rm -9200:9200 -p9300:9300 --name es -v /opt/data/elasticsearch/logs:/usr/share/elasticsearch/logs -v /opt/data/elasticsearch/data:/usr/share/elasticsearch/data -e "discovery.type=single-node" elasticsearch:6.5.1
- Logstash
docker run -itd --rm -p5044:5044 -p9600:9600 --name ls -v /opt/data/logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml -v /opt/data/logstash/pipeline/logstash.conf:/usr/share/logstash/pipeline/logstash.conf -v /opt/data/logstash/data/:/usr/share/logstash/data/ logstash:6.5.1
- Filebeat
docker run --rm --name fb -it -v /opt/data/filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml -v /var/logs/:/var/logs/ docker.elastic.co/beats/filebeat:6.5.1
- kibana
docker run -itd --rm -p5601:5601 --name kb -v /opt/data/kibana/data:/usr/share/kibana/data -e ELASTICSEARCH_URL=http://xxxxx:9200 kibana:6.5.1
- Nginx(由于elk没有认证服务所以使用nginx作为认证服务)
docker run --rm --name ng -v /opt/data/nginx/nginx.conf:/etc/nginx/nginx.conf -v /opt/data/nginx/htpasswd:/etc/nginx/htpasswd -p xx:xx -itd nginx
新的应用接入
-
创建日志目录
在/var/logs/下创建相应的目录 如模块名字叫 xxxx 则新建目录/var/logs/xxxx
将应用docker镜像中服务日志挂载到 /var/logs/xxxx即可
-
当前服务器已存在filebeat
修改当前服务中的filebeat配置文件如下
- input_type: log paths: - /var/logs/xxxx/*.log tags: ["push"]
重启filebeat
-
当前服务不存在filebeat
新起filebeat docker容器 配置如上所述