Gentoo Archives: gentoo-user-ru

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

Replies

Subject Author
Re: [gentoo-user-ru] Logrotate не посылает сигнал процессу Sergey Kobzar <sergey.kobzar@××××.ru>