案例:ELK日志分析系统

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
日志服务 SLS,月写入数据量 50GB 1个月
简介: 案例:ELK日志分析系统

       ELK是一套完整的日志集中处理方案,ElasticSearch、Logstash和Kiabana三个开源工具组合使用,可以完成更强大的用户对日志的查询、排序、统计。

Elasticsearch:用于日志的存储和分析

Logstash:用于日志的收集

Kibana:用于查看日志

案例环境

   🍎准备三台虚拟机,根据下图配置IP,关闭防火墙和Selinux。node1节点和node2节点分配4GB内存,Apache节点1GB内存。

🍎实现功能:

       配置ELK日志分析群集。

       使用Logstash收集日志。

       使用Kibana查看分析日志。

       在两个ELK节点上配置域名解析,通过本地/etc/hosts文件实现。

🍎Node1配置

1. [root@localhost ~]# hostnamectl set-hostname node1
2. [root@localhost ~]# bash
3. [root@node1 ~]# vim /etc/hosts
4. 192.168.1.10 node1                                          //插入下列两行配置
5. 192.168.1.20 node2
6. [root@node1 ~]# java -version                               //检查Java环境
7. openjdk version "1.8.0_102"
8. OpenJDK Runtime Environment (build 1.8.0_102-b14)
9. OpenJDK 64-Bit Server VM (build 25.102-b14, mixed mode)

🍎Node2配置

1. [root@localhost ~]# hostnamectl set-hostname node2
2. [root@localhost ~]# bash
3. [root@node2 ~]# 
4. [root@node2 ~]# vim /etc/hosts
5. 192.168.1.10 node1                                          //插入下列两行配置
6. 192.168.1.20 node2
7. [root@node2 ~]# java -version                               //检查Java环境
8. openjdk version "1.8.0_102"
9. OpenJDK Runtime Environment (build 1.8.0_102-b14)
10. OpenJDK 64-Bit Server VM (build 25.102-b14, mixed mode)

部署Elasticsearch

      🍓Node1和Node2节点都需要部署Elasticsearch软件,下面以Node1节点为例,Node2节点配置与Node1节点相同(下方配置文件中节点名字分别为node1和node2)。

安装Elasticsearch

1. [root@node1 ~]# mount /dev/cdrom /media
2. mount: /dev/sr0 is write-protected, mounting read-only
3. [root@node1 ~]# rpm -ivh /media/elasticsearch-5.5.0.rpm 
4. warning: /media/elasticsearch-5.5.0.rpm: Header V4 RSA/SHA512 Signature, key ID d88e42b4: NOKEY
5. Preparing...                          ################################# [100%]
6. Creating elasticsearch group... OK
7. Creating elasticsearch user... OK
8. Updating / installing...
9.   1:elasticsearch-0:5.5.0-1          ################################# [100%]
10. ### NOT starting on installation, please execute the following statements to configure elasticsearch service to start automatically using systemd
11.  sudo systemctl daemon-reload
12.  sudo systemctl enable elasticsearch.service
13. ### You can start elasticsearch service by executing
14.  sudo systemctl start elasticsearch.service

       🍓加载系统服务

1. [root@node1 ~]# systemctl daemon-reload
2. [root@node1 ~]# systemctl enable elasticsearch
3. Created symlink from /etc/systemd/system/multi-user.target.wants/elasticsearch.service to /usr/lib/systemd/system/elasticsearch.service.

更改主配置文件

       🍒以下配置注意去除注释

1. [root@node1 ~]# vim /etc/elasticsearch/elasticsearch.yml 
2. cluster.name: my-elk-cluster                    //群集名字
3. node.name: node1                                //节点名字(注意,节点2名字改为node2)
4. path.data: /data/elk_data                       //数据存放路径
5. path.logs: /var/log/elasticsearch/              //日志存放路径
6. bootstrap.memory_lock: false                    //在启动的时候不锁定内存
7. network.host: 0.0.0.0                           //提供服务绑定的IP地址,0.0.0.0代表所有地址
8. http.port: 9200                                 //侦听端口
9. discovery.zen.ping.unicast.hosts: ["node1", "node2"]        //群集发现通过单播实现

       🍒创建数据存放路径并授权。

