一、理论
ELK是一个开源实时日志分析平台,由ElasticSearch、Logstash和Kiabana三个开源工具组成。
elasticsearch是分布式搜索引擎,。特点是:分布式、零配置、自动发现、索引自动分片、索引副本机制、restful风格接口、多数据源、自动搜索负载等。
elasticsearch也是非关系型数据库
索引->库
类型->表
文档->记录
logstash是接受日志以及格式化日志的工具,它可以对日志进行收集、过滤,并将其存储供以后使用(如,搜索)。
kibana是图型化显示日志分析的工具,可以为logstash和elasticsearch提供日志分析友好的web界面。
elk日志处理分析过程
(1)将日志进行集中化管理。
(2)将日志格式化(logstash)并输出到elasticsearch。
(3)对格式化后的数据进行索引和存储(elasticsearch)。
(4)前端数据的展示(kibana)
二、实践
192.168.10.101 httpd+filebeat
192.168.10.102 logstash
192.168.10.103 elk1
192.168.10.104 elk2
103、104
[root@bogon ~]# setenforce 0
[root@bogon ~]# vim /etc/selinux/config
SELINUX=disabled
[root@bogon ~]# systemctl stop firewalld
[root@bogon ~]# systemctl disable firewalld
[root@bogon ~]# hostnamectl set-hostname elk1
[root@bogon ~]# bash
[root@bogon ~]# vim /etc/hosts
192.168.10.103 elk1
192.168.10.104 elk2
[root@elk1 ~]# useradd es
[root@elk1 ~]# passwd es
更改用户 es 的密码 。
新的密码:
无效的密码: 密码少于 8 个字符
重新输入新的密码:
passwd:所有的身份验证令牌已经成功更新。
[root@elk1 ~]# visudo
%wheel ALL=(ALL) NOPASSWD: ALL 120row
[root@elk1 ~]# gpasswd -a es wheel
[root@elk1 ~]# su - es
[es@elk1 ~]$ sudo dnf -y install java-11
[es@elk1 ~]$ sudo vim /etc/security/limits.conf
末尾添加
es soft nofile 65535
es hard nofile 65535
es soft nproc 65535
es hard nproc 65535
es soft memlock unlimited
es hard memlock unlimited
注:nofile的no是No的意思,表示数量。
es soft nofile 65535 一个进程最多能打开的文件数。
es hard nofile 65535
es soft nproc 65535 一个用户最多能创建的进程数。
es hard nproc 65535
es soft memlock unlimited 最大锁定内存地址空间(unlimited不限制)
es hard memlock unlimited
[es@elk1 ~]$ sudo vim /etc/sysctl.conf
vm.max_map_count=655360
注:
vm.max_map_count = 655360 默认值是65536,限制一个进程可以拥有的VMA(虚拟内存区域)的数量。
虚拟内存区域是一个连续的虚拟地址空间区域。在进程的生命周期中,每当程序尝试在内存中映射文件,链接到共享内存段,或者分配堆空间的时候,这些区域将被创建。
这个参数会影响中间件可以开启的线程数量,如果值过小,有时可能会导致有些中间件无法开启足够的线程,进而报错。
因有专门的命令重载/etc/security/limits.conf ,所以重启系统,重新读取/etc/security/limits.conf的内容。sysctl也会被重新读取。
[es@elk1 ~]$ cd /opt
[es@elk1 opt]$ ls
elasticsearch-7.10.0-linux-x86_64.tar.gz
[es@elk1 opt]$ sudo tar zxf elasticsearch-7.10.0-linux-x86_64.tar.gz
[es@elk1 opt]$ sudo mv elasticsearch-7.10.0 /etc/elasticsearch
[es@elk1 opt]$ cd /etc/elasticsearch/
[es@elk1 elasticsearch]$ ls
bin jdk LICENSE.txt modules plugins
config lib logs NOTICE.txt README.asciidoc
[es@elk1 elasticsearch]$ cd config
[es@elk1 config]$ ls
elasticsearch.yml jvm.options.d role_mapping.yml users
jvm.options log4j2.properties roles.yml users_roles
[es@elk1 config]$ sudo vim jvm.options
-Xms2g 22row
-Xmx2g 23row
注:
jvm(java虚拟机)提供了大量的参数配置,可以通过配置这些参数对jvm进行调优。
Xms
英文解释:initial heap size(in bytes)
中文释义:堆区初始值
使用方法:-Xms2g 或 -XX:InitialHeapSize=2048m
Xmx
英文解释:Maximum heap size(in bytes)
中文释义:堆区最大值
使用方法:-Xmx2g 或 -XX:MaxHeapSize=2048m
[es@elk1 config]$ sudo vim elasticsearch.yml
cluster.name: my-application #17
node.name: elk1 #23
path.data: /path/to/data #33
path.logs: /path/to/logs #37
bootstrap.memory_lock: false #43
network.host: 0.0.0.0 #55
http.port: 9200 #59
discovery.seed_hosts: ["elk1", "elk2"] #68
cluster.initial_master_nodes: ["elk1"] #72
注:
cluster.name: kgc-elk-cluster 群集名称。
node.name: elk1 本节点主机名,各节点更改各自名称。
path.data: /elk/data 数据文件路径。
path.logs: /elk/logs 日志文件路径。
bootstrap.memory_lock: false 锁定物理内存。
network.host: 0.0.0.0 监听地址。
http.port: 9200 监听端口。
discovery.seed_hosts: ["elk1", "elk2","elk3"] 群集中的主机列表。
cluster.initial_master_nodes: ["elk1"] master主机名称,群集的初始化会将此节点选举为master。
[es@elk1 config]$ sudo mkdir -p /path/to/data
[es@elk1 config]$ sudo mkdir -p /path/to/logs
[es@elk1 config]$ ll /path
总计 4
drwxr-xr-x 4 root root 4096 6月13日 10:13 to
[es@elk1 config]$ sudo chown -R es:es /path/to
[es@elk1 config]$ ll /path
总计 4
drwxr-xr-x 4 es es 4096 6月13日 10:13 to
[es@elk1 config]$ sudo chown -R es:es /etc/elasticsearch/
[es@elk1 config]$ ll /etc/elasticsearch/
总计 584
drwxr-xr-x 2 es es 4096 2020年11月10日 bin
drwxr-xr-x 3 es es 4096 6月13日 10:14 config
drwxr-xr-x 9 es es 4096 2020年11月10日 jdk
drwxr-xr-x 3 es es 4096 2020年11月10日 lib
-rw-r--r-- 1 es es 13675 2020年11月10日 LICENSE.txt
drwxr-xr-x 2 es es 4096 2020年11月10日 logs
drwxr-xr-x 53 es es 4096 2020年11月10日 modules
-rw-r--r-- 1 es es 544318 2020年11月10日 NOTICE.txt
drwxr-xr-x 2 es es 4096 2020年11月10日 plugins
-rw-r--r-- 1 es es 7313 2020年11月10日 README.asciidoc
[es@elk1 config]$ /etc/elasticsearch/bin/elasticsearch &
[1] 2111
注:Exception in thread "main" java.nio.file.AccessDeniedException: /etc/elasticsearch/config/elasticsearch.keystore 报这个错误,说明后面的文件所有者及所有组不是es,更改为es即可。
2025-06-13 10:43:03,061 main ERROR Null object returned for RollingFile in Appenders.
2025-06-13 10:43:03,065 main ERROR Unable to locate appender "rolling" for logger config "root"
出现这种错误,说明日志目录,es没有权限,授予权限即可。
[es@elk1 ~]$ netstat -anpt | grep 9200
tcp6 0 0 :::9200 :::* LISTEN 3305/java
浏览器访问:
http://192.168.10.103:9200/_cat/nodes
192.168.10.103 19 96 1 0.00 0.10 0.17 cdhilmrstw * elk1
192.168.10.104 6 83 1 0.08 0.48 0.38 cdhilmrstw - elk2
http://192.168.10.104:9200/_cat/nodes
192.168.10.104 7 83 2 0.11 0.45 0.37 cdhilmrstw - elk2
192.168.10.103 20 96 1 0.00 0.09 0.17 cdhilmrstw * elk1
102
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
[root@localhost ~]# dnf -y install java-11
[root@localhost ~]# tar zxf logstash-7.10.0-linux-x86_64.tar.gz
[root@localhost ~]# mv logstash-7.10.0 /etc/logstash
[root@localhost ~]# chmod -R 777 /etc/logstash/data/
/etc/logstash/bin/logstash -e "input {stdin{}} output{stdout{codec=> rubydebug} }"
[2025-03-01T12:22:33,642][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9600}
…略
{
"message" => "",
"@timestamp" => 2025-03-01T04:23:49.772Z,
"@version" => "1",
"host" => "localhost.localdomain"
}
1111
{
"message" => "1111",
"@timestamp" => 2025-03-01T04:23:53.559Z,
"@version" => "1",
"host" => "localhost.localdomain"
}
ooos
{
"message" => "ooos",
"@timestamp" => 2025-03-01T04:23:56.049Z,
"@version" => "1",
"host" => "localhost.localdomain"
}
[root@localhost config]# pwd
/etc/logstash/config
[root@localhost config]# vim system.conf
input {
file{
path => "/var/log/messages"
type => "system"
start_position =>"beginning"
}
}
output {
elasticsearch {
hosts => ["192.168.10.103:9200"]
index =>"system-%{+YYYY.MM.dd}"
}
}
[root@localhost logstash]# /etc/logstash/bin/logstash -f /etc/logstash/config/system.conf
[2025-03-01T12:42:01,747][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9600}
另开一个终端,查看进程状态
[root@localhost ~]# netstat -anpt |grep java
tcp6 0 0 127.0.0.1:9600 :::* LISTEN 2610/java
tcp6 0 0 192.168.10.102:43256 192.168.10.103:9200 ESTABLISHED 2610/java
tcp6 0 0 192.168.10.102:39694 192.168.10.103:9200 ESTABLISHED 2610/java
103
[es@elk1 ~]$ exit
注销
以root身份上传kibana压缩包到/opt,用es用户提权操作。
[es@elk1 opt]$ sudo tar zxf kibana-7.10.0-linux-x86_64.tar.gz
[es@elk1 opt]$ sudo mv kibana-7.10.0-linux-x86_64 /etc/kibana
[es@elk1 etc]$ sudo chown -R es:es /etc/kibana/
[es@elk1 opt]$ sudo vim /etc/kibana/config/kibana.yml
server.port: 5601 2row
server.host: "0.0.0.0" 7row
elasticsearch.hosts: "http://192.168.10.103:9200" 28row
kibana.index: ".kibana" 32row
i18n.locale: "zh-CN" 107row
[es@elk1 opt]$ /etc/kibana/bin/kibana &
…略
[03:19:04.277] [info][server][Kibana][http] http server running at http://0.0.0.0:5601
…略
[es@elk1 ~]$ sudo netstat -anpt | grep 5601
tcp 0 0 0.0.0.0:5601 0.0.0.0:* LISTEN 3946/node
浏览器访问
http://192.168.10.103:5601
定义索引->发现->查看数据(注意日期)
system-2025.03.01
Mar 1, 2025 @ 13:06:13.153 CgpYZ5cByOhdL5gpmjyh 1 Mar 1 13:06:12 localhost sftp-server[2723]: closedir "/etc/logstash/config"
Mar 1, 2025 @ 13:06:13.152 CApYZ5cByOhdL5gpmjyh 1 Mar 1 13:06:12 localhost sftp-server[2723]: opendir "/etc/logstash/config"
Mar 1, 2025 @ 13:06:13.152 CQpYZ5cByOhdL5gpmjyh 1 Mar 1 13:06:12 localhost sftp-server[2723]: opendir "/etc/logstash/config"
Mar 1, 2025 @ 13:06:10.145 BQpYZ5cByOhdL5gpjzzR 1 Mar 1 13:06:08 localhost sftp-server[2723]: opendir "/etc/logstash"
Mar 1, 2025 @ 13:06:10.145 BwpYZ5cByOhdL5gpjzzW 1 Mar 1 13:06:08 localhost sftp-server[2723]: closedir "/etc/logstash"
101
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# dnf -y install httpd
[root@localhost ~]# echo "ooos.com" > /var/www/html/index.html
[root@localhost ~]# systemctl start httpd
[root@localhost ~]# curl 192.168.10.101
ooos.com
[root@localhost ~]# tar zxf filebeat-7.10.0-linux-x86_64.tar.gz
[root@localhost ~]# mv filebeat-7.10.0-linux-x86_64 /etc/filebeat
[root@bogon filebeat]# vim filebeat.yml 清空里面所有内容
filebeat.inputs:
- type: log
paths:
- /var/log/httpd/access_log
output.logstash:
hosts: ["192.168.10.102:5044"]
[root@localhost ~]# vim /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535
* soft memlock unlimited
* hard memlock unlimited
[root@localhost ~]# reboot
[root@bogon ~]# /etc/filebeat/filebeat -c /etc/filebeat/filebeat.yml &
[1] 1672
[root@bogon ~]# jobs -l
[1]+ 1672 运行中 /etc/filebeat/filebeat -c /etc/filebeat/filebeat.yml &
102
[root@localhost config]# pwd
/etc/logstash/config
[root@localhost config]# vim beats.conf
input {
beats {
port => "5044"
codec => "json"
}
}
output{
elasticsearch {
hosts => ["192.168.10.103:9200"]
index => "weblog-beat-%{+YYYY.MM.dd}"
}
}
[root@localhost config]# /etc/logstash/bin/logstash -f /etc/logstash/config/beats.conf --path.data=/etc/logstash/config.d/web01 &
[2025-03-01T13:44:23,063][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9601}
[root@localhost config]# jobs -l
[1]- 2845 运行中 /etc/logstash/bin/logstash -f /etc/logstash/config/system.conf &
[2]+ 2937 运行中 /etc/logstash/bin/logstash -f /etc/logstash/config/beats.conf --path.data=/etc/logstash/config.d/web01 &
浏览器访问
http://192.168.10.103:5601
定义索引->发现->查看数据(注意日期)
weblog-beat-2025.06.13
Jun 13, 2025 @ 12:10:20.200 DAp7Z5cByOhdL5gpTTwN 1 192.168.10.103 - - [13/Jun/2025:12:10:10 +0800] "GET / HTTP/1.1" 200 9 "-" "curl/8.4.0"
Jun 13, 2025 @ 12:10:20.200 DQp7Z5cByOhdL5gpTTwN 1 192.168.10.103 - - [13/Jun/2025:12:10:11 +0800] "GET / HTTP/1.1" 200 9 "-" "curl/8.4.0"
Jun 13, 2025 @ 12:10:20.200 Dgp7Z5cByOhdL5gpTTwU 1 192.168.10.104 - - [13/Jun/2025:12:10:16 +0800] "GET / HTTP/1.1" 200 9 "-" "curl/8.4.0"
Jun 13, 2025 @ 12:02:00.041 Cwp5Z5cByOhdL5gpmzxs 1 192.168.10.101 - - [21/Apr/2025:12:22:36 +0800] "GET / HTTP/1.1" 200 9 "-" "curl/8.4.0"