У меня есть apache / nginx / любой веб-сервер, который регистрирует IP-адреса клиентов в журналах доступа. Теперь эти файлы журналов чередуются через 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
Это создает копию всех *.gz
файлы старше 7 дней и заменяет последние два байта всех IPs
0.0
в скопированной версии с ano
добавлен суффикс.
Если вы не используете сжатие или другое сжатие, например bz2
вы должны соответственно изменить команды, например zcat
-> bzcat
.
Наконец, вы можете вызвать эту процедуру через cron
один раз в день / неделю.
Я не думаю, что logrotate с этим справится; вам может потребоваться создать сценарий, который будет распаковывать файлы, обрабатывать их с помощью awk или sed, чтобы удалить IP-адреса, а затем повторно сжимать их. Просто не могу этого сделать с «активными» лог-файлами.