1. [root@node1 ~]# mkdir -p /data/elk_data
2. [root@node1 ~]# chown elasticsearch:elasticsearch /data/elk_data/

       🍒启动并查看端口号

1. [root@node1 ~]# systemctl start elasticsearch.service 
2. [root@node1 ~]# netstat -anpt | grep 9200               //启动后需要稍等一会(30秒)才能查到端口号
3. tcp6       0      0 :::9200                 :::*                    LISTEN      4952/java

      🍒配置完node1节点后,继续配置node2节点。注意修改主配置文件时,名字的区分。

查看节点信息

       🍑在Node1上,打开浏览器输入http://192.168.1.10:9200,可以看到node1的信息。

       🍑在Node2上,打开浏览器输入http://192.168.1.20:9200,可以看到node2的信息。

       🍑通过浏览器输入http://192.168.1.10:9200/_cluster/health?pretty查看群集的健康情况,可以看到status值为green,表示节点健康运行。

       🍑通过浏览器输入http://192.168.1.10:9200/_cluster/state?pretty查看群集的状态信息。

       🍤通过上述方式查看群集状态对用户并不友好,可以通过安装Elasticsearch-head插件,更好地管理群集。

安装Elasticsearch-head插件

🌶️在node1节点安装即可。

       安装Elasticsearch-head插件需要作为独立服进行安装,需要npm命令,需要提前安装node和phantomjs,node编译安装时间较久,大约40min,耐心等待。

编译安装node

1. [root@node1 ~]# tar zxf /media/node-v8.2.1.tar.gz -C /usr/src
2. [root@node1 ~]# cd /usr/src/node-v8.2.1/
3. [root@node1 node-v8.2.1]# ./configure && make && make install

安装phantomjs

1. [root@node1 node-v8.2.1]# tar jxf /media/phantomjs-2.1.1-linux-x86_64.tar.bz2 -C /usr/src
2. [root@node1 node-v8.2.1]# cd /usr/src/phantomjs-2.1.1-linux-x86_64/bin/
3. [root@node1 bin]# cp phantomjs /usr/local/bin/

安装Elasticsearch-head

1. [root@node1 node-v8.2.1]# tar jxf /media/phantomjs-2.1.1-linux-x86_64.tar.bz2 -C /usr/src
2. [root@node1 node-v8.2.1]# cd /usr/src/phantomjs-2.1.1-linux-x86_64/bin/
3. [root@node1 bin]# cp phantomjs /usr/local/bin/
4. [root@node1 bin]# tar zxf /media/elasticsearch-head.tar.gz -C /usr/src
5. [root@node1 bin]# cd /usr/src/elasticsearch-head/
6. [root@node1 elasticsearch-head]# npm install                        //安装依赖包
7. npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@^1.0.0 (node_modules/karma/node_modules/chokidar/node_modules/fsevents):
8. npm WARN network SKIPPING OPTIONAL DEPENDENCY: request to https://registry.npmjs.org/fsevents failed, reason: getaddrinfo ENOTFOUND registry.npmjs.org registry.npmjs.org:443
9. npm WARN elasticsearch-head@0.0.0 license should be a valid SPDX license expression
10. 
11. up to date in 3.826s

修改主配置文件

1. [root@node1 elasticsearch-head]# vim /etc/elasticsearch/elasticsearch.yml 
2. http.cors.enabled: true                             //开启跨域访问支持,默认为false
3. http.cors.allow-origin: "*"                         //跨域访问允许的域名地址
4. [root@node1 elasticsearch-head]# systemctl restart elasticsearch

🌶️启动服务

       🍤必须在解压后的elasticsearch-head目录下启动,进程会读取该目录下的gruntifile.js文件,否则会启动失败。

