Pull to refresh

Logrotate. Postrotate скрипт и имя файла

Reading time1 min
Views20K
Думаю что нет *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


Если есть решение лучше — делитесь и критикуйте.
Tags:
Hubs:
Total votes 7: ↑5 and ↓2+3
Comments4

Articles