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. |