如何在 Ubuntu 14.04 上使用 Rsyslog、Logstash 和 Elasticsearch 实现日志集中管理

本文主要是介绍如何在 Ubuntu 14.04 上使用 Rsyslog、Logstash 和 Elasticsearch 实现日志集中管理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Elastic 的一篇文章

介绍

理解组织生成的数百万条日志行可能是一个艰巨的挑战。一方面,这些日志行提供了对应用程序性能、服务器性能指标和安全性的视图。另一方面,日志管理和分析可能非常耗时,这可能会阻碍对这些日益必要的服务的采用。

开源软件,如 rsyslog、Elasticsearch 和 Logstash 提供了传输、转换和存储日志数据的工具。

在本教程中,您将学习如何创建一个集中的 rsyslog 服务器,以存储来自多个系统的日志文件,然后使用 Logstash 将它们发送到 Elasticsearch 服务器。然后,您可以决定如何最好地分析数据。

目标

本教程教会您如何集中存储由 syslog 生成或接收的日志,特别是被称为 rsyslog 的变体。Syslog 和基于 syslog 的工具如 rsyslog 从内核和许多运行以保持类 UNIX 服务器运行的程序中收集重要信息。由于 syslog 是一个标准,而不仅仅是一个程序,许多软件项目都支持向 syslog 发送数据。通过集中存储这些数据,您可以更轻松地审计安全性,监视应用程序行为,并跟踪其他重要的服务器信息。

从一个集中或聚合的 rsyslog 服务器,您可以将数据转发到 Logstash,它可以在将数据发送到 Elasticsearch 之前进一步解析和丰富您的日志数据。

本教程的最终目标是:

  1. 设置一个单一的客户端(或转发)rsyslog 服务器
  2. 设置一个单一的服务器(或收集)rsyslog 服务器,以接收来自 rsyslog 客户端的日志
  3. 设置一个 Logstash 实例,以接收来自 rsyslog 收集服务器的消息
  4. 设置一个 Elasticsearch 服务器,以接收来自 Logstash 的数据

先决条件

相同的 DigitalOcean 数据中心中,创建以下启用了私有网络的 Droplets:

  • 名为 rsyslog-client 的 Ubuntu 14.04 Droplet
  • 名为 rsyslog-server 的 Ubuntu 14.04 Droplet(1 GB 或更大),用于存储集中日志和安装 Logstash
  • 安装了 Elasticsearch 的 Ubuntu 14.04 Droplet,安装方法请参考《在 Ubuntu 14.04 上安装和配置 Elasticsearch》

您还需要为每个服务器创建一个具有 sudo 权限的非 root 用户。《使用 Ubuntu 14.04 进行初始服务器设置》解释了如何设置这一点。

参考《如何设置和使用 DigitalOcean 私有网络》以获取有关在创建 Droplets 时启用私有网络的帮助。

如果您在没有启用私有网络的情况下创建了 Droplets,请参考《如何在现有 Droplets 上启用 DigitalOcean 私有网络》。

步骤 1 —— 确定私有 IP 地址

在本节中,您将确定每个 Droplet 分配了哪些私有 IP 地址。这些信息将在整个教程中需要。

在每个 Droplet 上,使用 ifconfig 命令找到其 IP 地址:

sudo ifconfig -a

使用 -a 选项显示所有接口。主要以太网接口通常称为 eth0。但在这种情况下,我们需要来自 eth1 的 IP,即 私有 IP 地址。这些私有 IP 地址在互联网上不可路由,并且用于在私有 LAN 中进行通信 — 在这种情况下,是在同一数据中心中启用了次要接口的服务器之间。

输出将类似于:


eth0      Link encap:Ethernet  HWaddr 04:01:06:a7:6f:01  inet addr:123.456.78.90  Bcast:123.456.78.255  Mask:255.255.255.0inet6 addr: fe80::601:6ff:fea7:6f01/64 Scope:LinkUP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1RX packets:168 errors:0 dropped:0 overruns:0 frame:0TX packets:137 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:18903 (18.9 KB)  TX bytes:15024 (15.0 KB)eth1      Link encap:Ethernet  HWaddr 04:01:06:a7:6f:02  inet addr:10.128.2.25  Bcast:10.128.255.255  Mask:255.255.0.0inet6 addr: fe80::601:6ff:fea7:6f02/64 Scope:LinkUP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1RX packets:6 errors:0 dropped:0 overruns:0 frame:0TX packets:5 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:468 (468.0 B)  TX bytes:398 (398.0 B)lo        Link encap:Local Loopback  inet addr:127.0.0.1  Mask:255.0.0.0inet6 addr: ::1/128 Scope:HostUP LOOPBACK RUNNING  MTU:16436  Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0 RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

