如何在一段时间后从日志文件中删除 IP 地址

如何在一段时间后从日志文件中删除 IP 地址

我有一个 apache/nginx/whatever web 服务器,它将客户端 IP 地址记录到访问日志中。现在这些日志文件通过 进行轮换logrotate

我想保留 IP 地址几天,然后 7 天后,出于隐私原因(主要受德国法律规定),我想从日志文件中删除 IP。

使用mod_removeip或类似的东西不起作用,因为我需要根据它们的 IP 地址过滤一些请求。

有没有什么“标准”的方法可以做到这一点?也许甚至可以用logrotate

编辑

我刚刚发现这个脚本但这取决于实时将所有日志通过脚本传输的能力。我不太确定这种方法对性能的影响。

此外,这仅适用于“前端”服务器日志,而不适用于应用程序服务器日志。

答案1

PCRE!(Perl 兼容正则表达式)

s/\b(1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\.(1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\.(1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\.(1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\b/REMOVED IP/g

使用它作为 perl 脚本或任何其他合适语言中的过滤器(相当多使用 PCRE 或其他足够接近的正则表达式语言)在 7 天内重写您的日志文件。

$ cat > file_with_ip
some text from 192.168.1.1
^D
$ perl -p -i -e 's/\b(1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\.(1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\.(1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\.(1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\b/REMOVED IP/g' file_with_ip
$ cat file_with_ip
some text from REMOVED IP

答案2

Ubuntu > 12.04/上apache 2.4,使用默认配置,您可以使用如下内容:

for file in `find /var/log/apache2 -type f -name ".*gz"  ! -name "*.ano.*" -mtime +7`
do
    datestamp=`date +"%Y%m%d%H%M%s"`
    # echo Process $file
    zcat $file |sed -E "s/([0-9]{1,3}\.[0-9]{1,3})\.[0-9]{1,3}\.[0-9]{1,3}/\1.0.0/"|gzip > ${file%.*}.ano.${datestamp}.gz 
    # rm -f $file # Only call this if you are sure that the command before succeeds, otherwise you will lose data.
done

*.gz这将创建7 天前的所有文件的副本,并用添加的后缀替换IPs 0.0复制版本中所有文件的最后两个字节。ano

如果您不使用压缩或不同的压缩,则bz2必须相应地更改命令,例如zcat-> bzcat

cron最后,您可以每天/每周调用一次此例程。

答案3

我认为 logrotate 无法做到这一点;您可能需要考虑创建一个脚本来解压文件,通过 awk 或 sed 处理它们以去除 IP,然后重新压缩它们。只是无法对“活动”日志文件执行此操作。

相关内容