本教程详细介绍了如何构建监控管道以使用 ELK 7.2 和 Rsyslog 分析 Linux 日志。
如果您是系统管理员,甚至是好奇的应用程序开发人员,您很有可能会定期挖掘日志以在其中找到宝贵的信息。
有时您可能想要监控虚拟机上的SSH 入侵。
有时,您可能希望查看应用程序服务器在某一天、一个非常特定的时间引发了哪些错误。或者,您可能想了解谁在您的一个虚拟机上停止了您的 systemd 服务。
如果您在其中一个方面描绘自己,那么您可能是在正确的教程上。
在本教程中,我们将使用 ELK 堆栈(ElasticSearch、Logstash 和 Kibana)和 Rsyslog 作为强大的 syslog 服务器来构建完整的日志监控管道。
在进一步讨论并立即进入技术考虑之前,让我们先谈谈为什么要使用 Kibana 监控 Linux 日志。
目录
监控 Linux 日志至关重要,每个 DevOps 工程师都应该知道如何去做。原因如下:
如果您遵循本教程,您将学到很多东西:
本教程的先决条件如下:
事不宜迟,让我们开始吧!
在详细介绍我们的日志监控架构是什么样子之前,让我们先回到过去。
从历史上看,Linux 日志记录从syslog 开始。
Syslog 是 1980 年开发的一种协议,旨在标准化日志的格式化方式,不仅适用于 Linux,而且适用于任何交换日志的系统。
从那里开始,系统日志服务器被开发并嵌入了处理系统日志消息的能力。
它们迅速发展到功能,例如过滤、具有内容路由能力,或者可能是此类服务器的关键特性之一:存储日志和轮换它们。
Rsyslog 的开发牢记这一关键功能:具有模块化和可定制的方式来处理日志。
模块化将通过模块来处理,并通过日志模板进行定制。
在某种程度上,rsyslog 可以从许多不同的来源摄取日志,并且可以将它们转发到更广泛的目的地集。这就是我们将在教程中使用的内容。
这是我们将用于本教程的最终架构。
现在我们知道了我们前进的方向,让我们安装所需的不同工具。
在安装 ELK 堆栈之前,您需要在计算机上安装 Java。
为此,请运行以下命令:
$ sudo apt-get install default-jre
在编写本教程时,此实例运行OpenJDK 版本 11。
ubuntu:~$ java -version
openjdk version "11.0.3" 2019-04-16
OpenJDK Runtime Environment (build 11.0.3+7-Ubuntu-1ubuntu218.04.1)
OpenJDK 64-Bit Server VM (build 11.0.3+7-Ubuntu-1ubuntu218.04.1, mixed mode, sharing)
对于本教程,我将使用 Ubuntu 机器,但将提供 Debian 机器的详细信息。
首先,将 GPG 密钥添加到您的 APT 存储库。
$ wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
然后,您可以将 Elastic 源添加到您的 APT 源列表文件中。
$ echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.list
$ cat /etc/apt/sources.list.d/elastic-7.x.list
deb https://artifacts.elastic.co/packages/7.x/apt stable main
$ sudo apt-get update
从那里,您应该准备好安装 ELK 堆栈中的每个工具。
让我们从 ElasticSearch 开始。
ElasticSearch 是由 Elastic 构建的搜索引擎,可将数据存储在索引中以实现非常快速的检索。
要安装它,请运行以下命令:
$ sudo apt-get install elasticsearch
以下命令将自动:
首次启动时,该服务处于非活动状态,启动它并确保一切运行顺利。
$ sudo systemctl start elasticsearch
● elasticsearch.service - Elasticsearch
Loaded: loaded (/usr/lib/systemd/system/elasticsearch.service; disabled; vendor preset: enabled)
Active: active (running) since Mon 2019-07-08 18:19:45 UTC; 2 days ago
Docs: http://www.elastic.co
为了确保 ElasticSearch 实际运行,您可以执行以下两个命令之一:
$ sudo lsof -i -P -n | grep LISTEN | grep 9200
java 10667 elasticsearch 212u IPv6 1159208890 0t0 TCP [::1]:9200 (LISTEN)
java 10667 elasticsearch 213u IPv6 1159208891 0t0 TCP 127.0.0.1:9200 (LISTEN)
$ curl -XGET 'http://localhost:9200/_all/_search?q=*&pretty'
您的 ElasticSearch 实例已设置完毕!
现在,让我们安装 Logstash 作为我们的日志收集和过滤工具。
如果您之前添加了 Elastic 包,那么安装 Logstash 就像执行一样简单:
$ sudo apt-get install logstash
同样,将创建一个 Logstash 服务,您需要激活它。
$ sudo systemctl status logstash
$ sudo systemctl start logstash
默认情况下,Logstash 侦听端口 9600 上的指标。和我们之前所做的一样,列出您计算机上的开放端口以查找该特定端口。
$ sudo lsof -i -P -n | grep LISTEN | grep 9600
java 28872 logstash 79u IPv6 1160098941 0t0 TCP 127.0.0.1:9600 (LISTEN)
伟大的!
我们只需要安装 Kibana 即可完成整个设置。
提醒一下,Kibana 是为 ElasticSearch 量身定制的可视化工具,用于监控我们的最终日志。
并不奇怪,但这里是安装 Kibana 的命令:
$ sudo apt-get install kibana
像往常一样,启动服务并验证它是否正常工作。
$ sudo systemctl start kibana
$ sudo lsof -i -P -n | grep LISTEN | grep 5601
node 7253 kibana 18u IPv4 1159451844 0t0 TCP *:5601 (LISTEN)
Kibana Web UI在端口 5601 上可用。
使用浏览器访问http://localhost:5601,您应该会看到以下屏幕。
好的!
我们现在已经准备好从 rsyslog 提取日志并开始在 Kibana 中可视化它们。
提醒一下,我们正在将日志从 rsyslog 路由到 Logstash,这些日志将自动传输到 ElasticSearch。
在将日志从 rsyslog 路由到 Logstash 之前,我们在 Logstash 和 ElasticSearch 之间设置日志转发非常重要。
为此,我们将为 Logstash 创建一个配置文件,并准确告诉它要做什么。
要创建 Logstash 配置文件,请转到/etc/logstash/conf.d并创建一个 logstash.conf 文件。
在里面,附加以下内容:
input {
udp {
host => "127.0.0.1"
port => 10514
codec => "json"
type => "rsyslog"
}
}
# The Filter pipeline stays empty here, no formatting is done. filter { }
# Every single log will be forwarded to ElasticSearch. If you are using another port, you should specify it here.
output {
if [type] == "rsyslog" {
elasticsearch {
hosts => [ "127.0.0.1:9200" ]
}
}
}
注意:对于本教程,我们为 Logstash 使用UDP 输入,但如果您正在寻找一种更可靠的方式来传输日志,您可能应该使用TCP 输入。格式几乎相同,只需将 UDP 线路更改为 TCP。
重新启动 Logstash 服务。
$ sudo systemctl restart logstash
要验证一切是否正常运行,请发出以下命令:
$ netstat -na | grep 10514
udp 0 0 127.0.0.1:10514 0.0.0.0:*
伟大的!
Logstash 现在正在侦听端口 10514。
如前所述,rsyslog 有一组不同的模块,允许它将传入的日志传输到广泛的目标集。
Rsyslog 具有使用模板转换日志的能力。这正是我们正在寻找的,因为 ElasticSearch 期望 JSON 作为输入,而不是 syslog RFC 5424 字符串。
为了在 rsyslog 中转发日志,转到/etc/rsyslog.d并创建一个名为70-output.conf的新文件
在您的文件中,写入以下内容:
# This line sends all lines to defined IP address at port 10514
# using the json-template format.
*.* @127.0.0.1:10514;json-template
现在您已经完成了日志转发,在同一文件夹中创建一个01-json-template.conf文件,并粘贴以下内容:
template(name="json-template"
type="list") {
constant(value="{")
constant(value=""@timestamp":"") property(name="timereported" dateFormat="rfc3339")
constant(value="","@version":"1")
constant(value="","message":"") property(name="msg" format="json")
constant(value="","sysloghost":"") property(name="hostname")
constant(value="","severity":"") property(name="syslogseverity-text")
constant(value="","facility":"") property(name="syslogfacility-text")
constant(value="","programname":"") property(name="programname")
constant(value="","procid":"") property(name="procid")
constant(value=""}
")
}
正如您可能猜到的那样,对于每条传入的消息,rsyslog 会将日志属性插入到 JSON 格式的消息中,并将其转发到 Logstash,监听端口 10514。
重新启动您的 rsyslog 服务,并验证日志是否正确转发到 ElasticSearch。
注意:日志将在名为 logstash-* 的索引中转发。
$ sudo systemctl restart rsyslog
$ curl -XGET 'http://localhost:9200/logstash-*/_search?q=*&pretty'
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 10000,
"relation": "gte"
},
"max_score": 1,
"hits": [
{
"_index": "logstash-2019.07.08-000001",
"_type": "_doc",
"_id": "GEBK1WsBQwXNQFYwP8D_",
"_score": 1,
"_source": {
"host": "127.0.0.1",
"severity": "info",
"programname": "memory_usage",
"facility": "user",
"@timestamp": "2019-07-09T05:52:21.402Z",
"sysloghost": "schkn-ubuntu",
"message": " Dload Upload Total Spent Left Speed",
"@version": "1",
"procid": "16780",
"type": "rsyslog"
}
}
]
}
}
惊人的!我们知道 rsyslog 日志直接存储在 ElasticSearch 中。
现在是我们在 Kibana 中构建最终仪表板的时候了。
这就是乐趣的开始。
我们将构建第一部分中显示的仪表板,并为我们收集的数据赋予意义。
与我们关于Linux进程监控的文章类似,这部分是根据最终仪表板的不同面板进行拆分的,因此请随意跳转到您感兴趣的部分。
前往 Kibana(在 http://localhost:5601 上),您应该会看到以下屏幕。
如果这是您第一次使用 Kibana,我想谈谈一个小问题,我花了一些时间才理解。
为了创建仪表板,您需要构建可视化。Kibana 有两个面板,一个叫做“Visualize”,另一个叫做“Dashboard”
为了创建仪表板,您将首先使用“可视化”面板创建每个单独的可视化并保存它们。
当所有这些都创建完成后,您将它们一一导入到您的最终仪表板中。
前往“可视化”面板,让我们从第一个面板开始。
要构建您的第一个仪表板,请单击Kibana 右上角的“创建新的可视化”。选择垂直条形面板。
主要目标是构建一个如下所示的面板:
如您所见,条形图以聚合方式提供每个进程的日志总数。
如果您使用多个主机,条形图也可以按主机拆分。
事不宜迟,这是此面板的备忘单。
与我们之前所做的非常相似,目标是构建一个按程序名称划分日志比例的饼图面板。
这里是这个面板的备忘单!
这个面板看起来和我们之前做的完全一样,除了它按严重性拆分日志。
当您的一个系统发生重大中断时,它会非常有用,并且您想快速看到错误数量正在快速增加。
如果您有兴趣查看在夜间或特定事件发生的严重性,它还提供了一种简单的方法来查看给定时间段的日志严重性摘要。
同样,您可能正在等待它,这是此面板的备忘单!
这个有点特别,因为您可以直接进入“发现”选项卡以构建您的面板。
进入发现选项卡时,应自动选择您的“logstash-*”。
从那里,在过滤器栏中,输入以下过滤器“programname:ssh*”。
如您所见,您现在可以直接访问与您机器上的 SSHd 服务相关的每个日志。例如,您可以跟踪非法访问尝试或错误登录。
为了在仪表板面板中可以访问它,请单击“保存”选项,并为您的面板命名。
现在在仪表板面板中,您可以单击“添加”,然后选择刚刚创建的面板。
好的!现在,您的面板已包含在发现面板中的仪表板中。
通过本教程,您可以更好地了解如何使用 Rsyslog 和 ELK 堆栈轻松监控整个日志记录基础架构。
使用本文中介绍的架构,您可以通过将日志转发到中央服务器来非常轻松地扩展整个集群的日志监控。
一个建议是为您的 rsyslog 和 ELK 堆栈使用 Docker 映像,以便在日志数量增加过多时能够扩展您的集中部分(例如使用 Kubernetes)。
同样重要的是要注意,如果您选择在将来更改监视器的日志方式,这种架构是理想的。
您仍然可以依靠 rsyslog 进行日志集中,但您可以自由更改网关(在本例中为 Logstash)或可视化工具。
请务必注意,您可以使用 Grafana来非常轻松地监控您的 Elasticsearch 日志。
欢迎大家提出不一样的观点,我们一起讨论,
我是辣个男人,一个运维人。
页面更新:2024-04-28
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号