web-dev-qa-db-ja.com

しばらくしてからログファイルからIPアドレスを削除するにはどうすればよいですか?

クライアントのIPアドレスをアクセスログに記録するApache/nginx /その他のWebサーバーがあります。現在、これらのログファイルはlogrotateを介してローテーションされます。

IPアドレスを数日間保持したいのですが、7日後に、プライバシー上の理由からログファイルからIPを削除したいと思います(主にドイツの法律で定められています)。

mod_removeipなどを使用すると、IPアドレスに基づいて一部のリクエストをフィルタリングする必要があるため、機能しません。

それを行うための「標準的な」方法はありますか?たぶんlogrotateでも?

[〜#〜]編集[〜#〜]

私はちょうど見つけました このスクリプト しかしそれはリアルタイムでスクリプトを通してすべてのロギングをパイプする能力に依存します。このアプローチのパフォーマンスへの影響についてはよくわかりません。

また、これは「フロントエンド」サーバーログに対してのみ機能し、アプリケーションサーバーログに対しては機能しません。

7
Michael Siebert

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
Jeff Ferland

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

これにより、7日より古いすべての*.gzファイルのコピーが作成され、コピーされたバージョンのすべてのIPs0.0の最後の2バイトがanoサフィックスが追加されて置き換えられます。

圧縮またはbz2のような別の圧縮を使用しない場合は、それに応じてコマンドを変更する必要があります。 zcat-> bzcat

最後に、cronを介してこのルーチンを1日/週に1回呼び出すことができます。

1
jschnasse

Logrotateがそれを行うとは思わない。ファイルを解凍し、awkまたはsedで処理してIPを取り除き、再圧縮するスクリプトの作成を検討する必要がある場合があります。 「アクティブな」ログファイルでは実行できません。

0