Logstash:使用 Logstash 将电子邮件导入到 Elasticsearch

本文介绍如何使用Logstash的IMAP插件将电子邮件索引到Elasticsearch,涵盖配置细节和示例,以及如何添加条件标记以增强数据分析。

有没有一种简单的方法可以将电子邮件索引到 Elasticsearch? Logstash 是答案。 Logstash 是一个开放源代码的服务器端数据处理管道,它同时从多个源中提取数据,进行转换,然后将其发送到你喜欢的“存储(stash)”中。 在这里,“存储(stash)”是指诸如 Elasticsearch,PagerDuty,电子邮件,Nagios,Jira 等产品。

Logstash 事件处理管道包括三个阶段:输入→过滤器→输出。 输入会生成事件,过滤器会对其进行修改,输出会将它们发送到任何地方。 输入和输出支持编解码器,使你可以在数据进入或退出管道时对其进行编码或解码,而不必使用单独的过滤器。

 如果你还没有涉足 Logstash,请阅读我之前的文章 “如何安装 Elastic 栈中的 Logstash”。

 

教程

为了将电子邮件索引到 Elasticsearch,我们需要使用名为 “logstash-input-imap” 的 Logstash 输入插件。 该插件会定期从 IMAP 服务器读取电子邮件。 Lgstash 默认情况下附带许多插件,“ imap”(logstash-input-imap)也不例外。

让我们从基本管道开始 Logstash,如下所示:

./bin/logstash -e 'input { stdin { } } output { stdout {} }'

打开浏览器并访问 http://localhost:9600/_node/plugins?pretty 以验证已安装的插件列表。 你应该在响应中看到在当前 Logstash 实例中激活的插件列表。 你可以向下滚动以确认“logstash-input-imap” 插件可用/已安装,如下所示:

我们也可以通过如下命令来查看:

./bin/logstash-plugin list --group input

显示的结果为:

logstash-input-azure_event_hubs
logstash-input-beats
logstash-input-couchdb_changes
logstash-input-elasticsearch
logstash-input-exec
logstash-input-file
logstash-input-ganglia
logstash-input-gelf
logstash-input-generator
logstash-input-graphite
logstash-input-heartbeat
logstash-input-http
logstash-input-http_poller
logstash-input-imap
logstash-input-jdbc
logstash-input-jms
logstash-input-pipe
logstash-input-redis
logstash-input-s3
logstash-input-snmp
logstash-input-snmptrap
logstash-input-sqs
logstash-input-stdin
logstash-input-syslog
logstash-input-tcp
logstash-input-twitter
logstash-input-udp
logstash-input-unix

在上面我们可以看出来 logstash-input-imap 在里面,表明它是我们 Logstash 应用安装的一部分,我们不需要特别的安装。

接下来,我们需要使用 “logstash-input-imap” 作为输入来配置 Logstash 管道。 此插件所需的唯一配置是 “host”,“password” 和 “user”。

根据要连接的 IMAP 服务器所需的设置,你可能需要为其他配置(例如“port”,“secure”等)设置值。“host” 是你在其中指定 IMAP 服务器详细信息的位置 ,“user” 和 “password” 是需要指定用户凭据以进行身份验证/连接到 IMAP 服务器的位置。

在今天的练习中,我们使用 hotmail 来做我们的实验。我曾经尝试使用中国的 163 及 QQ 邮箱来实验。针对这些邮箱,一方面我们需要在它们的【邮箱设置】中找到【POP3/SMTP/IMAP】开启,这样能够使得第三方软件获取邮件。更为特别的是在第三方软件通过 IMAP 来获取邮件需要输入它们提供的校验码,从而使得它们不能很好地和logstash-input-imap 工作。

针对我的情况,我使用如下的 logstash 配置文件:

logstash_email.conf

input {
	imap {
	 	host => "imap-mail.outlook.com"
	 	user => "YourEmailAddress"
	 	password => "YourPassword"
	 	content_type => "text/plain"
	 	secure => true
	 	port => 993
	 	check_interval => 10
	 	folder => "Inbox"
	}
}

