2011-05-18 46 views
1

IM有這樣的情況: 林解析用Perl守護一些日誌文件。這個守護進程將數據寫入mysql數據庫。perl的文件::尾同步化

日誌文件可以:

  1. 旋轉
  2. 犯規存在(在尾 'ignore_nonexistant' 參數)( '由文件大小和一些邏輯解決')

守護程序:

  1. 可殺
  2. 可以通過一些成了死reazon。

進出口使用文件::尾對尾塔文件。對於創建日期或文件大小的文件循環機制可以提供幫助。以及我應該使用什麼機制從文件中的某個位置開始尾巴? (假設有很多這樣的守護進程,沒有對文件系統的寫入訪問)。

我已經想過在DB中的位置變量,但這不會幫助我。

也許一些機制將位置參數傳遞給parrent進程?

我只是不想重塑自行車。

回答

2

File :: Tail已經檢測到旋轉並繼續從新文件讀取。

爲了對付守護死亡和重新啓動,您可以查詢寫入時的守護進程重新啓動,就跳過日誌行,直到你得到一個更晚的線的最後一個記錄數據庫?

+0

生病請嘗試這種方式。 – MealstroM 2011-05-18 19:31:25

2

嘗試http://search.cpan.org/dist/Log-Unrotate/。 如果您希望將位置文件存儲在數據庫而不是本地文件系統中,則必須實現您自己的Log::Unrotate::Cursor類,但這應該是微不足道的。

我們寫和使用Log::Unrotate 5年的生產和它試圖真的很難絕不放棄任何數據。 (如果你的光標變得無效,例如,如果日誌被旋轉了幾次,而讀取器因爲某種原因不起作用,它會試圖很難以拋出異常,你可能想要啓用autofix_cursor選項來改變這種行爲)。

而且看一看http://search.cpan.org/dist/File-LogReader/。我從來沒有使用它,但它應該解決相同的任務。

+0

想象有一個要解析的文件列表。你運行你的main(父)守護進程,爲每個文件生成子節點。現在,它的工作方式如下:記錄已解析的最後一行,並監視文件大小和文件長度(行數)。如果出現錯誤,它會在file.log文件file1.log file.1.tar.gz中找到該行,並從文件* bydate.log - >中找到並從最後一個位置開始。這行存儲在mysql數據庫中。但那是每一行更新命令 – MealstroM 2011-05-20 06:37:09