这里需要注意的部分是 eth1 和其中的 inet addr。在这种情况下,私有网络地址是 10.128.2.25。这个地址只能从启用了私有网络的同一区域内的其他服务器访问。

请确保对所有 3 个 Droplets 都重复此步骤。将这些私有 IP 地址保存在安全的地方。它们将在整个教程中使用。

步骤 2 —— 设置 Elasticsearch 的绑定地址

作为先决条件,您在单独的 Droplet 上设置了 Elasticsearch。《在 Ubuntu 14.04 上安装和配置 Elasticsearch》教程向您展示了如何将绑定地址设置为 localhost,以便其他服务器无法访问该服务。然而,我们需要更改这一设置,以便 Logstash 可以通过其专用网络地址向其发送数据。

我们将 Elasticsearch 绑定到其专用 IP 地址。Elasticsearch 只会监听对该 IP 地址的请求。

在 Elasticsearch 服务器上,编辑配置文件:

sudo nano /etc/elasticsearch/elasticsearch.yml

找到包含 network.bind_host 的行。如果它被注释掉了,通过删除行首的 # 字符来取消注释。将值更改为 Elasticsearch 服务器的专用 IP 地址,使其看起来像这样:


network.bind_host: private_ip_address

最后,重新启动 Elasticsearch 以启用更改。

sudo service elasticsearch restart

步骤 3 —— 配置中心服务器以接收数据

在本节中,我们将配置 rsyslog-server Droplet 为能够从其他 syslog 服务器在 514 端口接收数据的 中心 服务器。

要配置 rsyslog-server 以从其他 syslog 服务器接收数据,请编辑 rsyslog-server Droplet 上的 /etc/rsyslog.conf

sudo nano /etc/rsyslog.conf

找到您的 rsyslog.conf 中已经注释掉的这些行:


# provides UDP syslog reception
#$ModLoad imudp
#$UDPServerRun 514# provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514

每个部分的第一行($ModLoad imudp$ModLoad imtcp)分别加载 imudpimtcp 模块。imudp 代表 input module udpimtcp 代表 input module tcp。这些模块监听来自其他 syslog 服务器的传入数据。

每个部分的第二行($UDPSerververRun 514$TCPServerRun 514)指示 rsyslog 应启动分别监听端口 514(这是 syslog 的默认端口)的 UDP 和 TCP 服务器。

要启用这些模块和服务器,请取消注释这些行,使文件现在包含:


# provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514# provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514

保存并关闭 rsyslog 配置文件。

通过运行以下命令重新启动 rsyslog:

sudo service rsyslog restart

您的中心 rsyslog 服务器现在已配置为监听来自远程 syslog(包括 rsyslog)实例的消息。

步骤 4 —— 配置 rsyslog 以远程发送数据

在本节中,我们将配置 rsyslog-client 以将日志数据发送到我们在上一步中配置的 ryslog-server Droplet。

在 Ubuntu 上的默认 rsyslog 设置中,您会在 /etc/rsyslog.d 中找到两个文件:

  • 20-ufw.conf
  • 50-default.conf

rsyslog-client 上,编辑默认配置文件:

sudo nano /etc/rsyslog.d/50-default.conf

log by facility 部分之前的文件顶部添加以下行,将 private_ip_of_ryslog_server 替换为您 中心 服务器的私有 IP:


*.*							@private_ip_of_ryslog_server:514

保存并退出文件。

行的第一部分(.)表示我们要发送所有消息。虽然这超出了本教程的范围,但您可以配置 rsyslog 仅发送某些消息。行的其余部分解释了如何发送数据以及发送数据的位置。在我们的情况下,@ 符号表示 rsyslog 使用 UDP 发送消息。将其更改为 @@ 以使用 TCP。然后是安装有 rsyslog 和 Logstash 的 rsyslog-server 的私有 IP 地址。冒号后面的数字是要使用的端口号。

重新启动 rsyslog 以启用更改:

sudo service rsyslog restart

恭喜!您现在正在将您的 syslog 消息发送到一个中心服务器!

步骤 5 —— 将日志数据格式化为 JSON

Elasticsearch 要求其接收的所有文档都以 JSON 格式提供,而 rsyslog 提供了一种通过模板实现这一点的方法。