1. [root@node1 elasticsearch-head]# npm run start &                //前台启动,一旦关闭中断,服务也将关闭
2. [1] 88586
3. [root@node1 elasticsearch-head]# 
4. > elasticsearch-head@0.0.0 start /usr/src/elasticsearch-head
5. > grunt server
6. 
7. Running "connect:server" (connect) task
8. Waiting forever...
9. Started connect web server on http://localhost:9100             //输入回车键确认

       🍤查看端口号,elasticsearch-head监听端口为9100

1. [root@node1 elasticsearch-head]# netstat -anpt | grep 9100
2. tcp        0      0 0.0.0.0:9100            0.0.0.0:*               LISTEN      88599/grunt         
3. [root@node1 elasticsearch-head]# netstat -anpt | grep 9200
4. tcp6       0      0 :::9200                 :::*                    LISTEN      88492/java

查看信息

       🍉通过Elasticsearch-head查看Elasticsearch信息。浏览器访问http://192.168.1.10:9100连接群集,可以看到群集健康值为绿色。单击浏览数据,可以查看索引信息,此时索引为空。

插入索引

       🍉通过命令插入一个测试索引,通过输出信息可以看到索引为index-demo,类型为test。

[root@node1 ~]# curl -XPUT  'localhost:9200/index-demo/test/1?pretty&pretty' -H  'Content-Type: application/json' -d '{"user":"zhangsan","mesg":"hello world"}'

       🍉刷新浏览器,可以看到创建成功的索引。

       🍉选择”Overview“选项卡,还可以看到索引默认被分片成5个,且在一个副本。

Logstash安装及使用方法

       🍇logstash一般部署在需要监控其日志的服务器中,本次案例安装在apache服务器上,用于收集apache服务器的日志信息并发送到elasticsearch中。首先在Node1上部署logstash,安装logstash前也需要java环境。

安装logstash

     🍇在node1安装即可。

1. [root@node1 ~]# mount /dev/cdrom /media
2. mount: /dev/sr0 is write-protected, mounting read-only
3. [root@node1 ~]# rpm -ivh /media/logstash-5.5.1.rpm 
4. warning: /media/logstash-5.5.1.rpm: Header V4 RSA/SHA512 Signature, key ID d88e42b4: NOKEY
5. Preparing...                          ################################# [100%]
6. Updating / installing...
7.   1:logstash-1:5.5.1-1               ################################# [100%]
8. Using provided startup.options file: /etc/logstash/startup.options
9. Successfully created system startup script for Logstash
10. [root@node1 ~]# systemctl start logstash
11. [root@node1 ~]# ln -s /usr/share/logstash/bin/logstash /usr/local/bin

测试logstash

       🍇命令行常用选项如下:

-f:通过这个选项可以指定logstash的配置文件,根据配置文件配置logstash。

-e:后面紧跟着字符串,该字符串可以被当作logstash的配置(如果是“ ”,则默认使用stdin作为输入,stdout作为输出)。

-t:测试配置文件是否正确,然后退出。

       🍇logstash命令使用方法如下:

