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 |
разными нагрузками таких проблем не было. "Лучше меньше да лучше" (с)... |