在本步骤中,我们将配置我们的中心 rsyslog 服务器以使用 JSON 模板在将数据发送到 Logstash 之前格式化日志数据,然后由 Logstash 将其发送到另一台服务器上的 Elasticsearch。

回到 rsyslog-server 服务器,在发送到 Logstash 之前创建一个新的配置文件以将消息格式化为 JSON 格式:

sudo nano /etc/rsyslog.d/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="\"}\n")
}

除了第一行和最后一行外,注意到此模板生成的行在开头有一个逗号。这是为了保持 JSON 结构 帮助保持文件的可读性。此模板将按照 Elasticsearch 和 Logstash 期望接收的方式格式化您的消息。它们将如下所示:


{"@timestamp" : "2015-11-18T18:45:00Z","@version" : "1","message" : "Your syslog message here","sysloghost" : "hostname.example.com","severity" : "info","facility" : "daemon","programname" : "my_program","procid" : "1234"
}

发送的数据尚未使用此格式。下一步显示了如何配置服务器以使用此模板文件。

第六步 —— 配置集中式服务器发送到 Logstash

现在我们已经有了定义正确 JSON 格式的模板文件,让我们配置集中式 rsyslog 服务器将数据发送到 Logstash,在本教程中 Logstash 与其在同一台 Droplet 上。

在启动时,rsyslog 将查看 /etc/rsyslog.d 中的文件并从中创建其配置。让我们添加自己的配置文件来扩展配置。

rsyslog-server 上,创建 /etc/rsyslog.d/60-output.conf

sudo nano /etc/rsyslog.d/60-output.conf

将以下行复制到此文件中:


# 此行将所有行发送到指定 IP 地址的 10514 端口,
# 使用 "json-template" 格式模板*.*							@private_ip_logstash:10514;json-template

开头的 *.* 表示处理所有日志消息的其余部分。@ 符号表示使用 UDP(使用 @@ 来使用 TCP)。@ 后面的 IP 地址或主机名是要转发消息的地方。在我们的情况下,由于 rsyslog 集中式服务器和 Logstash 服务器都安装在同一台 Droplet 上,我们使用 rsyslog-server 的私有 IP 地址。这必须与您在下一步中配置 Logstash 监听的私有 IP 地址相匹配。

接下来是端口号。本教程使用端口 10514。请注意,Logstash 服务器必须使用相同的协议在相同的端口上监听。最后一部分是我们的模板文件,显示了如何在传递数据之前格式化数据。

不要立即重新启动 rsyslog。首先,我们必须配置 Logstash 来接收消息。

第七步 —— 配置 Logstash 接收 JSON 消息

在此步骤中,您将安装 Logstash,配置它以从 rsyslog 接收 JSON 消息,并配置它将 JSON 消息发送到 Elasticsearch。

Logstash 需要 Java 7 或更高版本。使用 Elasticsearch 教程的 第一步 中的说明在 rsyslog-server Droplet 上安装 Java 7 或 8。

接下来,安装 Logstash 存储库的安全密钥:

wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

将存储库定义添加到您的 /etc/apt/sources.list 文件中:

echo "deb http://packages.elastic.co/logstash/2.3/debian stable main" | sudo tee -a /etc/apt/sources.list

更新软件包列表以包括 Logstash 存储库:

sudo apt-get update

最后,安装 Logstash:

sudo apt-get install logstash

现在 Logstash 已安装,让我们配置它以监听来自 rsyslog 的消息。

Logstash 的默认安装在 /etc/logstash/conf.d 中查找配置文件。编辑主配置文件:

sudo nano /etc/logstash/conf.d/logstash.conf

然后,在 /etc/logstash/conf.d/logstash.conf 中添加以下行:


# 此输入块将在端口 10514 上监听日志。
# 主机应该是 Logstash 服务器上的一个 IP。
# codec => "json" 表示我们期望接收的行是 JSON 格式的
# type => "rsyslog" 是一个可选标识符,用于帮助识别管道中的消息流。input {udp {host => "logstash_private_ip"port => 10514codec => "json"type => "rsyslog"}
}# 这是一个空的过滤器块。您可以稍后在这里添加其他过滤器以进一步处理
# 您的日志行filter { }# 此输出块将发送所有类型为 "rsyslog" 的事件到配置的 Elasticsearch
# 主机和端口,进入每日索引的模式,"rsyslog-YYYY.MM.DD"output {if [type] == "rsyslog" {elasticsearch {hosts => [ "elasticsearch_private_ip:9200" ]}}
}

