2012-08-02 36 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

相關問題