2012-08-02 35 views
5

我正在使用tcpflow记录服务器上的网络流量。我想将这些数据记录到一个文件中,但不是全部是。监控进程将作为守护进程无限期地在后台运行。如何在将文本写入文件之前预处理无限文本流?

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

对于我来说,对流进行这种“即时预处理”以决定重定向到日志文件的最佳方式是什么?某种类型的第二个守护进程脚本正在监听流,该流被传送到该脚本中?

例子:

我看到流中的以下行:

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

首先,我需要检查它有一个 “设置”。然后,我检查最后一行(1429),然后读取下一个1429字节并将它们写入文件。

+0

貌似tcpflow支持像tcpdump的 – jordanm 2012-08-02 18:37:28

+0

@jordanm过滤器表达式,我不认为这将有助于我。以下是一个示例行: '1343932842:010.079.091.189.35856-010.104.001.199。11211:set i:1:20163484235 0 0 1429' 我需要先看到该行有一个“set”,然后检查最后一行(1429),然后读取下一个1429字节并将它们写入文件。 – Tim 2012-08-02 18:40:51

+0

你在写什么语言?这个执行的环境是什么?标签“bash”和“php”令人困惑...... – tucuxi 2012-08-02 19:15:34

回答

1

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

假设你有称为“捕获”和所谓的“过滤”的过滤程序的可执行,则可以一起连锁他们使用

bash-prompt$ capture capture-params | filter 

任何一个bash外壳,capture写入stdout将提供给filter作为stdin的输入。从过滤器的角度来看,读取行是一件简单的事情,当找到end ... size模式时,将输出写入输出文件(或再次写入stdout)。如果你写一个标准输出,你可以重定向到使用

bash-prompt$ capture capture-params | filter > output-file.txt 
+0

如何将两者挂钩?我是否有第二个C程序调用shell来启动生成流的第一个程序?我是否有第一个程序写入到第二个程序读取的临时文件? (我宁愿不使用该解决方案)。 – Tim 2012-08-02 20:06:45

+0

增加了几个使用bash链接的例子。这是非常“做事的unix方式”:做单一事物的小程序可以被组合成更大的程序。 – tucuxi 2012-08-02 20:47:47

+0

谢谢。那么,“过滤器”程序是一个C程序,基本上是一个无限循环,反复读取stdin,解析/处理它,并写入标准输出?过滤程序是否必须用C编译?它可以只是一个PHP脚本? – Tim 2012-08-02 21:14:28

0

你可以在使用awk飞文本处理的文件。您需要学习语言,但我在活动日志解析中使用类似的任务。我做了tail -f file.log | awk -f myscript.awk

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

0

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

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

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

相关问题