将日志更改块同步到另一台机器上的新文件(实时)

将日志更改块同步到另一台机器上的新文件(实时)

一些背景信息:

日志用于用户操作分析。我需要它来实时处理和持久化消息,想想 Google Analytics 的实现,显然有不同的需求。显然需要检查旋转的文件(更多用于离线处理并确保我没有遗漏数据),但这很容易处理。

我的问题更多是关于实时分析部分。我需要在数据写入日志文件时查看数据。理想情况下,我希望将过去 X 秒(比如 30 秒)内生成的条目提交到另一台机器(作为新文件)并在那里进行处理。

/结尾

我有一个 Apache 日志文件,每秒都会对其进行多次写入。我需要一个实用程序来“跟踪”日志文件,并且每隔 X 秒提取大量新行并在另一台计算机上创建一个新文件。另一台机器属于同一网络。

我希望它每 X 秒发送一次的原因是由于每秒的写入次数。我更喜欢与另一台机器进行大块通信。最糟糕的情况是,我可能会丢失一些数据(比如过去 X 秒的数据),然后稍后离线修复它。

我计划在另一台机器上运行文件监听器来读取这些文件并运行一些处理。

您是否知道一些我可以运行的工具来同步对新文件的更改?

更新:

我决定使用 Apache Log 管道来调用 Groovy 脚本,将消息推送到 Amazon SQS。这将消除另一台机器监听 TCP 端口的需要,这将有助于应对停机/版本升级的情况。我将确保与 SQS 的通信是异步且块状的(在发送到 SQS 之前将 X 条消息存储在内存中)。

答案1

最简单的方法是将日志通过管道传输到另一个进程,从那里您可以将日志带到任何您想要的地方;请参阅http://httpd.apache.org/docs/2.4/logs.html#piped

logrotate 是一款足够简单的工具,可以完成此操作,尽管您希望使用更硬核的日志系统(例如 graylog2、logstash 或 splunk)。例如,您可以通过 netcat 传输日志,并通过 UDP/TCP(取决于您的可靠性约束)将其发送到 greylog2 进行聚合和分析。

正如人们所说,上帝存在于细节中 :-)

答案2

您可能会发现 logrotate 可以满足您的需要。通常它按日或按大小进行轮换,或者您也可以在轮换时执行 shell 命令,因此在轮换日志时应该很容易将日志 scp 到远程服务器。

http://www.thegeekstuff.com/2010/07/logrotate-examples/

那里有很多例子可以帮助你入门。

您谈到了同步文件,但是使用 logrotate 您不应该丢失任何数据。您可以通过 zcat 将文件组合在一起来重新组合远程端的日志。但是,一旦您找到日志轮换的运行方式,这可能就没有必要了。

答案3

一种方法是使用 rsync,它可以使用 SSH 进行传输。它只会发送旧文件和新文件之间的差异。无论如何,您仍然需要在另一端有一个足够聪明的程序,以便在文件更新时记住它在文件中的位置。

但是由于您几乎需要实时文件,因此在外部程序中以 30 秒为单位发送文件会很困难。我有一个解决方案,虽然有点复杂,但可能对您有用:

1) 如果不想连续写入磁盘,请使用 BufferedLogs 指令。这会将多个日志条目存储在内存中并将它们一起写入磁盘,而不是在每次请求后写入。这意味着日志写入延迟将发生在源头而不是传输时。请注意,此指令仍处于实验阶段,并且每个服务器只能设置一次,因此您无法在虚拟服务器中更改它!

2) 使用您喜欢的任何程序在日志文件上添加尾部并将其传送到记录器。Logsurfer 是一种可能,我相信还有其他的。使用您不用于其他用途的工具 - 我假设是“local7”,但这取决于您。

3) 将 Web 服务器上的 syslog 守护程序设置为将 local7 转发到您的统计服务器。

4) 在统计服务器上,如果您使用 syslog-ng,则可以将 local7 上的传入日志直接传送到统计程序。或者您可以写入磁盘并设置 flush_timeout,以便它每 30 秒仅写入一次。在这两种情况下,您都可以忽略我上面提到的 Apache BufferedLogs 指令。

相关内容