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