syslog 协议从定义上是 UDP,因此此配置反映了该标准。

在输入块中,通过将 logstash_private_ip 替换为 rsyslog-server 的私有 IP 地址来设置 Logstash 主机地址,该服务器也安装有 Logstash。

输入块配置 Logstash 监听端口 10514,因此它不会与同一台机器上的 syslog 实例竞争。小于 1024 的端口需要以 root 用户身份运行 Logstash,这不是一个良好的安全实践。

确保将 elasticsearch_private_ip 替换为您的 Elasticsearch Droplet 的私有 IP 地址。输出块显示了一个简单的条件配置。它的目的是只允许匹配的事件通过。在这种情况下,只有具有 “type” 为 “rsyslog” 的事件。

测试您的 Logstash 配置更改:

sudo service logstash configtest

如果没有语法错误,它应该显示 Configuration OK。否则,请尝试阅读错误输出,查看您的 Logstash 配置有什么问题。

完成所有这些步骤后,您可以通过运行以下命令启动 Logstash 实例:

sudo service logstash start

还要重新启动同一台服务器上的 rsyslog,因为它现在有一个要转发的 Logstash 实例:

sudo service rsyslog restart

要验证 Logstash 是否在端口 10514 上监听:

netstat -na | grep 10514

您应该会看到类似以下内容:


udp6       0      0 10.128.33.68:10514     :::*  

您将看到 rsyslog-server 的私有 IP 地址和我们用于监听 rsyslog 数据的 10514 端口号。

第八步 — 验证 Elasticsearch 输入

在之前的步骤中,我们配置了 Elasticsearch 监听其私有 IP 地址。现在它应该正在接收来自 Logstash 的消息。在这一步中,我们将验证 Elasticsearch 是否正在接收日志数据。

rsyslog-clientrsyslog-server Droplets 应该将它们所有的日志数据发送到 Logstash,然后传递到 Elasticsearch。让我们生成一个安全消息来验证 Elasticsearch 是否确实收到了这些消息。

rsyslog-client 上,执行以下命令:

sudo tail /var/log/auth.log

您将在输出的末尾看到本地系统上的安全日志。它看起来类似于:


May  2 16:43:15 rsyslog-client sudo:    sammy : TTY=pts/0 ; PWD=/etc/rsyslog.d ; USER=root ; COMMAND=/usr/bin/tail /var/log/auth.log
May  2 16:43:15 rsyslog-client sudo: pam_unix(sudo:session): session opened for user root by sammy(uid=0)

通过简单的查询,您可以检查 Elasticsearch:

在 Elasticsearch 服务器上或任何被允许访问它的系统上运行以下命令。将 elasticsearch_ip 替换为 Elasticsearch 服务器的私有 IP 地址。这个 IP 地址也必须是您在本教程中早些时候配置 Elasticsearch 监听的 IP 地址。

curl -XGET 'http://elasticsearch_ip:9200/_all/_search?q=*&pretty'

在输出中,您将看到类似以下内容:


{"_index" : "logstash-2016.05.04","_type" : "rsyslog","_id" : "AVR8fpR-e6FP4Elp89Ww","_score" : 1.0,"_source":{"@timestamp":"2016-05-04T15:59:10.000Z","@version":"1","message":"    sammy : TTY=pts/0 ; PWD=/home/sammy ; USER=root ; COMMAND=/usr/bin/tail /var/log/auth.log","sysloghost":"rsyslog-client","severity":"notice","facility":"authpriv","programname":"sudo","procid":"-","type":"rsyslog","host":"10.128.33.68"}},

请注意,生成 rsyslog 消息的 Droplet 的名称在日志中(rsyslog-client)。

通过这个简单的验证步骤,您的集中式 rsyslog 设置已经完成并且完全可操作!

结论

您的日志现在存储在 Elasticsearch 中。接下来呢?考虑阅读一下 Kibana 能做什么,以可视化您在 Elasticsearch 中的数据,包括线条图、柱状图、饼图、地图等。《如何在 Ubuntu 14.04 上使用 Logstash 和 Kibana 实现日志集中化》解释了如何使用 Kibana web 界面来搜索和可视化日志。

也许您的数据通过进一步解析和标记化会更有价值。如果是这样,那么学习更多关于 Logstash 的知识将有助于您实现这一结果。

这篇关于如何在 Ubuntu 14.04 上使用 Rsyslog、Logstash 和 Elasticsearch 实现日志集中管理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/891099

相关文章

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time