写在前面
刚毕业工作的时候,处理日志喜欢自己写脚本抓取数据分析日志,然后在zabbix上展示出来。但是开发要看日志的时候,还是要登录服务器,使用tailf、grep加一些正则,很是麻烦。来到一个新环境,需要搭建一套日志管理系统,接触了elk,相见恨晚,记录下自己从零开始学习使用elk的过程。
日志管理系统ELK
目录
- 部署架构图
- 部署版本
- 部署地址
- 服务部署
- 总结
部署架构图:
部署前了解:
1、elk现在又叫elfk,是elasticsearch、logstash、filebeat、kibana的简称。
2、elk架构类似于C/S,由客户端的日志收集工具收集日志,服务端的日志收集工具收集分析客户端的日志。之前客户端的日志收集工具logstash是用java写的,比较占用内存,为了不给生产环境造成负担,生产环境上的日志收集工具换成了用go语言写的filebeat,filebeat将日志收集到redis里面,利用redis做消息队列,服务端的logstash从redis里面取数据,分析,传到elasticsearch,最后用kibana展示出来
3、本次安装是安装在内网,故没有考虑到安全的问题,安装过程中会提到
4、本次安装是基于debian,如果是centos注意从官网下载不同的软件包、还要注意防火墙、selinux等问题。安装过程是大同小异的
5、本次安装时,日志量不算大,所以es用的是单机
部署版本:
filebeat:6.2.3
redis: 2.8.17
logstash:6.2.3
elasticsearch:6.2.3
kibana:6.2.3
部署地址:
服务 | 服务器地址 | 系统 | 部署目录 |
---|---|---|---|
filebeat | log | debian8.9 | /app/elk |
redis | elk | debian8.9 | |
logstash | elk | debian8.9 | /app/elk/logstash-6.2.3 |
elasticsearch | elk | debian8. 9 | /app/elk/elasticsearch-6.2.3 |
kibana | elk | debian8. 9 | /app/elk /kibana-6.2.3-linux-x86_64 |
服务部署:
1、redis:
考虑到logstash直接把日志丢给es,会导致es吃不消,故加了一个redis做队列缓存。也可以用kafka之类的,都是官网推荐,这里用redis,因为简单,而且做队列用,不占内存
redis直接安装就行
apt-get install redis-server
配置文件地址:/etc/redis/redis.conf
1、启动
service redis-server start
2、查看日志:
tailf /var/log/redis/redis-server.log
3、报警告:
WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
按照建议做,不然有可能导致数据丢失
4、报错:
[20109] 27 Mar 10:28:17.052 * Background saving started by pid 20760
[20760] 27 Mar 10:28:17.052 # Failed opening .rdb for saving: Permission denied
没有权限导致持久化失败
解决:
chmod 755 dump.rdb
5、关于安全建议:
- redis内网通信
- 修改默认端口号,开启账号密码登录
- 打开防火墙,添加白名单
6、测试:
在需要收集日志的客户端telnet下redis加port,确保通信没问题
2、Elasticsearch
1、安装目录:
/app/elk/elasticsearch-6.2.3
2、安装依赖:
es是用java写的,所以需要安装jdk1.8,这里用oracle_jdk1.8,openjdk和其他版本的支持不支持elk6.2.3我不清楚
jdk1.8的安装:
2.1、下载jdk至指定目录 /usr/local
jdk1.8:http://download.oracle.com/otn-pub/java/jdk/8u162-b12/0da788060d494f5095bf8624735fa2f1/jdk-8u162-linux-x64.tar.gz
wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" -P /usr/local http://download.oracle.com/otn-pub/java/jdk/8u162-b12/0da788060d494f5095bf8624735fa2f1/jdk-8u162-linux-x64.tar.gz
2.2、解压
tar zxvf /usr/local/jdk-8u162-linux-x64.tar.gz -C /usr/local/
2.3、配置环境变量
export JAVA_HOME=/usr/local/jdk1.8.0_162
export JAVA_BIN=/usr/local/jdk1.8.0_162/bin
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jart
4、安装es:
cd /app/elk
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.2.3.deb
tar zxvf elasticsearch-6.2.3.tar.gz
配置文件:/app/elk/elasticsearch-6.2.3/config/elasticsearch.yml
ath.data: /app/elk/elasticsearch-6.2.3/data
path.logs: /app/elk/elasticsearch-6.2.3/logs
network.host: ip ####这里写es服务器的ip
5、创建elk账号
为了安全起见,es不支持以root用户启动,所以先创建elk账号
####debian创建账号,赋予sudo权限。其他linux发行版的命令可以自行google
adduser elk
groups elk
usermod -aG sudo elk
visudo
添加: elk ALL=(ALL) NOPASSWD: ALL
chown -R elk.elk /app/elk
6、启动:
切换用户,启动。我这里图省事就直接nohup启动了。正规点的可以用screen、supervisor这些,别忘了加入开机自启动
su elk
nohup /app/elk/elasticsearch-6.2.3/bin/elasticsearch > /var/log/es.log 2>&1 &
7、查看nohup.out日志,检查报错
看有没有报错:如果报错,需要设置文件打开数和vm.max_map_count,那么就进行修改,
文件打开数:
vim /etc/security/limits.conf
root soft nofile 65535
root hard nofile 65535
* soft nofile 65536
* hard nofile 65535
elk soft nofile 655350
elk hard nofile 655350
jvm最大线程数:
sysctl -w vm.max_map_count=262144
其他错误请自行Google
8、启动成功:
查看es
ip和端口需要和配置文件保持一致
curl http://ip:9200
9、安全建议:
- es加账号密码
- 通信用tls
至此,单机版的es就算安装成功了。O(∩_∩)O
3、filebeat
1、安装机器:需要收集日志的机器
安装目录:/app/
debian安装:
cd /app/elk
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.2.3-amd64.deb
sudo dpkg -i filebeat-6.2.3-amd64.deb
2、配置文件:/etc/filebeat/filebeat.yml
配置:
####收集日志的位置,标签
filebeat.prospectors:
- type: log
enabled: true
paths:
- /var/log/nginx/access.log
fields:
list: access.log
####配置文件模板地址,是否自动加载
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
setup.template.settings:
index.number_of_shards: 3
####收集的日志输出到的地方,这里是用了redis的消息队列功能
output.redis:
hosts: ["ip"] ##redis ip
port: port ##redis port
key: "%{[fields.list]}" ##key值,这里用了变量,好归类不同的日志
db : 5 ##db库,自由选择
3、启动:
service filebeat start
4、检查:
启动后,可以进入redis的对应db里面,使用keys * 查看未消费的队列,如果没有消费完,那么应该能看到list值,这里是access.log。说明日志已经收集到redis缓存里面了。
4、logstash
logstash是收集处理日志用的,跟filebeat差不多,最大的区别是logstash自带graok解析、切割日志,而filebeat功能没这么强大,但是filebeat用go写,轻量,不占内存,故可以放到客户端收集日志,服务端还是用logstsh
1、目录:/app/elk/logstash
cd /app/elk/
wge https://artifacts.elastic.co/downloads/logstash/logstash-6.2.3.deb
tar zxvf logstash-6.2.3.tar.gz
2、logstash的配置文件:/app/elk/logstash-6.2.3/config/logstash.yml
path.data: /app/elk/logstash-6.2.3/data
path.logs: /app/elk/logstash-6.2.3/logs
3、日志收集的配置文件:/app/elk/logstash-6.2.3/conf/
分为三部分:
- input:日志的来源,这里来源是之前收集缓存日志的redis
- filter:日志切割,有没有这一块也能用,这是优化显示的日志用的
- output:日志输出的地方,参考架构图,输出到es
这里贴出我的,略去了敏感字段
#--------------------------------This is input setting-----------------------------------------
input {
redis {
host => "ip"
type => "test.access.log"
data_type => "list"
key => "test.access.log"
port => "6379"
db => 5
}
redis {
host => "ip"
type => "test.error.log"
data_type => "list"
key => "test.error.log"
port => "6379"
db => 5
}
}
#--------------------------------This is filter setting----------------------------------------
filter {
if [type] == "test.access.log"{
grok{
match => {"message" => "%{IP:clientip} - - \[%{HTTPDATE:timestamp}\] \"%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})\" %{NUMBER:response}" }
}
geoip {
source => "clientip"
target => "geoip"
database => "/app/elk/logstash-6.2.3/etc/GeoLite2-City.mmdb"
add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ]
add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}" ]
}
mutate {
convert => [ "[geoip][coordinates]", "float"]
}
}
}
#-------------------------------This is output setting---------------------------------------
output {
if [type] == "test.access.log"{
elasticsearch { hosts => ["ip:9200"] index => "test.access.log"}
}
if [type] == "test.error.log"{
elasticsearch { hosts => ["ip:9200"] index => "test.error.log"}
}
stdout { codec => rubydebug }
}
6、启动:nohup /app/elk/logstash-6.2.3/bin/logstash -f /app/elk/logstash-6.2.3/conf > /app/elk/logstash-6.2.3/nohup.out 2>&1 &
5、kibana
1、目录:/app/elk/kibana-6.2.3-linux-x86_64
cd /app/elk
wget https://artifacts.elastic.co/downloads/kibana/kibana-6.2.4-linux-x86_64.tar.gz
tar zxvf kibana-6.2.3-linux-x86_64.tar.gz
2、配置文件:
server.port: port
server.host: ip
server.name: name
elasticsearch.url: "http://ip:9200"
tilemap.url: 'http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={x}&y={y}&z={z}'
3、启动:nohup /app/elk/kibana-6.2.3-linux-x86_64/bin/kibana > /var/log/kibana.log 2>&1 &
4、检查:
打开 刚设置的 http://ip:port,就可以看到kibana界面了。
安全建议:
kibana没有账号登录的功能,需要依赖插件X-pack,但是x-pack 不是免费的,所以可以用nginx的auth登录
总结:
至此,elk就搭建完毕了,大家可以到kikana上建立索引,自由查看日志了
由于elk版本较多,网络上的教程质量也是参差不齐,大家搭建的时候,要以官方文档为准,配置文件的写法,也要以官方文档为准。然后启动前要测试,启动的时候要注意查看日志。
后续文档内容:kibana的使用、elk结合钉钉告警、logstash配置文件的写法
贴一个日志分析图,具体实现参考后续文档。