Logpipe - простой ротатор лог-файлов для *nix систем.




Для чего это надо?

Если у вас есть сервис, который очень долго останавливается и запускается, например, Apache + mod_perl или сервис, генерирующий большое количество логов и который крайне нежелательно регулярно "тушить" (Squid, Oops), logpipe - самый подходящий выбор.
Logpipe решит проблему нехватки места при выводе большого количества данных и одновременно с этим не допустит их потери.

Чем этот ротатор логов лучше остальных?

Начнем с того, что logpipe очень гибко настраивается. Вы можете указать:
  1. владельца и группу заархивированных файлов
  2. права пишущегося логфайла и архивных копий
  3. максимальное количество хранящихся архивных копий логов.
  4. максимальный размер логфайла, точное время или временной промежуток, по достижении которых происходит ротация лога

Синтаксис файла конфигурации ротатора почти полностью повторяет синтаксис ротатора логов 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).
Третье поле - права доступа; задается в восьмеричной системе.
Четвертое поле - количество хранимых архивных копий логов.
Пятое поле - Максимальный размер файла лога.
Шестое поле - временной интервал.
В седьмом, необязательном поле указывается скрипт, запускаемый после выполнения архивации лог-файла. Скрипту передается единственный параметр - имя дайла до архивации.
Временной интервал может быть указан в виде:
  1. усеченного формата ISO 8601 @[[[[cc]yy]mm]dd][T[hh[mm[ss]]]]]:
    К примеру, для полуночи, 22 января 1999 года, приведенные записи эквивалентны:
     @19990122T000000
     @990122T000000
     @0122T000000
     @22T000000
     @T000000
     @T0000
     @T00
     @22T
     @T
    
  2. формата $DWM (Day-Week-Month)
    Примеры:
     $D0     ротировать каждую полночь (тоже, что и @T00)
     $D23    ротировать каждый вечер в 23:00 (тоже, что и @T23)
     $W0D23  ротировать раз в неделю по воскресеньям в 23:00
     $W5D16  ротировать раз в неделю по пятницам в 16:00
     $M1D0   ротировать каждый первый день месяца в полночь (тоже, что и @01T00)
     $M5D6   ротировать по пятым числам каждого месяца в 6:00( тоже, что и @05T06)
    
  3. временного интервала, заданного в часах. (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.