1. [root@node1 ~]# logstash   -e  'input { stdin{} } output { stdout{}}'
2. ......//省略部分内容
3. The stdin plugin is now waiting for input:
4. 13:41:27.401 [Api Webserver] INFO  logstash.agent - Successfully started Logstash API endpoint {:port=>9600}
5. www.aaa.com                     //键盘输入内容
6. 2022-08-05T05:41:35.419Z node1 www.aaa.com      //输出的结果
7. www.bbb.com                     //键盘输入内容
8. 2022-08-05T05:41:39.528Z node1 www.bbb.com      //输出的结果
9. 
10. //按Ctrl+c退出
11. //使用rubydebug显示详细输出
1. [root@node1 ~]# logstash   -e  'input { stdin{} } output { stdout{ codec=>rubydebug }}'
2. The stdin plugin is now waiting for input:
3. 13:44:57.024 [Api Webserver] INFO  logstash.agent - Successfully started Logstash API endpoint {:port=>9600}
4. www.aaa.com                 //键盘输入内容
5. {                           //下列输出的结果
6.    "@timestamp" => 2022-08-05T05:45:19.182Z,
7.      "@version" => "1",
8.          "host" => "node1",
9.       "message" => "www.aaa.com"
10. }
11. 
12. //使用logstash信息写入elasticsearch中
1. [root@node1 ~]# logstash   -e  'input { stdin{} } output { elasticsearch {hosts=>["192.168.1.10:9200"]}}'
2. The stdin plugin is now waiting for input:
3. 13:47:17.910 [Api Webserver] INFO  logstash.agent - Successfully started Logstash API endpoint {:port=>9600}
4. www.aaa.com             //键盘输入内容
5. www.bbb.com             //键盘输入内容
6. www.ccc.com             //键盘输入内容
7. //结果不在标准输出显示,而是发送至elasticsearch中

       🍇在Elasticsearch中查看logstash新增的索引。

       🍇查看索引对应的内容。

logstash配置文件

       🥭logstash配置文件基本由三部分组成:input、output以及filter。因此标准的配置文件格式如下:

input {...}

filter {...}

output {...}

       🥭修改配置文件,让其收集系统日志/var/log/messages,并将其输出到elasticsearch中。

1. [root@node1 ~]# chmod o+r /var/log/messages
2. [root@node1 ~]# ll /var/log/messages 
3. -rw----r--. 1 root root 654037 Aug  5 13:55 /var/log/messages
4. [root@node1 ~]# vim /etc/logstash/conf.d/system.conf
5. input {
6.     file{
7.         path => "/var/log/messages"
8.         type => "system"
9.         start_position => "beginning"
10.     }
11. }
12. output {
13.     elasticsearch {
14.         hosts => ["192.168.1.10:9200"]
15.         index => "system-%{+YYYY.MM.dd}"
16.     }
17. }

       🥭完成后,通过浏览器查看elasticsearch的信息。

       🥭查看索引下的日志信息

安装kibana

       🧀在node1服务器安装kibana,设置开机启动。

1. [root@node1 ~]# rpm -ivh /media/kibana-5.5.1-x86_64.rpm 
2. warning: /media/kibana-5.5.1-x86_64.rpm: Header V4 RSA/SHA512 Signature, key ID d88e42b4: NOKEY
3. Preparing...                          ################################# [100%]
4. Updating / installing...
5.   1:kibana-5.5.1-1                   ################################# [100%]
6. [root@node1 ~]# systemctl enable kibana

       🧀设置kibana的主配置文件

1. [root@node1 ~]# vim /etc/kibana/kibana.yml 
2. ####下面配置删掉注释
3. server.port: 5601                   //kibana端口号
4. server.host: "0.0.0.0"              //kibana侦听的地址
5. elasticsearch.url: "http://192.168.1.10:9200"           //和elasticsearch建立连接
6. kibana.index: ".kibana"             //在elasticsearch中添加.kibana索引

       🧀启动kibana服务

[root@node1 ~]# systemctl start kibana

       🧀验证kibana,通过浏览器访问http://192.168.1.10:5601,第一次登录需要添加elasticsearch索引,添加前面创建的索引system-2022.08.05。

       🧀查看索引默认字段

       🧀单击查看“Discover”按钮查看图表信息及日志信息。

       🧀可以分类显示,“Available Fields”中的“host”,然后单击“add”按钮后,可以看到按照“host”筛选后的结果。

Apache配置

       🍤启动apache,并查看网页是否成功!将apache服务器的日志添加到elasticsearch并通过kibana显示。

[root@localhost ~]# systemctl restart httpd

       🍤在apache服务器上安装logstash,以便将收集的日志发送到elasticsearch中。

