如果你现在或曾经负责检查和分析Linux中的系统日志,一般会知道如果同时监控多个服务,这项任务会变成一场噩梦。因为在过去,该任务大部分必须手动完成,每种日志类型都单独处理。
不过现在比较幸运的是,服务器端的Elasticsearch、Logstash和Kibana以及客户端的Filebeat相结合,使得这项曾经困难的任务如今看起来变得非常简单。前三个组件构成了所谓的ELK Stack(ELK 堆栈),其主要目的是同时从多个服务器收集日志(也称为集中式日志记录)。
一个内置的基于Java的Web界面使你能够快速浏览日志,以便更容易进行比较和故障排除。这些客户端日志由Filebeat发送到一个中央服务器,Filebeat可以被描述为一个日志传输代理。
测试环境配置
让我们看看所有这些部分是如何组合在一起,这里的测试环境将由以下机器组成:
中央服务器:RHEL系统,IP地址192.168.100.247 客户端计算机1:Fedora系统,IP地址192.168.100.133 客户端计算机2:Debian系统, IP地址192.168.0.134
请注意,ELK Stack(Elasticsearch、Logstash和Kibana)的RAM要求可能会根据数据量、查询复杂性和环境大小等因素而有所不同。
在RHEL上安装ELK Stack
我们首先在中央服务器(即RHEL 9系统)上安装ELK堆栈,相同的安装步骤也适用于基于RHEL发行版,例如Rocky Linux和Alma Linux。
这里简要解释一下每个组件的作用:
- Elasticsearch存储客户端发送的日志。
- Logstash处理这些日志。
- Kibana提供了Web界面,可以帮助我们检查和分析日志。
在中央服务器上安装以下软件包。首先,我们将安装Java JDK版本21(撰写本文时为最新版本),它是ELK组件的依赖项。当然,你也可以访问Java下载页面,看看是否有可用的更新版本。
yum update cd /opt wget https://download.oracle.com/java/21/latest/jdk-21_linux-x64_bin.rpm rpm -Uvh jdk-21_linux-x64_bin.rpm
是时候检查安装是否成功完成了:
java -version java version "21.0.2" 2024-03-6 LTS Java(TM) SE Runtime Environment (build 21.0.2+13-LTS-58) Java HotSpot(TM) 64-Bit Server VM (build 21.0.2+13-LTS-58, mixed mode, sharing)
另外,要安装最新版本的Elasticsearch、Logstash和Kibana,必须手动创建存储库,具体安装步骤如下所述。
在RHEL中安装Elasticsearch
将Elasticsearch公共GPG密钥导入rpm包管理器,命令如下:
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
接下来将以下行插入存储库配置文件elasticsearch.repo
当中:
具体目录为:/etc/yum.repos.d/elasticsearch.repo
[elasticsearch] name=Elasticsearch repository for 8.x packages baseurl=https://artifacts.elastic.co/packages/8.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=0 autorefresh=1 type=rpm-md
安装Elasticsearch包,命令如下:
yum install --enablerepo=elasticsearch elasticsearch
安装完成后,会提示启动并启用elasticsearch,如下图所示:
启动并启用该服务,命令如下:
systemctl daemon-reload systemctl enable elasticsearch systemctl start elasticsearch
记得允许流量通过防火墙中的TCP端口9200:
firewall-cmd --add-port=9200/tcp firewall-cmd --add-port=9200/tcp --permanent
现在使用curl命令检查Elasticsearch是否响应通过HTTP的简单请求:
curl -X GET http://localhost:9200
上述命令的输出应类似于:
确保完成上述步骤之后,然后继续Logstash。由于Logstash和Kibana共享Elasticsearch GPG密钥,因此无需在安装软件包之前重新导入它。
在RHEL中安装Logstash
将以下行插入存储库配置文件/etc/yum.repos.d/logstash.repo
当中:
[logstash-8.x] name=Elastic repository for 8.x packages baseurl=https://artifacts.elastic.co/packages/8.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md
安装Logstash包,命令如下:
yum install logstash
在 /etc/pki/tls/openssl.cnf
配置文件中的 [ v3_ca ]
部分下面的以下行添加一个基于ELK服务器IP地址的SSL证书:
[ v3_ca ] subjectAltName = IP: 192.168.100.247
生成365天有效的自签名证书:
# cd /etc/pki/tls # openssl req -config /etc/pki/tls/openssl.cnf -x509 -days 3650 -batch -nodes -newkey rsa:2048 -keyout private/logstash-forwarder.key -out certs/logstash-forwarder.crt
配置Logstash输入、输出和过滤器文件。
输入:创建 /etc/logstash/conf.d/input.conf
文件,并将以下行插入其中。这对于Logstash“学习”如何处理来自客户端的beats是必要的。确保证书和密钥的路径与前面步骤中概述的路径匹配:
input { beats { port => 5044 ssl => true ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt" ssl_key => "/etc/pki/tls/private/logstash-forwarder.key" } }
输出:/etc/logstash/conf.d/output.conf
配置文件中插入以下行:
output { elasticsearch { hosts => ["localhost:9200"] sniffing => true manage_template => false index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}" document_type => "%{[@metadata][type]}" } }
过滤: /etc/logstash/conf.d/filter.conf
) 配置文件插入以下行。为了简单起见,我们将记录系统日志消息:
filter { if [type] == "syslog" { grok { match => { "message" => "%{SYSLOGLINE}" } } date { match => [ "timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ] } } }
启动并启用logstash,命令如下:
systemctl daemon-reload systemctl start logstash systemctl enable logstash
最后配置防火墙以允许Logstash从客户端获取日志(TCP端口5044):
firewall-cmd --add-port=5044/tcp firewall-cmd --add-port=5044/tcp --permanent
在RHEL中安装Kibana
将以下行插入存储库配置文件/etc/yum.repos.d/kibana.repo
当中:
[kibana-8.x] name=Kibana repository for 8.x packages baseurl=https://artifacts.elastic.co/packages/8.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md
然后安装Kibana包,命令如下:
yum install kibana
启动并启用Kibana,命令如下:
systemctl daemon-reload systemctl start kibana systemctl enable kibana
确保你可以从另一台计算机访问Kibana的Web界面(允许TCP端口5601上的流量):
firewall-cmd --add-port=5601/tcp firewall-cmd --add-port=5601/tcp --permanent
启动Kibana以验证你是否可以访问Web界面:
http://localhost:5601 或者 http://IP.com:5601
在客户端机器上安装Filebeat
接下来将介绍如何对客户端1执行此操作(随后对客户端2重复此操作,请自行更改路径以便适用于你的发行版系统)。
使用scp命令将SSL证书从服务器复制到客户端:
scp /etc/pki/tls/certs/logstash-forwarder.crt root@192.168.100.133:/etc/pki/tls/certs/
将Elasticsearch公共GPG密钥导入到客户端计算机上的rpm包管理器:
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
在基于RHEL的发行版中为Filebeat ( /etc/yum.repos.d/filebeat.repo
)创建存储库 :
[elastic-8.x] name=Elastic repository for 8.x packages baseurl=https://artifacts.elastic.co/packages/8.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md
配置源以在基于Debian的发行版上安装Filebeat :
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add - sudo apt-get install apt-transport-https echo "deb https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-8.x.list
安装Filebeat包,命令如下:
yum install filebeat [在RHEL和基于其的发行版上] apt install filebeat [在Debian及其衍生版本上]
启动并启用Filebeat:
systemctl start filebeat systemctl enable filebeat
配置Filebeat
这里需要注意的是,Filebeat配置存储在YAML文件中,需要严格缩进。在编辑/etc/filebeat/filebeat.yml
时,请注意以下几点:
- 在paths下,指示哪些日志文件应“传送”到ELK服务器。
- 在prospectors下:
input_type: log document_type: syslog
- 在output下:
- 取消注释以logstash开头的行。
- 指示你的ELK服务器的IP地址以及Logstash在主机中侦听的端口。
- 确保证书的路径指向你在上面的步骤中(Logstash部分)中创建的实际文件。
上述步骤如下图所示:
保存更改,然后在客户端上重新启动Filebeat :
systemctl restart filebeat
一旦我们在客户端上完成了上述步骤,进行执行下面的步骤。
测试Filebeat
为了验证客户端的日志是否能够成功发送和接收,在ELK服务器上运行以下命令:
curl -XGET 'http://localhost:9200/filebeat-*/_search?pretty'
输出应类似于下面这样(注意来自客户端1和客户端2的/var/log/messages和/var/log/secure的消息正在被接收):
否则,请检查Filebeat配置文件是否有错误。
# journalctl -xe
尝试重新启动Filebeat 后,会将你指向有问题的行。
测试Kibana
在我们验证日志由客户端发送并在服务器上成功接收后。现在在Kibana中要做的第一件事是配置索引模式并将其设置为默认值。你可以将索引描述为关系数据库上下文中的完整数据库。我们将使用filebeat-*(或者你可以使用官方文档中解释的更精确的搜索条件)。
在“Index name or pattern”字段中输入filebeat-*,然后点击创建:
请注意,稍后你将被允许输入更精细的搜索条件。接下来,点击绿色矩形内部的星星图标,将其配置为默认的索引模式:
最后,在“Discover”菜单中,你将找到几个要添加到日志可视化报告中的字段。只需将鼠标悬停在它们上方并单击“Add”即可:
结果将显示在屏幕的中央区域,如上所示。请随意尝试(在日志报告中添加和删除字段)以熟悉Kibana。默认情况下,Kibana将显示过去15分钟内处理的记录(参见右上角),但你可以通过选择另一个时间范围来更改该行为:
概括
在本文中,小编简单解释了如何设置ELK堆栈来收集两个客户端(Fedora和Debian机器)发送的系统日志。现在你可以参考官方Elasticsearch文档,并找到有关如何使用此设置更有效地检查和分析日志的更多详细信息。