output {
	stdout { codec => rubydebug }

 	elasticsearch {
 		index => "emails"
 		document_type => "_doc"
 		hosts => "localhost:9200"
	}
}

在上面,我们配置我们的 hotmail 邮件设置。针对你的情况,你需要在 user 及 password 中输入自己的邮件地址及密码。我们的邮件将以文档的形式发送给 Elasticsearch 中,并存于 emails 索引中。

默认情况下,“logstash-input-imap” 插件从文件夹 “INBOX” 读取并每300秒轮询一次 IMAP 服务器。 在上面的配置中,我覆盖了这些n设置以及端口。我们可以通过如下的方式来启动 logstash:

./bin/logstash -f ~/data/email/logstash_email.conf --config.reload.automatic

在需要根据自己的情况来修改上面的 .conf 文件的地址。

注意:在开发模式下,最好启用自动重新加载配置(--config.reload.automatic),因此不必在每次更改管道/配置时都重新启动Logstash。

由于一些原因,目前 logstash-input-imap 有一个 bug:Error: Can not decode an entire message。根据这个 bug 的描述,如果邮件中有附件的时候,可能造成读取的错误,从而导致 logstash 出错

现在,让我们启动 Logstash 代理,以便它开始侦听来自 IMAP 服务器的传入电子邮件:

我们可以通过另外一个邮箱向我们的邮件发送信息,比如:

我们可以在我们的 logstash 运行中看到如下的信息:

那么在我们的 Kibana 中,我们可以在 emails 索引中看到:

可以发现,我们已经成功地把发向 hotmail 的邮件导入到 Elasticsearch 中了。

 

条件标记

现在,我们已经有了基本的设置来为 Elasticsearch 的电子邮件编制索引,我们可以添加新的字段,过滤器,条件标签等等。 假设我们用主题为 “critical/error” 关键字的所有电子邮件进行标记。 根据标签的不同,我们可以在输出插件中执行操作,例如向支持团队发送电子邮件,创建 Jira 问题,发送 PagerDuty 事件等。可能性无限。

以下是显示条件标记的示例配置:

logstash_email_tag.conf

input {
	imap {
	 	host => "imap-mail.outlook.com"
	 	user => "YourEmailAddress"
	 	password => "YourPassword"
	 	content_type => "text/plain"
	 	secure => true
	 	port => 993
	 	check_interval => 10
	 	folder => "Inbox"
	 	add_field => {"parser" => "logstash"}
	}
}

filter {
	if "critical" in [subject] {
		mutate { add_tag => "critical" }
	}
	else if "error" in [subject] {
		mutate { add_tag => "error" }
	}
 }

output {
	stdout { codec => rubydebug }

 	elasticsearch {
 		index => "emails"
 		document_type => "_doc"
 		hosts => "localhost:9200"
	}
}

我们可以通过如下的命令来运行我们的 logstash 应用:

./bin/logstash -f ~/data/email/logstash_email_tag.conf --config.reload.automatic

我们在其它的邮件客户端写入一个如下的邮件:

 

那么在我们的 Logstash console 里我们可以看到:

我们可以通过 Kibana 检查:

当 critical 邮件发生时,我们可以使用 logstash-output-email 来向我们的邮件发送邮件信息。具体实现留给大家。


总结

如你所见,Logstash IMAP 插件使发送电子邮件到 Elasticsearch 或任何其他输出变得非常容易。 现在我们在 Elasticsearch 中拥有电子邮件,我们可以编写一个简单的搜索客户端,或者直接从 curl 或 REST 客户端调用 Elasticsearch 搜索端点,以开始挖掘和分析它们。 更好的是,我们可以将各种指标和汇总应用于索引的电子邮件,以在 Kibana 中产生有用的可视化效果。 将电子邮件添加到 ELK 堆栈中的数据分析管道中肯定会使你的商业智能受益。

 

参考:

【1】https://qbox.io/blog/indexing-emails-to-elasticsearch-logstash-imap

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值