Думаю что нет *nix-админа, который не пользуется утилитой logrotate. Часто мы пользуемся ею, даже не подозревая что она установлена в системе. Однако, когда мне понадобилось пропарсить проротейченный log-файл, я был крайне удивлен.
Итак, задача проста как пятак поросенка, а встречается куда как чаще. Надо пропарсить лог после ротации. Допустим у нас текстовый лог squid'a лежащий в /var/log/squid. Имеем /etc/logrotate.d/squid следующего содержания:
/var/log/squid/*.log {
daily
missingok
rotate 8
compress
copytruncate
delaycompress
notifempty
nocreate
sharedscripts
postrotate
/etc/init.d/squid reload > /dev/null
endscript
}
То есть ротейтим лог файл раз в день, после ротации перезапускаем squid, свежепроротейченный файл не жмем. Напрашивается очевидное решение — добавить в postrotate вызов нашего обработчика, примерно так:
postrotate
/etc/init.d/squid reload > /dev/null
/где-то-там/sq_control/manage.py squid --load-log $FILENAME
endscript
Однако не тут-то было. В манах ничего про перееменные в pre/postrotate не сказано. Совсем ничего. Как будто их нет и никому они не нужны. Гугление тоже не дало каких либо ощутимых результатов. Однако методом тыка было выяснено, что переменная $1 содержит имя файла. Правда не то, которое получается после ротации, а то, что подходит под маску. В нашем случае /var/log/squid/access.log — не то что нужно, но тоже хлеб. Зная, что logrotate стандартно добавляет суффикс -YYYYMMDD и имея под рукой sed получаем:
postrotate
/etc/init.d/squid reload > /dev/null
fffn=$1"-"`date '+%Y%m%d'`
fffn=`echo "$fffn" | sed -r 's/s+//g'`
/где-то-там/sq_control/manage.py squid --load-log $fffn
endscript
Если есть решение лучше — делитесь и критикуйте.
Автор: xenolog