ELK日志分析系统

发布于:2025-06-14 ⋅ 阅读:(14) ⋅ 点赞:(0)

一、理论
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"


网站公告

今日签到

点亮在社区的每一天
去签到