クライアントのIPアドレスをアクセスログに記録するApache/nginx /その他のWebサーバーがあります。現在、これらのログファイルはlogrotate
を介してローテーションされます。
IPアドレスを数日間保持したいのですが、7日後に、プライバシー上の理由からログファイルからIPを削除したいと思います(主にドイツの法律で定められています)。
mod_removeip
などを使用すると、IPアドレスに基づいて一部のリクエストをフィルタリングする必要があるため、機能しません。
それを行うための「標準的な」方法はありますか?たぶんlogrotate
でも?
[〜#〜]編集[〜#〜]
私はちょうど見つけました このスクリプト しかしそれはリアルタイムでスクリプトを通してすべてのロギングをパイプする能力に依存します。このアプローチのパフォーマンスへの影響についてはよくわかりません。
また、これは「フロントエンド」サーバーログに対してのみ機能し、アプリケーションサーバーログに対しては機能しません。
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
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
ファイルのコピーが作成され、コピーされたバージョンのすべてのIPs
0.0
の最後の2バイトがano
サフィックスが追加されて置き換えられます。
圧縮またはbz2
のような別の圧縮を使用しない場合は、それに応じてコマンドを変更する必要があります。 zcat
-> bzcat
。
最後に、cron
を介してこのルーチンを1日/週に1回呼び出すことができます。
Logrotateがそれを行うとは思わない。ファイルを解凍し、awkまたはsedで処理してIPを取り除き、再圧縮するスクリプトの作成を検討する必要がある場合があります。 「アクティブな」ログファイルでは実行できません。