我已經使用 iptables 通過修改文件來保存有關連接的信息,/etc/syslog.conf
以將信息保存在/var/log/iptables.log
.
因此,每隔 X 小時,我需要從日誌檔案中提取資訊。但問題是文件會更大,搜尋會更慢。所以我用了:
sed -i '/string/d' iptables.log
為了刪除我不再需要的東西。但是當我使用此命令時,iptables 停止在iptables.log
檔案中保存資料。
那麼,出了什麼問題呢?我要怎麼解決這個問題?
答案1
嘗試也許
cat iptables.log | sed -n "/PatternYouLookat/ p"
這樣你就不會在 sed 期間鎖定文件
在大檔案上, sed 的效能很差,所以嘗試先grep 檔案或(我所做的)保留一個標記/索引,這樣你就可以從這個檔案中刪除尾部,並且只處理檔案的尾部(即使使用臨時副本,如果處理是重的)。
您可以使用 sed -u 作為流程工作並避免大檔案上的一些緩衝區問題
答案2
我猜你正在使用系統日誌。我假設 sed 就地編輯實際上創建了一個新檔案並刪除了舊檔案。
如果您在沒有通知的情況下輪換/重新建立日誌文件,Syslog 會非常脆弱。您所看到的正是所發生的情況:syslog 不會將任何內容記錄到該文件中,即使該文件確實存在。這是因為 syslog 仍然具有舊的檔案句柄並寫入舊檔案(即使您無法使用 ls 等命令再看到它)。一旦 syslog 關閉該檔案句柄,資料就會消失。
我建議像 devnull 這樣使用 logrotate 來代替。如果您不想,請在 sed 呼叫後發出系統日誌重新載入或重新啟動。這應該可以解決問題。
答案3
使用日誌旋轉。通常,您每晚或每週輪換一次,但您可以將其變更為您需要的任何值。唯一的問題是,這可能意味著 iptables 需要在旋轉後重新啟動,這是由 logrotate 處理的。我不知道是否需要這樣做,也不知道這(或頻率)對您或您的應用程式是否有問題。
Logrotate 建立一個新的日誌檔案並重新命名舊的日誌檔案。您可以全部保留,也可以在一段時間後自動刪除它們。可以毫無問題地更改輪換的文件,因為它們不再用於日誌記錄。
- 假設您有一個日誌檔
access.log
。 - Logrotate 通常將其重新命名為
access.log-20140729
. - 您可以使用數字來代替日期:
access.log.1
。 - 您可以執行另一個使用 sed 變更的 cronscript
access.log.1
。 - 下一次旋轉時,該檔案將重新命名為
access.log.2
,並包含您的所有變更。 - 最新的
access.log
被重命名為access.log.1
,然後可以透過 sed 進行更改。 - 創建了一個新的
access.log
,等等......