5

我正在使用 tcpflow 在服务器上记录网络流量。我想将这些数据记录到一个文件中,但不是全部。监视进程将无限期地作为守护进程在后台运行。

流的某些行包含一个字节数,如果我看到该字节数(比如 800 个字节),那么我需要将接下来的 800 个字节记录到文件中。如果没有,我希望不写入文件。

对我来说,对流进行这种“即时预处理”以决定将什么重定向到日志文件的最佳方式是什么?某种正在侦听流的第二个守护程序脚本,它通过管道传输到该脚本?

例子:

我在流中看到以下行:

1343932842: 010.079.091.189.35856-010.104.001.199.11211: set i:1:20163484235 0 0 1429

首先,我需要检查它是否有一个“集合”。然后,我检查该行的最后一段(1429),然后读取接下来的 1429 个字节并将其写入文件。

4

3 回答 3

1

是的,使用一个将流作为输入的守护程序,并按照您的描述进行操作。我会推荐 C 而不是脚本,因为它具有非常简单的输入/输出和非常低的开销。

假设您有一个名为“capture”的可执行文件和一个名为“filter”的过滤程序,您可以使用 bash shell 将它们链接在一起

bash-prompt$ capture capture-params | filter

任何capture写入标准输出的内容都可以filter作为标准输入的输入。从过滤器的角度来看,读取行是一件简单的事情,当找到 end ... size 模式时,将输出写入输出文件(或再次写入 stdout)。如果您写入标准输出,则可以使用将其重定向到文件

bash-prompt$ capture capture-params | filter > output-file.txt
于 2012-08-02T19:34:52.713 回答
0

到目前为止,您所描述的最优雅的应用程序是使用低占用空间的循环数据库。RRDtool 是开源行业标准、高性能数据记录和绘图。

使用 bash 命令,您可以将数据输入到数据库中,如果您选择,绘制它也非常简单。

参见: http: //oss.oetiker.ch/rrdtool/gallery/index.en.html

于 2012-12-28T04:45:54.753 回答
0

您可以使用 awk 进行动态文本处理。您将需要学习该语言,但我在实时日志解析中用于类似任务。我做tail -f file.log | awk -f myscript.awk

每一行都将通过您创建的 awk 脚本进行分析,使用 if-then-else,您可以检测行中存在的一些单词并激活 awk 代码的其他部分以不同方式解析该行,甚至运行外部程序。

于 2012-08-12T06:16:34.637 回答