将文本日志文件流式传输到RabbitMQ后,如何在另一端重建?
需求
我们有好几个服务器(20到50台),运行着不同的应用程序,这些服务器有Solaris 10和Linux(SLES)系统。每个应用程序都会生成很多日志事件,并把它们记录到文本文件里。我们需要把这些日志收集到一个单独的监控机器上,以便进行分析、报告和报警。
当前方法
现在,我们使用SSH和远程的“tail -f”命令,把服务器上的日志文件流式传输到监控机器上。不过,这种方法有点不稳定。
新方法
我想用RabbitMQ来替代这个方法。服务器会把它们的日志事件发送到RabbitMQ,然后每个监控脚本或应用程序可以订阅相应的队列。
理想情况下,我们希望应用程序能够直接把事件发送到RabbitMQ的队列里。
不过,假设短期内这不太可能(因为我们可能没有所有应用程序的源代码),我们需要一种方法来“tail -f”磁盘上的日志文件。我对Python比较熟悉,所以我在考虑用Python来实现这个功能。大家的共识是,使用一个循环结合readline()和sleep()来模拟“tail -f”。
问题
有没有更简单的方法可以直接把一堆文本文件的内容“tail -f”到RabbitMQ流中?有没有内置的功能,或者我们可以利用的扩展?还有其他的建议吗?
如果我们写一个Python封装来捕获所有日志文件并发布它们,我希望能用一个Python脚本同时处理所有日志文件,而不是为每个日志文件手动启动一个单独的实例。我们应该怎么做?在性能、CPU使用、吞吐量和并发等方面有什么需要考虑的吗?
我们需要订阅这些队列,然后可能需要把事件再写回磁盘,重建原来的日志文件。对此有什么建议吗?我们也希望能用一个Python脚本来处理所有日志文件的重建,而不是启动50个相同脚本的实例,这样容易实现吗?
谢谢,
Victor
PS:我们也看过Facebook的Scribe和Flume,但这两个工具似乎对我们的需求来说有点过于复杂。
3 个回答
如果你在说应用程序的日志记录(跟访问日志,比如Apache服务器的日志不一样),你可以使用一个处理器来进行标准库的日志记录,这个处理器可以把日志写入AMQP中间件。
如果可以的话,你可以让应用程序把事件异步地发送到RabbitMQ,而不是写入日志文件。我现在在Java中已经实现了这个功能。
不过,有时候让应用程序按照你想要的方式记录日志是不太可能的。
1) 你可以用Python写一个文件监控程序,它可以把内容发布到AMQP。我不知道有没有什么工具可以直接把文件作为输入发送到RabbitMQ。你可以看看这个链接:http://code.activestate.com/recipes/436477-filetailpy/ 和 http://www.perlmonks.org/?node_id=735039,这些都是关于监控文件的。
2) 你可以创建一个Python守护进程,它可以监控所有指定的文件,可以以进程的方式或者轮询的方式进行。
3) 类似于第二种方法,你也可以用这种方式来解决问题。你可以为每个日志文件设置一个单独的队列。
你似乎在说的是用RabbitMQ作为传输工具的集中式syslog。
如果你能接受使用syslog,可以看看syslog-ng这个工具。否则,你可以考虑使用logstash的一部分,这样可能会节省一些时间(http://logstash.net/)。