一些背景:
日志正在用于用户操作分析。 我需要这个实时处理和消息的持久性,考虑谷歌分析的实施,明显不同的需求。 显然需要查看旋转的文件(更多用于离线处理,并确保我没有错过数据),但很容易照顾。
我的问题更多的是实时分析部分。 当数据被写入日志文件时,我需要看到这些数据。 理想情况下,我想将最近X秒(如30秒)生成的条目提交给不同的机器(如新文件)并在那里处理。
/结束
我有一个Apache日志文件,每秒写入很多。 我需要一个在日志文件上“尾巴”的实用程序,每X秒需要一大块新行,并在另一台机器上创build一个新文件。 另一台机器是同一networking的一部分。
我希望它每隔X秒发送一次的原因是每秒的写入次数。 我宁愿有一个矮胖的通信调用另一台机器。 最糟糕的情况是,我可能会丢失一些数据(比如最后的X秒),然后在离线状态下进行修复。
我打算在另一台机器上运行一个文件侦听器来读取这些文件并运行一些处理。
你知道我可以运行一些工具来将更改同步到新文件吗?
更新:
我决定使用Apache Logpipe道来调用一个将消息推送到Amazon SQS的groovy脚本。 这将解耦另一台侦听TCP端口的计算机的需要,这将有助于在停机/版本升级的情况下。 我将确保与SQS的沟通是asynchronous和矮胖的(在发送到SQS之前将X消息存储在内存中)。
最简单的方法是将日志pipe道传输到另一个进程,从中可以随意取出日志; 请参阅http://httpd.apache.org/docs/2.4/logs.html#piped
尽pipe你想用一个更加核心的日志logging系统(例如graylog2,logstash或splunk),logrotate是足够简单的工具。 例如,您可以通过netcatpipe理您的日志,并通过UDP / TCP(取决于您的可靠性约束)将它们发送到greylog2进行聚合和分析。
神的细节,正如他们所说:-)
你可能会发现logrotate可以做你所需要的。 通常它是以每日或基于大小的方式旋转的,以太方式可以在循环中执行一个shell命令,因此在旋转日志时,将日志的scplogging到远程服务器应该很容易。
http://www.thegeekstuff.com/2010/07/logrotate-examples/
有很多的例子,应该让你开始。
你说的是同步文件,但是使用logrotate你不应该丢失任何数据。 您可以通过zcat将文件一起重组在远程的日志。 但是,一旦你发现日志旋转操作,这可能是没有必要的。
一种方法是使用rsync,它可以使用SSH进行传输。 它只会发送旧文件和新文件之间的差异。 无论如何,当文件被更新时,你仍然必须在另一端有一个足够聪明的程序来记住它在文件中的位置。
但是由于你需要实时的文件,因此在30秒的时间内发送文件在外部程序中很难做到。 我有一个有点复杂的解决scheme,但可能会为你工作:
1)如果不连续写入磁盘很重要,请使用BufferedLogs指令。 这将在内存中存储多个日志条目,并将它们一起写入磁盘,而不是在每个请求之后写入它们。 这意味着日志写入延迟将发生在源头而不是转移。 请注意,这个指令仍然是实验性的,每个服务器只能设置一次,所以你不能在虚拟服务器上修改它!
2)使用你喜欢的任何程序在日志文件上放一个尾巴并将其传送给logging器。 Logsurfer是一种可能性,我确信还有其他的。 使用一个你没有用的东西 – 我假设“local7”,但这取决于你。
3)让你的syslog守护进程设置为将local7转发到你的统计服务器。
4)在您的统计服务器上,如果使用syslog-ng,则可以将local7上的传入日志直接传送到统计程序。 或者你可以写入磁盘并设置flush_timeout,所以每30秒只写一次。 在这两种情况下,您都可以忽略上面提到的Apache BufferedLogs指令。