Gentoo Archives: gentoo-user-ru

From: Sergey Kobzar <sergey.kobzar@××××.ru>
To: gentoo-user-ru@l.g.o
Subject: Re: [gentoo-user-ru] Logrotate не посылает сигнал процессу
Date: Fri, 23 Aug 2013 13:26:57
Message-Id: 5217631B.50803@mail.ru
In Reply to: Re: [gentoo-user-ru] Logrotate не посылает сигнал процессу by Alex Efros
1 On 08/23/13 12:10, Alex Efros wrote:
2 > Hi!
3 >
4 > On Fri, Aug 23, 2013 at 11:03:55AM +0300, Sergey Kobzar wrote:
5 >> Пора выбрасывать logrotate на свалку?
6 >
7 > Я промолчал в начале обсуждения чтобы не лезть с не очень конструктивными
8 > предложениями, но раз уж дошло до такого вопроса, то могу поделиться своим
9 > мнением: не просто пора, с ним изначально не стоило связываться!
10 >
11 > Изначально подход logrotate достаточно порочен: ротацией логов должен
12 > заниматься тот, кто их пишет. Более того, если вас интересует надёжная и
13 > единообразная работа с логами, то нужно писать _все_ логи через
14 > специализированные приложения. А конкретно я имею в виду либо DJB'шный
15 > multilog из пакета daemontools либо его более продвинутый форк svlogd из
16 > пакета runit. Подробнее: http://smarden.org/runit/svlogd.8.html
17 >
18 > Обычно в идеологии daemontools/runit супервизор сервиса запускает два
19 > процесса - главный демон, который свои логи выдаёт на STDOUT, и связанный
20 > с ним через конвейер демон логгирования (multilog/svlogd), который на
21 > свой STDIN получает STDOUT главного демона и пишет его в лог-файлы.
22 > Когда в системе все сервисы запущены через такие супервизоры то
23 > получается, что практически все логи единообразно и надёжно пишутся,
24 > фильтруются и ротируются через multilog/svlogd (кроме Xorg.0.log,
25 > emerge.log и ещё парочки).
26 >
27 > Но есть пара нюансов. Во-первых это не работает для таких сервисов как
28 > apache или nginx т.к. у них не один лог-файл, а несколько, так что
29 > направить их вместе на STDOUT не вариант. Во-вторых конкретно nginx иногда
30 > нельзя запускать под супервизором daemontools/runit т.к. они несовместимы
31 > с режимом горячего обновления nginx (если оно необходимо для вашего сайта).
32 >
33 > В результате для демонов вроде apache/nginx используется другой подход:
34 > через супервизор запускается несколько сервисов-логгеров multilog/svlogd,
35 > по одному на каждый лог-файл apache/nginx, которые считывают данные из
36 > FIFO-файлов, в который apache/nginx пишут логи.
37 >
38 > Пример настройки логов nginx для runit:
39 >
40 > # создаём каталоги, куда будут писаться логи
41 > install -d -m 2750 -o log /var/log/nginx/access
42 > install -d -m 2750 -o log /var/log/nginx/error
43 >
44 > # даём сервисам svlogd доступ к этим каталогам (они будут работать от
45 > # юзера log, а не root)
46 > chown log /var/log/nginx/
47 >
48 > # для примера, настраиваем кол-во сохраняемых access-лог-файлов
49 > echo n500 >/var/log/nginx/access/config
50 >
51 > # заменяем файлы куда пишет логи nginx на FIFOшки
52 > mv /var/log/nginx/access_log{,.old}
53 > mv /var/log/nginx/error_log{,.old}
54 > mkfifo /var/log/nginx/access_log
55 > mkfifo /var/log/nginx/error_log
56 >
57 > # создаём новые сервисы (у меня сервисы runit находятся в /service/,
58 > # а активные сервисы в /var/service/ - это как бы аналоги /etc/init.d/
59 > # и /etc/runlevels/default/ - но у вас эти каталоги могут быть другими)
60 > mkdir /service/nginx-log-access/
61 > mkdir /service/nginx-log-error/
62 > echo 'exec chpst -u log svlogd /var/log/nginx/access/ <>/var/log/nginx/access_log' > /service/nginx-log-access/run
63 > echo 'exec chpst -u log svlogd /var/log/nginx/error/ <>/var/log/nginx/error_log' > /service/nginx-log-error/run
64 > chmod +x /service/nginx-log-access/run
65 > chmod +x /service/nginx-log-error/run
66 >
67 > # запускаем лог-сервисы
68 > ln -s /service/nginx-log-access/ /var/service/
69 > ln -s /service/nginx-log-error/ /var/service/
70 >
71 > # перезапускаем nginx (у меня это `sv t nginx`, у вас вероятно
72 > # `/etc/init.d/nginx restart`)
73 >
74 > У меня ./run-файлы сервисов содержат в начале ещё пару строк:
75 > #!/bin/sh
76 > exec 2>/dev/null
77 > я их для простоты описания опустил и думаю что всё будет работать и без них.
78 >
79
80 Спасибо за подробное описание. Я с данной системой не знаком - нужно
81 покопаться.
82
83 У меня по совместительству под рукой есть FreeBSD с ее newsyslog. Он
84 конесно менее фитчастый чем logrotate, но за годы использования под
85 разными нагрузками таких проблем не было. "Лучше меньше да лучше" (с)...