日志分析是运维工程师解决系统故障,发现问题的主要手段。日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误。
而ELK是由 Elasticsearch(日志存储和搜索)、Logstash(日志收集)、Kibana(查看日志)三个开源软件的组成的一个组合体,ELK是elastic公司研发的一套完整的日志收集、分析和展示的企业级解决方案,在这三个软件当中,每个软件用于完成不同的功能,ELK又称为ELKstack。
ELK 组件在海量日志系统的运维中,可用于解决以下主要问题:- 分布式日志数据统一收集,实现集中式查询和管理
ELK工作原理展示图:
【APPServer集群】–【logstash Agent 采集器】-【ElasticSearch cluster】–.【Kibana Server】–.【Browser】
Logstash收集AppServer产生的Log,并存放到ElasticSearch集群中,而Kibana则从Es集群中查询数据生成图表,再返回给Browser。简单来说,进行日志处理分析,一般需要经过以下几个步骤:
1.将日志进行集中化管理( beats)
2.将日志格式化( logstash)
3.对格式化后的数据进行索引和存储(elasticsearch)
4.前端数据的展示(kibana)
要收集哪些日志
1)系统日志——》为监控做准备
2)服务日志
1、数据库—》mysql—》慢查询日志、错误日志、普通日志
2、tomcat,因为log4j是java开发的
3)业务日志——》log4j
日志收集后,如何展示(可视化)
一个高度可扩展的开源全文搜索和分析引擎,它可实现数据的实时全文搜索、支持分布式可实现高可用、提供API接口,可以处理大规模日志数据,比如Nginx、Tomcat、系统日志等功能。
Elasticsearch使用Java语言开发,是建立在全文搜索引擎ApacheLucene基础之上的搜索引擎,
Elasticsearch的特点:
Logstash 是一个具有实时传输能力的数据收集引擎,其可以通过插件实现日志收集和转发,支持日志过滤,支持普通 log、自定义 json 格式的日志解析,最终把经过处理的日志发送给 elasticsearch。
Kibana 为 elasticsearch 提供一个查看数据的 web 界面,其主要是通过elasticsearch 的 API 接口进行数据查找,并进行前端数据可视化的展现,另外还可以针对特定格式的数据生成相应的表格、柱状图、饼图等。
192.168.133.50 host1
192.168.133.100 host2
192.168.133.75 web
systemctl stop firewalld
setenforce 0
hostname host1 host1上执行
su
hostname host2 host2上执行
su
hostname web web上执行
su
echo "192.168.133.50 host1
192.168.133.100 host2
192.168.133.75 web">> /etc/hosts
[root@host1 ~]# yum install ntp -y
[root@host1 ~]# vim /etc/ntp.conf
[root@host1 ~]# service ntpd start
Redirecting to /bin/systemctl start ntpd.service
[root@host2 ~]# yum install ntpdate -y
[root@host2 ~]# service ntpd start
Redirecting to /bin/systemctl start ntpd.service
[root@host2 ~]# /usr/sbin/ntpdate 192.168.133.75
16 Dec 11:40:08 ntpdate[42044]: the NTP socket is in use, exiting
[root@localhost mysql]# crontab -e
no crontab for root - using an empty one
crontab: installing new crontab
[root@host2 ~]# crontab -l
*/10 * * * * /usr/sbin/ntpdata 192.168.133.75
host1和host2上操作,只展示host1上的操作
[root@host1 ~]# cd /opt
rpm -ivh elasticsearch-5.5.0.rpm
[root@host1 opt]# cd /etc/elasticsearch/
[root@host1 elasticsearch]# cp elasticsearch.yml{,.bak}
[root@host1 elasticsearch]# vim elasticsearch.yml
17 #cluster.name: my-application 开启并修改集群名字
改
17 cluster.name: zy-elk
23 #node.name: node-1 开启并改成主机名两台机器分别改
改
23 node.name:host1 host1上改
23 node.name:host2 host2上改
33 #path.data: /path/to/data 开启设置数据目录需要新建并给权限
改
33 path.data: /data/elk_data
37 #path.logs: /path/to/logs 开启并修改日志文件路径
改
37 path.logs: /var/log/elasticsearch/
43 #bootstrap.memory_lock: true 内存锁取消
改
43 bootstrap.memory_lock: false
55 #network.host: 192.168.0.1 开启并更改监听端口
改
55 network.host: 0.0.0.0
59 #http.port: 9200 开启端口
改
59 http.port: 9200
68 #discovery.zen.ping.unicast.hosts: ["host1", "host2"] 自动集群发现,加入主机名
改
68 discovery.zen.ping.unicast.hosts: ["host1", "host2"]
[root@host1 elasticsearch]# mkdir -p /data/elk_data
[root@host1 elasticsearch]# chown -R elasticsearch.elasticsearch /data/elk_data/
[root@host1 elasticsearch]# systemctl enable --now elasticsearch.service
Created symlink from /etc/systemd/system/multi-user.target.wants/elasticsearch.service to /usr/lib/systemd/system/elasticsearch.service.
[root@host1 elasticsearch]# netstat -ntap|grep 9200
tcp6 0 0 :::9200 :::* LISTEN 39393/java
这时可以在客户机上打开http://192.168.133.50:9200
客户机上打开http://192.168.133.100:9200
http://192.168.133.50:9200/_cluster/health?pretty
这里可显示状态为正常
http://192.168.133.50:9200/_cluster/state?pretty
Elasticsearch在5.0 版本后,Elasticsearch-head插件需要作为独立服务进行安装,需要使用npm.工具(Wodeas的包管理T具)安装。安装 Elasticsearch-head 需要提前安装好依赖软件node 和 phantomjs。
node:是一个基于 Chrome v8引擎的 JavaScript运行环境。
phantomjs:是一个基于websit 的JavaScriptAPI,可以理解为一个隐形的浏览器,任何基于webkit浏览器做的事情,它都可以做到。
[root@host1 elasticsearch]# yum install gcc gcc-c++ make -y
[root@host1 opt]# ls
[root@host1 opt]# tar xf node-v8.2.1.tar.gz
[root@host1 opt]# cd node-v8.2.1/
[root@host1 node-v8.2.1]# ./configure
[root@host1 node-v8.2.1]# make && make install
[root@host1 opt]# tar xf phantomjs-2.1.1-linux-x86_64.tar.bz2 -C /usr/local/src/ 解压到指定目录
[root@host1 opt]# cd /usr/local/src/phantomjs-2.1.1-linux-x86_64/ 进入目录
[root@host1 phantomjs-2.1.1-linux-x86_64]# ln -s /usr/local/src/phantomjs-2.1.1-linux-x86_64/bin/* /usr/local/bin/
[root@host1 opt]# tar zxvf elasticsearch-head.tar.gz -C /usr/local/src/
[root@host1 opt]# cd /usr/local/src/elasticsearch-head/
[root@host1 ~]# vi /etc/elasticsearch/elasticsearch.yml 末尾增加2行
http.cors.enabled: true
#开启跨域访问支持,默认是false
http.cors.allow-origin: "*"
#指定跨域访问允许的域名地址为所有
[root@host1 elasticsearch-head]# systemctl restart elasticsearch
[root@host1 ~]# systemctl status elasticsearch
[root@host1 elasticsearch-head]# cd /usr/local/src/elasticsearch-head/
[root@host1 elasticsearch-head]# npm run start &
这时可以去打开192.168.133.50:9100
在host1上创建一个索引索引为index-demo,类型为test,可以看到成功创建
[root@host1 elasticsearch-head]# curl -X PUT 'localhost:9200/index-demo/test/1?pretty&pretty' -H 'content-Type: application/json' -d '{"user":"ceshi","mesg":"hello elk"}'
[root@web ~]# yum install httpd -y
[root@web ~]# systemctl start httpd
[root@web ~]# cd /opt
[root@web opt]# rpm -ivh logstash-5.5.1.rpm
[root@web opt]# ln -s /usr/share/logstash/bin/logstash /usr/local/bin/
Logstash这个命令测试
字段描述解释:
● -f 通过这个选项可以指定logstash的配置文件,根据配置文件配置logstash
● -e 后面跟着字符串 该字符串可以被当做logstash的配置(如果是“空”则默认使用stdin做为输入、stdout作为输出)
● -t 测试配置文件是否正确,然后退出
[root@web opt]# logstash -e 'input { stdin{} } output { stdout{} }'
[root@web opt]# logstash -e 'input { stdin{} } output { stdout{ codec=>rubydebug } }'
[root@web opt]# logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["192.168.133.50:9200"] } }'
[root@web opt]# ll /var/log/messages
[root@web opt]# chmod o+r /var/log/messages 给其它用户(Other Users)增加可读
[root@web opt]# vi /etc/logstash/conf.d/system.conf
input {
file{
path => "/var/log/messages"
type => "system"
start_position => "beginning"
}
}
output {
elasticsearch {
hosts => ["192.168.133.50:9200"]
index => "system-%{+YYYY.MM.dd}"
}
}
[root@web opt]# vi /etc/logstash/logstash.yml
[root@web opt]# systemctl restart logstash.service
到192.168.133.50:9100查看就可以看到我们刚刚查到的日志了
登录192.168.133.50 host1主机
在host1主机安装kibana
[root@host1 ~]# cd /usr/local/src
[root@host1 src]# rpm -ivh kibana-5.5.1-x86_64.rpm
[root@host1 kibana]# cp kibana.yml kibana.yml.bak
[root@host1 kibana]# vi /etc/kibana/kibana.yml
2 #server.port: 5601 kibana打开的端口开启
改
2 server.port: 5601
7 #server.host: "localhost" 监听端口开启并修改
改
7 server.host: "0.0.0.0"
21 #elasticsearch.url: "http://localhost:9200" 开启并修改和elasticsearch建立联系
改
21 elasticsearch.url: "http://192.168.133.50:9200"
30 #kibana.index: ".kibana" 在elasticsearch中添加.kibana索引
开启
30 kibana.index: ".kibana"
[root@host1 kibana]# systemctl start kibana.service
[root@host1 kibana]# systemctl status kibana.service
然后在客户机上打开http://192.168.133.50:5601
[root@web ~]# cd /etc/logstash/conf.d/
[root@web conf.d]# touch apache_log.conf
[root@web conf.d]# vi apache_log.conf
input {
file{
path => "/etc/httpd/logs/access_log"
type => "access"
start_position => "beginning"
}
file{
path => "/etc/httpd/logs/error_log"
type => "error"
start_position => "beginning"
}
}
output {
if [type] == "access" {
elasticsearch {
hosts => ["192.168.133.50:9200"]
index => "apache_access-%{+YYYY.MM.dd}"
}
}
if [type] == "error" {
elasticsearch {
hosts => ["192.168.133.50:9200"]
index => "apache_error-%{+YYYY.MM.dd}"
}
}
}
[root@web conf.d]# pwd
/etc/logstash/conf.d
[root@web conf.d]# /usr/share/logstash/bin/logstash -f apache_log.conf 在此文件夹下运行
登录192.168.133.75 web主机 不然无法显示access日志
这样在192.168.133.50:9200上既可以看到这两个索引了
也可以创建索引进行查看
鉴于正常logstash放在服务器上,有可能线程过多,占用资源
我们可以把logstash单独放一个服务器作为日志服务器
日志分割周期性进行传递
NFS挂载
rsync(数据量小的时候用,或者和NFS搭配)
logstash只做格式化过滤和输出
加入filebeat收集放在服务器上
logstash做集群化,多个logstash
或者在
filebeat和logstash中加入一些中间件
比如redis作用汇聚
MQ消息代理kafka
数据流向
logstash通过文件收集进行传输
接口调用ES9200端口接收数据
9200启动端口,监听端口,通过此端口把服务暴露出去
9100到ES数据库里调用数据 不能登录 ,链接的是logstash——head
kibana、kafka从9200端口拿取数据
ES9300监听的是集群内部