27.1 ELK介绍
27.2 ELK安装准备工作
27.3 安装es
27.4 配置es
27.5 curl查看es
27.6 安装kibana
27.7 安装logstash
27.8 配置logstash
27.9 kibana上查看日志
27.10 收集nginx日志
27.11 使用beats采集日志
需求背景
业务发展越来越庞大,服务器越来越多 各种访问日志、应用日志、错误日志量越来越多 开发人员排查问题,需要到服务器上查日志,不方便 运营人员需要一些数据,需要我们运维到服务器上分析日志
一、ELK介绍
官网https://www.elastic.co/cn/ 中文指南https://www.gitbook.com/book/chenryn/elk-stack-guide-cn/details ELK Stack (5.0版本之后) Elastic Stack == (ELK Stack + Beats) ELK Stack包含:ElasticSearch、Logstash、Kibana ElasticSearch是一个搜索引擎,用来搜索、分析、存储日志。它是分布式的,也就是说可以横向扩容,可以自动发现,索引自动分片,总之很强大。文档 https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html Logstash用来采集日志,把日志解析为json格式交给ElasticSearch。 Kibana是一个数据可视化组件,把处理后的结果通过web界面展示 Beats在这里是一个轻量级日志采集器,其实Beats家族有5个成员 早期的ELK架构中使用Logstash收集、解析日志,但是Logstash对内存、cpu、io等资源消耗比较高。相比 Logstash,Beats所占系统的CPU和内存几乎可以忽略不计 x-pack对Elastic Stack提供了安全、警报、监控、报表、图表于一身的扩展包,是收费的
ELK架构
二、 ELK安装准备工作
准备3台机器:
192.168.183.3 tobe01 192.168.183.33 tobe02 192.168.183.133 tobe03
角色划分:
3台全部安装elasticsearch(后续简称es) ,做个集群,其中1个主节点168.3,2个数据节点168.33,168.133 es主168.3上安装kibana 1台es数据节点168.33上安装logstash 3台机器全部安装jdk8(openjdk即可)
给三台机器做主机名设定,方便查看和管理
tobe02机器上的jdk是在官网安装的jdk,无需更改,其他没安装的机器需要yum install -y java-1.8.0-openjdk 安装openjdk
tobe01已经安装了,可以省略此步
三、ELK安装 – 安装es
官方文档 https://www.elastic.co/guide/en/elastic-stack/current/installing-elastic-stack.html
以下操作3台机器上都要执行
创建yum源,把KEY导入进来,简单说就是要导入密钥。 涉及到一个安全验证: https://www.cnblogs.com/musang/p/5856259.html
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
vim /etc/yum.repos.d/elastic.repo //加入如下内容,此处使用6.8.2版本
[elasticsearch-6.x] name=Elasticsearch repository for 6.x packages baseurl=https://artifacts.elastic.co/packages/6.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md yum install -y elasticsearch
也可以直接下载rpm文件,然后安装:这个是6.0版本的,可以下载所需版本
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.0.0.rpm rpm -ivh elasticsearch-6.0.0.rpm
安装完成后,需要做启动服务和开机启动,启动前需要做配置,需要做成es的分布式集群 ,如下“配置es”
四、ELK安装 – 配置es
rpm -ql elasticsearch 查看安装了哪些文件
elasticsearch配置文件:
/etc/elasticsearch/elasticsearch.yml elasticsearch本身相关的配置文件 /etc/sysconfig/elasticsearch 服务本身相关的配置
参考https://www.elastic.co/guide/en/elasticsearch/reference/6.0/rpm.html
在tobe01上编辑配置文件 :
vim /etc/elasticsearch/elasticsearch.yml //增加或更改
cluster.name: tobelinux node.name: tobelinux-01 node.master: true//意思是该节点为主节点 node.data: false 是否是数据节点 network.host: 192.168.183.3 最好只监听内网ip, 0.0.0.0是监听全部ip discovery.zen.ping.unicast.hosts: ["192.168.183.3", "192.168.183.33", "192.168.183.133"] 自动发现,可以写ip地址和主机名,主机名在定义hosts的情况下可以使用
scp elasticsearch.yml tobe02:/tmp/ 传到另外两台机器后进行修改,或者直接在另外两台修改配置文件
在tobe02和tobe03上同样编辑配置文件:
vim /etc/elasticsearch/elasticsearch.yml //增加或更改
cluster.name: tobelinux node.name: tobelinux-02 #tobe03是 tobelinux-03 node.master: false node.data: true network.host: 192.168.183.33 #tobe03是192.168.183.133 discovery.zen.ping.unicast.hosts: ["192.168.183.3", "192.168.183.33", "192.168.183.133"]
启动elasticsearch服务:
先启动主节点在启动数据节点: systemctl start elasticsearch 注意防火墙 ps aux |grep elasticsearch 查看进程是否启动,如果没有启动,查看日志文件
端口9200和9300
日志文件:
/var/log/elasticsearch 正常启动后,会在此目录生成日志文件 less /var/log/messages 失败后,如果上面的目录没有文件,可以再此处查看是否报错
注意此处是否需要在前面加export
修改后要source /etc/profile
ELK安装 – 安装x-pack(可省略):
3台机器上都要执行 cd /usr/share/elasticsearch/bin/ (可省略) ./elasticsearch-plugin install x-pack //如果速度慢,就下载x-pack压缩包(可省略) cd /tmp/; wget https://artifacts.elastic.co/downloads/packs/x-pack/x-pack-6.0.0.zip (可省略) ./elasticsearch-plugin install file:///tmp/x-pack-6.0.0.zip (可省略) 启动elasticsearch服务 systemctl enable elasticsearch.service systemctl start elasticsearch.service 以下操作只需要在130上执行 安装x-pack后就可以为内置用户设置密码了,如下 /usr/share/elasticsearch/bin/x-pack/setup-passwords interactive (可省略) curl localhost:9200 -u elastic //输入密码,可以查看到输出信息(可省略)
五、ELK安装 – curl查看es
tobe01上执行 :
curl '192.168.183.3:9200/_cluster/health?pretty' 健康检查,写绑定的内网ip green代表这个集群没有问题 curl '192.168.183.3:9200/_cluster/state?pretty' 集群详细信息,引号中的内容也可以在浏览器中直接访问 参考 http://zhaoyanblog.com/archives/732.html
六、ELK安装 – 安装kibana
tobe01:
版本号需要和Elasticsearch 相同
查看版本号:
rpm -qa elasticsearch kibana
以下只需要在tobe01上执行:
前面已经配置过yum源,这里就不用再配置了
安装kibana,成图像的工具:
yum install -y kibana 若速度太慢,可以直接下载rpm包 wget https://artifacts.elastic.co/downloads/kibana/kibana-6.0.0-x86_64.rpm rpm -ivh kibana-6.0.0-x86_64.rpm kibana同样也需要安装x-pack(可省略) 安装方法同elasticsearch的x-pack cd /usr/share/kibana/bin (可省略) ./kibana-plugin install x-pack //如果这样安装比较慢,也可以下载zip文件(可省略) wget https://artifacts.elastic.co/downloads/packs/x-pack/x-pack-6.0.0.zip//这个文件和前面下载的那个其实是一个(可省略) ./kibana-plugin install file:///tmp/x-pack-6.0.0.zip (可省略)
kibana是jenkins、jumpserver、zabbix等工具的图形界面 没有安装x-pack是不安全的,下面配置文件监听ip时,只监听内网ip 想在公网访问,可以使用nginx做代理,做代理的同时加安全认证
以下在tobe01,主上执行:
vim /etc/kibana/kibana.yml //增加或修改
server.port: 5601 默认端口5601 server.host: 192.168.183.3 elasticsearch.url: "http://192.168.183.3:9200" 主节点 logging.dest: /var/log/kibana.log 定义输出日志,默认在messages中 touch /var/log/kibana.log; chmod 777 /var/log/kibana.log 如果在配置文件中定义了日志路径才做此操作
配置完成启动:
systemctl start kibana 查看进程和端口: 端口5601 浏览器里直接访问http://192.168.183.3:5601/
用户名elastic,密码为之前你设置过的密码(如果未安装x-pack,不需要用户名密码)
若无法输入用户名密码,查日志/var/log/kibana.log
出现错误 Status changed from uninitialized to red - Elasticsearch is still initializing the kibana index.
解决办法:curl -XDELETE http://192.168.183.3:9200/.kibana -uelastic
七、ELK安装 – 安装logstash
以下在tobe02上执行:
logstash需要先安装java8,目前不支持java9
直接yum安装(配置源同前面es的源)
yum install -y logstash //如果慢,就下载rpm包,注意版本 wget https://artifacts.elastic.co/downloads/logstash/logstash-6.0.0.rpm rpm -ivh logstash-6.0.0.rpm logstash也需要安装x-pack(可省略) cd /usr/share/logstash/bin/(可省略) ./logstash-plugin install file:///tmp/x-pack-6.0.0.zip (可省略)
logstash收集syslog系统日志:
以下在tobe02上操作:
编辑子配置文件
vim /etc/logstash/conf.d/syslog.conf //编辑的文件都放到conf.d目录下,以.conf结尾,可以进行识别,加入如下内容
input { #进入的源 syslog { type => "system-syslog" port => 10514 } } output { #输出到哪里去 stdout { codec => rubydebug } }
检测配置文件是否有错,目录都在/usr/share/下
cd /usr/share/logstash/bin
./logstash --path.settings /etc/logstash/ -f /etc/logstash/conf.d/syslog.conf --config.test_and_exit
--path.settings 指定主配置文件所在目录,找logstash.yml
-f 指定配置的logstash相关的文件
--config.test_and_exit 检查完成后退出
以下在tobe02上操作:
vim /etc/rsyslog.conf//在#### RULES下面增加一行
*.* @@192.168.183.33:10514 把所有类型的文件都输出到10514端口
前台形式启动logstash
cd /usr/share/logstash/bin ./logstash --path.settings /etc/logstash/ -f /etc/logstash/conf.d/syslog.conf //这样可以在屏幕上查看到日志输出,不能敲命令
再开一个终端:
systemctl restart rsyslog
检测是否开启10514端口:netstat -lntp
从tobe01ssh到tobe02上,可以在logstash前台的终端上看到ssh登录的相关日志
结束logstash,在前台的那个终端上按ctrl c
刚刚显示日志输出的屏幕可以看到输出的日志,以json格式显示
八、配置logstash
以下在tobe02上操作:
编辑配置文件
vim /etc/logstash/conf.d/syslog.conf //配置文件,把内容改为如下
input { syslog { type => "system-syslog" port => 10514 } } output { elasticsearch { hosts => ["192.168.183.3:9200"] index => "system-syslog-%{+YYYY.MM}" #定义索引 } }
检测:
cd /usr/share/logstash/bin ./logstash --path.settings /etc/logstash/ -f /etc/logstash/conf.d/syslog.conf --config.test_and_exit systemctl start logstash //启动需要一些时间,启动完成后,可以看到9600端口和10514端口已被监听 ls /var/log/logstash/logstash-plain.log 日志文件 ls /etc/logstash/logstash.yml logstash 配置文件
查询日志时,发现没有内容写入,查看启动用户是logstash,日志文件的属主属组都是root,导致无法写入日志,无法查看错误日志
更改属主: chown logstash /var/log/logstash/logstash-plain.log systemctl restart logstash 重启后,发现另外的文件也没有权限
logstash-plain.log
更改属主: chown -R logstash /var/lib/logstash/ systemctl restart logstash
此时可以看到9600端口和10514端口已被监听
tobe01上执行:
curl '192.168.183.3:9200/_cat/indices?v' 可以获取索引信息 curl -XGET '192.168.183.3:9200/system-syslog-2019.08?pretty' 可以获指定索引(system-syslog-2019.08)详细信息 curl -XDELETE 'localhost:9200/logstash-xxx-*' 可以删除指定索引
九、kibana上查看日志
配置索引:
浏览器访问192.168.183.3:5601,到kibana配置索引
左侧点击“Managerment”-> “Index Patterns”-> “Create Index Pattern”
Index pattern这里需要根据前面curl查询到的索引名字(system-syslog-2019.08)来写,此处写成:system-syslog-*,用*表示所有,否则下一步的按钮是无法点击的,时间过滤器字段名称:@timestamp
这个操作是把es中的索引,放到kibana中去,在kibana中查看日志,可以根据需求增加索引
可以在Discover中选择对应的索引去查看日志,这个日志对应的是/var/log/message中的日志
此处的日志信息和message中的数据是相同的
十、logstash收集nginx日志
在tobe02安装logstash的机器上做新得配置文件nginx.conf:
编辑配置文件
vim /etc/logstash/conf.d/nginx.conf //加入如下内容
input { file { #直接指定一个文件 path => "/tmp/elk_access.log" start_position => "beginning" type => "nginx" } } filter { #对日志进行过滤 grok { #定义日志输出格式 match => { "message" => "%{IPORHOST:http_host} %{IPORHOST:clientip} - %{USERNAME:remote_user} \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:http_verb} %{NOTSPACE:http_request}(?: HTTP/%{NUMBER:http_version})?|%{DATA:raw_http_request})\" %{NUMBER:response} (?:%{NUMBER:bytes_read}|-) %{QS:referrer} %{QS:agent} %{QS:xforwardedfor} %{NUMBER:request_time:float}"} } geoip { source => "clientip" } } output { stdout { codec => rubydebug } elasticsearch { hosts => ["192.168.183.33:9200"] index => "nginx-test-%{+YYYY.MM.dd}" } }
检测配置文件是否有错:
cd /usr/share/logstash/bin ./logstash --path.settings /etc/logstash/ -f /etc/logstash/conf.d/nginx.conf --config.test_and_exit
yum install -y nginx 如果没有nginx,需要安装
有的话,直接写一个虚拟主机的配置文件:
vim /etc/nginx/conf.d/elk.conf//写入如下内容
server { listen 80; server_name elk.tobe.com; location / { proxy_pass http://192.168.183.3:5601; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } access_log /tmp/elk_access.log main2; #此处定义的日志路径是和/etc/logstash/conf.d/nginx.conf配置文件对应的 }
定义main2的日志格式:
cd /etc/nginx
vim /etc/nginx/nginx.conf //增加如下内容
log_format main2 '$http_host $remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$upstream_addr" $request_time'; nginx -t 检测 nginx -s reload systemctl restart nginx 看是否需要重启logstash :systemctl restart logstash
绑定hosts 192.168.183.33 elk.tobe.com 浏览器访问elk.tobe.com 检查日志文件是否生成
tobe01上检查是否有nginx-test开头的索引生成 :
curl '192.168.183.3:9200/_cat/indices?v'
如果有,才能到kibana里去配置该索引
左侧点击“Managerment”-> “Index Patterns”-> “Create Index Pattern”
Index pattern这里写nginx-test-*,创建完之后点击左侧的Discover,选择对应的nginx-test日志,会显示生成的nginx的日志
十一、使用Beats采集日志---Filebeat
可扩展,支持自定义构建 https://www.elastic.co/cn/products/beats
在tobe03上执行:
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.0.0-x86_64.rpm rpm -ivh filebeat-6.0.0-x86_64.rpm
filebeat日志文件:
ls /var/log/filebeat/filebeat
首先编辑配置文件:
vim /etc/filebeat/filebeat.yml //增加或者更改,注意语法缩进的空格,使其在屏幕上做一个简单的输出
filebeat.prospectors: - type: log paths: - /var/log/messages
output.console: enable: true
配置完成:
/usr/share/filebeat/bin/filebeat -c /etc/filebeat/filebeat.yml //可以在屏幕上看到对应的日志信息 -c指定配置文件
此时会在终端上把/var/log/messages中产生的日志显示出来
再编辑配置文件,已服务的角色出现
vim /etc/filebeat/filebeat.yml //增加或者更改
此处不变: filebeat.prospectors: - type: log paths: - /var/log/messages
更改此处:
output.elasticsearch: hosts: ["192.168.183.3:9200"]
开启filebeat:
systemctl start filebeat
在tobe01上查看filebeat索引:
curl '192.168.183.3:9200/_cat/indices?v'
到kibana里去配置该索引:
左侧点击“Managerment”-> “Index Patterns”-> “Create Index Pattern”
Index pattern这里写filebeat-*,创建完之后点击左侧的Discover,选择对应的filebeat日志
扩展部分
x-pack 收费,免费 http://www.jianshu.com/p/a49d93212eca https://www.elastic.co/subscriptions Elastic stack演进 http://70data.net/1505.html 基于kafka和elasticsearch,linkedin构建实时日志分析系统 http://t.cn/RYffDoE 使用redis http://blog.lishiming.net/?p=463 ELK+Filebeat+Kafka+ZooKeeper 构建海量日志分析平台 https://www.cnblogs.com/delgyd/p/elk.html http://www.jianshu.com/p/d65aed756587