在 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,等等......

相关内容