在 iptables.log 檔案中搜尋需要很長時間

在 iptables.log 檔案中搜尋需要很長時間

我已經使用 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,等等......

相關內容