Думаю что нет *nix-админа, который не пользуется утилитой logrotate. Часто мы пользуемся ею, даже не подозревая что она установлена в системе. Однако, когда мне понадобилось пропарсить проротейченный log-файл, я был крайне удивлен.
Итак, задача проста как пятак поросенка, а встречается куда как чаще. Надо пропарсить лог после ротации. Допустим у нас текстовый лог squid'a лежащий в /var/log/squid. Имеем /etc/logrotate.d/squid следующего содержания:
То есть ротейтим лог файл раз в день, после ротации перезапускаем squid, свежепроротейченный файл не жмем. Напрашивается очевидное решение — добавить в postrotate вызов нашего обработчика, примерно так:
Однако не тут-то было. В манах ничего про перееменные в pre/postrotate не сказано. Совсем ничего. Как будто их нет и никому они не нужны. Гугление тоже не дало каких либо ощутимых результатов. Однако методом тыка было выяснено, что переменная $1 содержит имя файла. Правда не то, которое получается после ротации, а то, что подходит под маску. В нашем случае /var/log/squid/access.log — не то что нужно, но тоже хлеб. Зная, что logrotate стандартно добавляет суффикс -YYYYMMDD и имея под рукой sed получаем:
Если есть решение лучше — делитесь и критикуйте.
Итак, задача проста как пятак поросенка, а встречается куда как чаще. Надо пропарсить лог после ротации. Допустим у нас текстовый лог 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
Если есть решение лучше — делитесь и критикуйте.
