2011-02-07 23 views
3

好的,那个标题会有点混乱。让我试着更好地解释它。我正在构建一个日志程序。该程序将有3个主要状态:实现半循环文件,可以根据需要进行扩展和保存

  1. 写入循环缓冲区文件,只保留最后10分钟的数据。

  2. 写入缓冲区文件,忽略时间(记录所有数据)。

  3. 重命名整个缓冲区文件,并用过去10分钟的数据(并将状态更改为1)重新启动一个新缓冲区文件。

现在,用例就是这样。我在我们的网络中不时遇到一些网络瓶颈。所以我想建立一个系统来记录TCP流量,当它检测到瓶颈时(通过Nagios检测)。然而,当它检测到瓶颈时,大部分有用的数据已经被传输。

所以,我想要的是一个deamon总是运行像dumpcap这样的东西。在正常模式下,它只会保留过去10分钟的数据(因为如果不需要数据的话,保持数据载入没有意义)。但是当Nagios发出警报时,我会在deamon发送一个信号来存储所有内容。然后,当Naigos恢复时,它会发送另一个信号来停止存储并将缓冲区刷新到保存文件。

现在,问题是我看不到如何干净地存储旋转10分钟的数据。我可以每隔10分钟存储一个新文件,并在模式1下删除旧文件。但是这对我来说似乎有点肮脏(特别是在确定文件中发生警报时)。

理想情况下,保存的文件应该使警报总是在文件中的10:00标记处。虽然每10分钟有新文件可能会出现这种情况,但“修复”文件到这一点似乎有点肮脏。

任何想法?我应该只是做一个旋转文件系统,并在最后将它们合并为1(进行相当多的后期处理)?有没有办法实施半循环文件干净,以便不需要任何后处理?

感谢

哦,语言并不重要,多在这个阶段(我倾向于Python,但不反对任何其他语言。它比整体设计不再是一个问题) ...

回答

3

想到的第一个想法是存储MINUTES+1(本例中为11)一分钟的文件。扔掉旧的。

根据要求,您可以将当前未写入的10个文件复制/合并到一个“大日志文件”中,并追加完成的每个其他文件的内容。

话又说回来,这看起来像一个“必须有工具,类似的东西”的任务,也许会有人想出了为:)

的一个问题,这并不解决是具有正是工具数据的最后X分钟。它始终从0秒开始。

+0

我会在一分钟内保存过去30分钟的文件,而不仅仅是过去的11分钟 – jcolebrand 2011-02-11 17:29:59

+0

这是对我的特定用例最容易实现的,所以对你的+1和+赏金很好先生... – ircmaxell 2011-02-15 20:49:39

0

只准确地记录最后10分钟的日志有什么好处?要实现这一点,您需要不断检查旧日志并将其从文件中删除,然后覆盖该文件。这样的功能可以通过某些DB更容易地实现,例如, SQLite的。

日志时间戳给你一样的和更多。如前所述,只要保留两个日志文件,如果日志文件已经有10分钟的日志 - 重命名它(覆盖较旧的日志文件)并开始记录到一个新文件。

1

这不完全是你在找什么,但我认为MongoDB Capped Collections是你可能想看的东西。

Capped集合是固定大小的集合,具有非常高性能的自动FIFO超时功能(超时基于插入顺序)。如果您熟悉这一点,它们有点像“RRD”概念。另外,高性能的自动封顶集合可以维护集合中对象的插入顺序;这对于某些使用情况(如日志记录)非常强大。

因此,将所有东西记录到加盖的集合中,您已经修复了大小以存储大约10分钟的数据。当Nagios发送信号时,切换到存储到非上限集合,直到瓶颈通过,然后切换回来。 MongoDB将自动处理旧数据的老化数据,而不是每次移出整个10分钟的文件。