1. [root@localhost ~]# java -version
2. openjdk version "1.8.0_102"
3. OpenJDK Runtime Environment (build 1.8.0_102-b14)
4. OpenJDK 64-Bit Server VM (build 25.102-b14, mixed mode)
5. [root@localhost ~]# eject
6. [root@localhost ~]# mount /dev/cdrom /media
7. mount: /dev/sr0 is write-protected, mounting read-only
8. [root@localhost ~]# rpm -ivh /media/logstash-5.5.1.rpm 
9. [root@localhost ~]# systemctl daemon-reload 
10. [root@localhost ~]# systemctl enable logstash

       🍤编写logstash配置文件。

1. [root@localhost ~]# cd /etc/logstash/conf.d/
2. [root@localhost conf.d]# vim apache_log.conf 
3. input {
4.  file{
5.   path => "/etc/httpd/logs/access_log"
6.   type => "access"
7.   start_position => "beginning"
8. }
9.  file{
10.                 path => "/etc/httpd/logs/error_log"
11.                 type => "error"
12.                 start_position => "beginning"
13. }
14. }
15. output {
16. if [type] == "access" {
17.     elasticsearch {
18.   hosts => ["192.168.1.10:9200"]
19.   index => "apache_access-%{+YYYY.MM.dd}"
20.          }
21.  }
22. if [type] == "error" {
23.            elasticsearch {
24.                 hosts => ["192.168.1.10:9200"]
25.                 index => "apache_error-%{+YYYY.MM.dd}"
26.                 }
27.         }
28. }
29. [root@localhost conf.d]# /usr/share/logstash/bin/logstash -f apache_log.conf
30. //执行后不要强行暂停

       🍤通过浏览器访问http://192.168.1.10:9100查看索引是否创建。

       🍤登录kibana,单击“Create index Pattern”按钮添加索引。

       🍤在索引名中输入之前配置的Output前缀“apache_error”,并单击“Create”按钮。

       🍤相同方法添加“apache_access”

       🍤选择“Discover”选项卡,在中间下拉列表中选择刚添加的"apache_access-*"索引,可以查看相应的图表及日志信息,还可以根据Fields进行归类显示。

        🍤:哇,不是吧!真的有人看完了文章!看都看完了那不得点个赞再走吗。

                                             


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
2月前
|
存储 消息中间件 网络协议
日志平台-ELK实操系列(一)
日志平台-ELK实操系列(一)
|
3天前
|
存储 监控 安全
|
12天前
|
XML JSON 监控
告别简陋:Java日志系统的最佳实践
【10月更文挑战第19天】 在Java开发中,`System.out.println()` 是最基本的输出方法,但它在实际项目中往往被认为是不专业和不足够的。本文将探讨为什么在现代Java应用中应该避免使用 `System.out.println()`,并介绍几种更先进的日志解决方案。
35 1
|
19天前
|
监控 网络协议 安全
Linux系统日志管理
Linux系统日志管理
34 3
|
25天前
|
监控 应用服务中间件 网络安全
#637481#基于django和neo4j的日志分析系统
#637481#基于django和neo4j的日志分析系统
32 4
|
25天前
|
存储 数据可视化 安全
一个简单案例,带你看懂GC日志!
一个简单案例,带你看懂GC日志!
一个简单案例,带你看懂GC日志!
|
2月前
|
Prometheus Cloud Native Go
Golang语言之Prometheus的日志模块使用案例
这篇文章是关于如何在Golang语言项目中使用Prometheus的日志模块的案例,包括源代码编写、编译和测试步骤。
46 3
Golang语言之Prometheus的日志模块使用案例
|
1月前
|
监控 Linux 测试技术
Linux系统命令与网络,磁盘和日志监控总结
Linux系统命令与网络,磁盘和日志监控总结
51 0
|
1月前
|
监控 Linux 测试技术
Linux系统命令与网络,磁盘和日志监控三
Linux系统命令与网络,磁盘和日志监控三
36 0
|
2月前
|
JSON 缓存 fastjson
一行日志引发的系统异常
本文记录了一行日志引发的系统异常以及作者解决问题的思路。