日志分析是运维工程师解决系统故障,发现问题的主要手段。日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误。通常,日志被分散的储存在不同的设备上。如果管理上百台服务器,你还在使用依次登录每台机器的传统方法查阅日志,即繁琐又效率低下。为此,我们可以使用集中化的日志管理,如:开源的syslog,将所有服务器上的日志收集汇总。集中化管理日志后,日志的统计和检索又成为一件比较麻烦的事情,一般我们使用grep、awk和wc等Linux命令能实现检索和统计,但是对于更高要求的查询、排序和统计等,再加上庞大的机器数量,依然有点力不从心。
ELK日志分析
开源实时日志分析ELK能够解决上述问题,官方网站:https://www.elastic.co/products
ELK由ElasticSearch、Logstash和Kiabana三个开源工具组成
Elasticsearch是个开源分布式搜索引擎, 基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是第二流行的企业搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
Elasticsearch群集,共同持有整个的数据,并一起提供索引和搜索功能。其中一个节点为主节点,这个主节点是可以通过选举产生的,并提供跨节点的联合索引和搜索的功能。集群有一个唯一性标示的名字,默认是elasticsearch,集群名字很重要,每个节点是基于集群名字加入到其集群中的。因此,确保在不同环境中使用不同的集群名字。一个集群可以只有一个节点。强烈建议在配置elasticsearch时,配置成集群模式。
Logstash是一个完全开源的工具,它可以对你的日志进行收集、过滤,并将其存储,供以后使用(如搜索)。
Kibana 是一个针对Elasticsearch的开源分析及可视化平台,用来搜索、查看交互存储在Elasticsearch索引中的数据。使用Kibana,可以通过各种图表进行高级数据分析及展示。Kibana让海量数据更容易理解。它操作简单,基于浏览器的用户界面可以快速创建仪表板(dashboard)实时显示Elasticsearch查询动态。设置Kibana非常简单。无需编写代码,几分钟内就可以完成Kibana安装并启动Elasticsearch索引监测。
Logstash收集AppServer产生的Log,并存放到ElasticSearch集群中,而Kibana则从ES集群中查询数据生成图表,再返回给Browser。
简单来说,进行日志处理分析,一般需要经过以下几个步骤:
1.将日志进行集中化管理(beats)
2.将日志格式化(logstash)
3.对格式化后的数据进行索引和存储(elasticsearch)
4.前端数据的展示(kibana)
配置和安装ELK日志分析系统,采用安装集群方式~2个elasticsearch节点,并监控apache服务器日志
操作系统 主机名 IP地址 主要软件
Centos7.6 node1 192.168.188.41 Elasticsearch Kibana
Centos7.6 node2 192.168.188.42 Elasticsearch
Centos7.6 apache 192.168.188.43 Logstash Apache
ELK日志分析系统 操作步骤
1:配置 Elasticsearch 群集(node1、node2)
Elasticsearch 群集中 有两个节点:node1和 node2,两个节点配置基本相同
(配置文件中的节点名称不同,一个node1 一个node2)
为省时间,node1 node2两节点同步操作
(1)配置主机名,安装java环境
# hostnamectl set-hostname node1 --另一台node节点,主机名设置为node2
# vi /etc/hosts
末行插入:
192.168.188.41 node1
192.168.188.42 node2
# yum -y install java-1.8.0
# java -version --查看java环境是否安装
(2)部署 elasticsearch软件
用Xftp把elasticsearch-5.5.0.rpm包上传到两个节点的/opt目录下,也可用其他方式,如samba共享挂载
# cd /opt
# rpm -ivh elasticsearch-5.5.0.rpm
(3)更改elasticsearch主配置文件
注意:配置文件中两个节点的名字不同,一个是node1一个是node2
# cp /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.bak
# vi /etc/elasticsearch/elasticsearch.yml
修改,#号去掉
cluster.name: my-elk-cluster --集群名字
node.name: node1 --节点名字(另一台node节点名字是node2)
path.data: /data/elk_data --数据存放路径
path.logs: /var/log/elasticsearch/ --数据存放路径
bootstrap.memory_lock: false --不在启动的时候锁定内存
network.host: 0.0.0.0 --提供服务绑定的IP地址,0.0.0.0代表所有地址
http.port: 9200 --侦听端口为9200
discovery.zen.ping.unicast.hosts: ["node1", "node2"] --集群发现通过单播实现
# grep -v "^#" /etc/elasticsearch/elasticsearch.yml 过滤查看配置
(4)创建数据存放路径 并授权,并加载系统服务
# mkdir -p /data/elk_data 创建数据存放路径
# chown elasticsearch:elasticsearch /data/elk_data/
# systemctl daemon-reload 加载系统服务
(5)启动elasticsearch ,并查看是否成功开启
# systemctl start elasticsearch.service
# systemctl enable elasticsearch.service
# netstat -antp |grep 9200
tcp6 0 0 :::9200 :::* LISTEN 64463/java
(6)查看节点信息
用浏览器打开 http://192.168.188.41:9200 ,可看到node1节点的信息
用浏览器打开 http://192.168.188.42:9200 ,可看到node2节点的信息
(7)检查集群健康状况
浏览器打开 http://192.168.188.41:9200/_cluster/health?pretty
浏览器打开 http://192.168.188.42:9200/_cluster/health?pretty
(8)检查集群状态
浏览器打开 http://192.168.188.41:9200/_cluster/state?pretty
上述查看集群的方式,及其不方便,我们可以通过安装elasticsearch-head插件后,来管理集群
(9)编译安装node组件依赖包
上传node-v8.2.1.tar.gz到 node1、node2两节点的/opt目录下
# yum install gcc gcc-c++ make pcre pcre-devel -y
# cd /opt
# tar xzvf node-v8.2.1.tar.gz
# cd node-v8.2.1/
# ./configure
# make -j3
# make install
(10)安装phantomjs
把phantomjs软件包上传到/usr/local/src/
# cd /usr/local/src/
# tar xjvf phantomjs-2.1.1-linux-x86_64.tar.bz2
# cd phantomjs-2.1.1-linux-x86_64/bin
# cp phantomjs /usr/local/bin
(11)安装elasticsearch-head插件
把elasticsearch-head软件包上传到/usr/local/src/
# cd /usr/local/src/
# tar xzvf elasticsearch-head.tar.gz
# cd elasticsearch-head/
# npm install
(12)修改主配置文件
# vi /etc/elasticsearch/elasticsearch.yml
末行插入
http.cors.enabled: true
http.cors.allow-origin: "*"
# systemctl restart elasticsearch 重启 elasticsearch服务
(13)启动elasticsearch-head 服务器
# cd /usr/local/src/elasticsearch-head/
# npm run start & --切换到后台运行
# netstat -lnupt |grep 9100
tcp 0 0 0.0.0.0:9100 0.0.0.0:* LISTEN 114739/grunt
# netstat -lnupt |grep 9200
tcp6 0 0 :::9200 :::* LISTEN 114626/java
打开浏览器输入http://192.168.188.41:9100/
在Elasticsearch 后面的栏目中输入:http://192.168.188.41:9200,点连接
可以友好的查看节点信息
打开浏览器输入http://192.168.188.42:9100/
在Elasticsearch 后面的栏目中输入http://192.168.188.42:9200,点连接
可以友好的查看节点信息
登录192.168.188.41 node1主机:
索引为index-demo,类型为test,可以看到成功创建
# curl -XPUT 'localhost:9200/index-demo/test/1?pretty&pretty' -H 'content-Type: application/json' -d '{"user":"zhangsan","mesg":"hello world"}'
打开浏览器输入http://192.168.188.41:9100/ 查看索引信息
点击数据浏览–会发现在node1上创建的索引为index-demo,类型为test, 相关的信息
2:安装 Logstash、apache服务
(IP: 192.168.188.43)
(1)安装apache,java环境包
关闭防火墙及核心防护,更改主机名
# systemctl stop firewalld
# setenforce 0
# hostnamectl set-hostname apache
安装Apahce服务
# yum -y install httpd
# systemctl start httpd
安装Java环境
# yum -y install java-1.8.0
# java -version
(2)安装logstash,并启动服务
上传logstash-5.5.1.rpm到/opt目录下
# cd /opt
# rpm -ivh logstash-5.5.1.rpm --安装logstash
# systemctl start logstash.service --启动logstash
# systemctl enable logstash.service
# ln -s /usr/share/logstash/bin/logstash /usr/local/bin --建立logstash软连接
检验 logstash(Apache)与elasticsearch(node)功能是否正常,做对接测试。
(3)输入采用标准输入 输出采用标准输出
# logstash -e 'input { stdin{} } output { stdout{} }'
省略........
10:08:54.060 [[main]-pipeline-manager] INFO logstash.pipeline - Pipeline main started
2018-10-12T02:08:54.116Z apache
10:08:54.164 [Api Webserver] INFO logstash.agent - Successfully started Logstash API endpoint {:port=>9600}
www.baidu.com --需要输入www.baidu.com
2018-10-12T02:10:11.313Z apache www.baidu.com
www.sina.com.cn --需要输入www.sina.com.cn
2018-10-12T02:10:29.778Z apache www.sina.com.cn
(4)使用logstash将信息写入elasticsearch中
输入 输出 对接
# logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["192.168.188.41:9200"] } }'
省略........
The stdin plugin is now waiting for input:
10:40:06.558 [Api Webserver] INFO logstash.agent - Successfully started Logstash API endpoint {:port=>9600}
www.baidu.com --输入内容
www.sina.com.cn --输入内容
www.google.com.cn --输入内容
(5)做对接配置
Logstash配置文件主要由三部分组成:input、output、filter(根据需要)
# chmod o+r /var/log/messages
# ll /var/log/messages
# vi /etc/logstash/conf.d/system.conf
input {
file{
path => "/var/log/messages"
type => "system"
start_position => "beginning"
}
}
output {
elasticsearch {
hosts => ["192.168.188.41:9200"]
index => "system-%{+YYYY.MM.dd}"
}
}
# systemctl restart logstash.service
打开浏览器 输入http://192.168.188.41:9100/ 可以看到刚刚设置的索引信息
多出 system-2019.04.16
3:在node1上 安装kibana
上传kibana-5.5.1-x86_64.rpm 到/usr/local/src目录
# cd /usr/local/src/
# rpm -ivh kibana-5.5.1-x86_64.rpm
# cd /etc/kibana/
# cp kibana.yml kibana.yml.bak
# vi kibana.yml
server.port: 5601 --kibana打开的端口
server.host: "0.0.0.0" --kibana侦听的地址
elasticsearch.url: "http://192.168.188.41:9200" --和elasticsearch建立联系
kibana.index: ".kibana" --在elasticsearch中添加.kibana索引
# systemctl start kibana.service --启动kibana服务
# systemctl enable kibana.service --开机启动kibana服务
使用浏览器输入192.168.188.41:5601
首次登录创建一个索引 名字:system-* 这是对接系统日志文件
然后点最左上角的Discover按钮 会发现system-*信息
然后点下面的host旁边的add 会发现右面的图只有 Time 和host 选项了 这个比较友好
4:对接Apache主机的日志文件
# cd /etc/logstash/conf.d/
# touch apache_log.conf
# 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.188.41:9200"]
index => "apache_access-%{+YYYY.MM.dd}"
}
}
if [type] == "error" {
elasticsearch {
hosts => ["192.168.188.41:9200"]
index => "apache_error-%{+YYYY.MM.dd}"
}
}
}
# /usr/share/logstash/bin/logstash -f apache_log.conf
打开浏览器输入http://192.168.188.43,打开httpd网页。会记入访问日志文件中
打开浏览器 输入http://192.168.188.41:9100/ 查看索引信息
能发现apache_error-2020.3.25 apache_access-2020.3.25
打开浏览器 输入http://192.168.188.41:5601
点击左下角有个management选项—index patterns—create index pattern
----分别创建apache_error-* 和 apache_access-* 的索引