Как я могу удалить IP-адреса из файлов журнала через некоторое время

У меня есть веб-сервер apache/nginx/ любой другой, который регистрирует IP-адреса клиентов в журналах доступа. Теперь эти файлы журнала вращаются с помощью logrotate,

Я хочу сохранить IP-адреса в течение нескольких дней, затем через 7 дней я хочу удалить IP-адреса из файлов журнала по соображениям конфиденциальности (в основном это продиктовано законодательством Германии).

С помощью mod_removeip или что-то подобное не работает, потому что мне нужно отфильтровать некоторые запросы на основе их IP-адресов.

Есть ли "стандартный" способ сделать это? Может быть, даже с logrotate?

РЕДАКТИРОВАТЬ

Я только что нашел этот скрипт, но он зависит от способности передавать все записи через скрипт в режиме реального времени. Я не совсем уверен насчет производительности этого подхода.

Кроме того, это работает только для журналов внешнего сервера, но не для журналов сервера приложений.

3 ответа

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

Это создает копию всех *.gz файлы старше 7 дней и заменяет последние два байта всех IPs0.0 в скопированной версии с ano добавлен суффикс

Если вы не используете сжатие или другое сжатие, как bz2 Вы должны изменить команды соответственно, например, zcat -> bzcat,

Наконец, вы можете вызвать эту процедуру через cron один раз в день / неделю.

Я не думаю, что logrotate сделает это; вам, возможно, придется взглянуть на создание сценария, который будет распаковывать файлы, обрабатывать их через awk или sed для извлечения IP-адресов, а затем повторно сжимать их. Просто не могу сделать это на "активных" файлах журнала.

Другие вопросы по тегам