Logpipe - простой ротатор лог-файлов для *nix систем.
Для чего это надо?
Если у вас есть сервис, который очень долго останавливается и запускается, например, Apache + mod_perl или сервис, генерирующий большое количество логов и который крайне нежелательно регулярно "тушить" (Squid, Oops), logpipe - самый подходящий выбор.
Logpipe решит проблему нехватки места при выводе большого количества данных и одновременно с этим не допустит их потери.
Чем этот ротатор логов лучше остальных?
Начнем с того, что logpipe очень гибко настраивается. Вы можете указать:
- владельца и группу заархивированных файлов
- права пишущегося логфайла и архивных копий
- максимальное количество хранящихся архивных копий логов.
- максимальный размер логфайла, точное время или временной промежуток, по достижении которых происходит ротация лога
Синтаксис файла конфигурации ротатора почти полностью повторяет синтаксис ротатора логов FreeBSD newsyslog.conf(5). Это привычно и удобно и потому не вызывает проблем при конфигурировании.
Кроме всего этого, logpipe занимает мало места в оперативной памяти и работает очень быстро, поскольку написан с учетом специфических особенностей операционных систем Linux и FreeBSD. Так, для Linux используется epoll(4), а для FreeBSD - kqueue(2). Разумеется, это не означает, что logpipe не сможет работать на других OS - для неизвестной архитектуры предусмотрена сборка с poll(2).
Как это работает?
Программа logpipe принимает на стандартный ввод поток данных (STDIN), который пишет в указанный лог-файл. По достижении одного из условий (превышение по размеру, истечении указанного интервала времени, наступлению определенной даты) текущий файл закрывается, переименовывается и сжимается архиватором.
Если в каталоге, в который предполагается записать файл, уже есть архив с таким именем (по умолчанию - имя_лога.0.gz), имена архивов "сдвигаются" вниз:
имя_лога.1.gz переименеовывается в имя_лога.2.gz, имя_лога.0.gz в имя_лога.1.gz. Когда количество заархивированных файлов становится больше указанного, последний из них (наиболее старый архив) стирается.
Следует отметить, что во время производимых операций архивации данных чтение из STDIN не прекращается, и сбрасываемые в лог данные не теряются.
Как это использовать?
Для вебсервера Apache достаточно прописать в httpd.conf выделенные жирным строчки:
<VirtualServer *>
ServerName www.example.com
ServerAlias example.com
...
ErrorLog "|/путь/к/logpipe /путь/к/лог/файлу/error_log /путь/к/logpipe.conf"
CustomLog "|/путь/к/logpipe /путь/к/лог/файлу/access_log /путь/к/logpipe.conf" common
</VirtualServer>
Первый параметр - сама программа logpipe (указать полный путь).
Второй параметр, /путь/к/лог/файлу/error_log - файл, в который пишется лог.
Третий параметр, /путь/к/logpipe.conf - файл конфигурации ротатора. Если не задан, то по умолчанию для FreeBSD используется /usr/local/etc/logpipe.conf, а для Linux и остальных систем - /etc/logpipe.conf.
Компиляция
Сборка logpipe очень проста: надо выполнить всего лишь одну команду: cc logpipe.c -o logpipe.
После этого в текущем каталоге появится исполняемый файл logpipe. Вы можете скопировать его в /usr/bin, /usr/local/bin или куда заблагорассудится ;).
Если кажется необходимым, можно использовать флаги оптимизации -OX.
Настройка
Как уже упоминалось, файл конфигурации logpipe почти полностью повторяет синтаксис ротатора логов FreeBSD newsyslog.conf(5):
# 1 2 3 4 5 6 7
# logfilename [owner:group] mode count size when command
/var/log/apache/error_log root:wheel 0640 6 * @T00 /path/to/some/script.sh
/var/log/apache/access_log root:wheel 0640 6 * 2
Первое поле - имя ротируемого файла логов.
Это имя вы указываете вторым параметром в строчке
ErrorLog "|/путь/к/logpipe /путь/к/лог/файлу/error_log /etc/logpipe.conf"
Второе поле - реквизиты владельца файла логов (user:group либо user_id:group_id).
Третье поле - права доступа; задается в восьмеричной системе.
Четвертое поле - количество хранимых архивных копий логов.
Пятое поле - Максимальный размер файла лога.
Шестое поле - временной интервал.
В седьмом, необязательном поле указывается скрипт, запускаемый после выполнения архивации лог-файла. Скрипту передается единственный параметр - имя дайла до архивации.
Временной интервал может быть указан в виде:
- усеченного формата ISO 8601
@[[[[cc]yy]mm]dd][T[hh[mm[ss]]]]]:
К примеру, для полуночи, 22 января 1999 года, приведенные записи эквивалентны:
@19990122T000000
@990122T000000
@0122T000000
@22T000000
@T000000
@T0000
@T00
@22T
@T
- формата $DWM (Day-Week-Month)
Примеры:
$D0 ротировать каждую полночь (тоже, что и @T00)
$D23 ротировать каждый вечер в 23:00 (тоже, что и @T23)
$W0D23 ротировать раз в неделю по воскресеньям в 23:00
$W5D16 ротировать раз в неделю по пятницам в 16:00
$M1D0 ротировать каждый первый день месяца в полночь (тоже, что и @01T00)
$M5D6 ротировать по пятым числам каждого месяца в 6:00( тоже, что и @05T06)
- временного интервала, заданного в часах. (1 - ротировать каждый час; 168 - раз в неделю).
Скачать! (Download)
Скачать файл: logpipe.c.
Протестировано и работает на платформах:
FreeBSD 4.X
FreeBSD 5.X
FreeBSD 6.0
RedHat 9.0
Fedora Core 3
RedHat EL 4 (Nahant)
SunOS 5.7 sparc
SunOS 5.10 i386
© 2005, 2006 stellar.
При воспроизведении материала поставьте ссылку на http://reki.ru.