| Summary: | Не протоколирует локальные сообщения syslog | ||||||
|---|---|---|---|---|---|---|---|
| Product: | Sisyphus | Reporter: | Evgenii Terechkov <evg> | ||||
| Component: | rsyslog | Assignee: | Alexey Shabalin <shaba> | ||||
| Status: | CLOSED FIXED | QA Contact: | qa-sisyphus | ||||
| Severity: | critical | ||||||
| Priority: | P3 | CC: | ldv, serjigva, shaba | ||||
| Version: | unstable | ||||||
| Hardware: | all | ||||||
| OS: | Linux | ||||||
| Attachments: |
|
||||||
На другой машине с rsyslog (но уже физической под systemd, а не под openvz/sysvinit) локальные сообщения протоколируются. Там вот так: ======================================================================== root@thinkpad ~ #lsof /dev/log COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME systemd 1 root 30u unix 0xffff88013094e780 0t0 1377 /dev/log systemd-j 733 root 5u unix 0xffff88013094e780 0t0 1377 /dev/log ======================================================================== состав пакетов rsyslog* идентичен. С syslog-ng из сизифа такой проблемы не наблюдается. Будьте добры, проверьте rsyslog из задания #111581 Попробовал свежий 7.4.8-alt1 из Сизифа и alt2 из #111581. На свежем контейнере openvz - воспроизвелось оба раза. Попробовал и на физической машинке (i586, std-pae, установил пакеты rsyslog, rsyslog-server-listen без всякой настройки) - тоже воспроизводится. Что интересно: если после запуска rsyslogd (сервисом, а не в режиме foreground) убить занимающий /dev/log minilogd (проверяю всю дорогу посредством lsof /dev/log) а потом сделать service rsyslog stop, то видно, что /dev/log снова занимается новым процессом minilogd. Что утверждает меня в мысли, что что-то не так в консерватории (SysVinit). На этой же физической машине вернул обратно syslogd klogd, запустил - сокет занялся, всё протоколируется нормально (без перезагрузки и на rsyslog переключался и обратно на syslogd). Для начала уберите SysSock.Unlink="off" из /etc/rsyslog.d/00_common.conf, должно помоч.
Я добавил этот параметр в конфиг, потому что мне не понравилось поведение rsyslog при остановке сервиса, он при выходе удаляет все дополнительные сокеты, указанные для chroot-сервисов в /etc/syslog.d/*
Изначальную проблему - обработку директории /etc/syslog.d/* и добавление дополнительных сокетов логирования я попытался решить внешними средствам без модификации исходников - перед стартом сервиса запускается генератор конфига /etc/rsyslog.d/00_extrasockets.conf
Потом я обнаружил что все эти дополнительные сокеты удалаются при остановке rsyslog. Т.к. такого поведения у sysklogd я не замечал, добавил параметр SysSock.Unlink="off".
В принципе, rsyslog снова создает ранее удалённые сокеты, и все должно работать, Но мне не понравилось удаление файлов из чужих пакетов.
to ldv@: не могли бы вы немного объяснить по работе syslogd?
Я вижу в исходниках два массива, funixn и funix.
В функции die
/* Close the UNIX sockets. */
for (i = 0; i < nfunix; i++)
if (funix[i] != -1)
close(funix[i]);
/* Close the inet socket. */
if (InetInuse) close(inetm);
/* Clean-up files. */
for (i = 0; i < nfunix; i++)
if (funixn[i] && funix[i] != -1)
(void)unlink(funixn[i]);
Т.е. файлы сокетов funixn[i] будут удаляться только если funix[i] не равно -1.
У меня создалось впечатление, что весь массив funix состоит из -1.
Не могу понять, почему он так заполняется.
Я правильно понял, что в sysklogd не выполняется удаление дополнительных сокетов chroot-сервисов unlink(funixn[i]), т.к. funix[i] всегда = -1?
аналогичный код в imuxsock.c(в rsyslog) выглядит так:
/* Close the UNIX sockets. */
for (i = 0; i < nfd; i++)
if (listeners[i].fd != -1)
close(listeners[i].fd);
/* Clean-up files. */
for(i = startIndexUxLocalSockets; i < nfd; i++)
if (listeners[i].sockName && listeners[i].fd != -1) {
/* If systemd passed us a socket it is systemd's job to clean it up.
* Do not unlink it -- we will get same socket (node) from systemd
* e.g. on restart again.
*/
if (sd_fds > 0 &&
listeners[i].fd >= SD_LISTEN_FDS_START &&
listeners[i].fd < SD_LISTEN_FDS_START + sd_fds)
continue;
if(listeners[i].bUnlink) {
DBGPRINTF("imuxsock: unlinking unix socket file[%d] %s\n", i, listeners[i].sockName);
unlink((char*) listeners[i].sockName);
}
}
discardLogSockets();
nfd = 1;
Возможно я вообще не там ищу проблему и ошибаюсь. Тогда прошу направить на путь истинный.
скорее всего вызов discardLogSockets() в конце все удаляет. нужно ли его звать? извиняюсь, ошибочно выставил fixed. (In reply to comment #6) > to ldv@: не могли бы вы немного объяснить по работе syslogd? > Я вижу в исходниках два массива, funixn и funix. > В функции die В некотором смысле совершенно все равно, что делает syslogd в функции die, поскольку он к этому времени уже глубоко в чруте, и никаких прав удалять файлы сокетов у него нет. Мне скорее всего не удастся засунуть rsyslog в чрут. Т.е. удаление сокетов при выходе - это правильное поведение? даже для sysklogd, если он не в чруте? И можно оставить такое поведение в rsyslog или запретить удаление? (In reply to comment #10) > Мне скорее всего не удастся засунуть rsyslog в чрут. > Т.е. удаление сокетов при выходе - это правильное поведение? даже для sysklogd, > если он не в чруте? И можно оставить такое поведение в rsyslog или запретить > удаление? На удаление сокетов при завершении все равно нельзя полагаться, поскольку в случае аварийного завершения это удаление может и не произойти. Все равно при старте эти сокеты (если они есть) необходимо удалять, так что сильно заморачиваться с удалением при завершении не стоит. тогда последний вопрос :) правильно ли я сделал http://git.altlinux.org/people/shaba/packages/?p=rsyslog.git;a=commitdiff;h=f9ab85c8840fddf5f5b293d8eab041eebf9e2d62 или надо откатить? (In reply to comment #12) > тогда последний вопрос :) > правильно ли я сделал > http://git.altlinux.org/people/shaba/packages/?p=rsyslog.git;a=commitdiff;h=f9ab85c8840fddf5f5b293d8eab041eebf9e2d62 Правильно. > или надо откатить? Откатывать нельзя апстримить? :) rsyslog-7.4.8-alt3 -> sisyphus: * Fri Jan 10 2014 Alexey Shabalin <shaba@altlinux> 7.4.8-alt3 - drop SysSock.Unlink=off option (ALT#29666) * Fri Jan 10 2014 Alexey Shabalin <shaba@altlinux> 7.4.8-alt2 - fixed run for SysV Проверил, работает. Спасибо! |
Created attachment 6012 [details] Отчёт system-report о машине Установил на OpenVZ CT пакеты rsyslog, rsyslog-server-listen (при этом удалились syslogd sysklogd klogd), запустил. Всё хорошо, сообщения протоколируются. Однако после перезагрузки перестали протоколироваться локально-сгенерированные сообщения (например, через команду logger). Сообщения от удалённых хостов пишутся. При (ре)старте rsyslog в /v/l/s/messages такая ругань: ========================================================= rsyslogd: cannot create '/dev/log': Address already in use ========================================================= и действительно: ========================================================= root@newmons ~ # lsof /dev/log COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME minilogd 133 root 8u unix 0xffff880270397b00 0t0 956630925 /dev/log ========================================================= Если убить minilogd и сказать service restart/reload rsyslogd, ничего не меняется, /dev/log по прежнему занят minilogd. Однако если остановить rsyslogd, убить minilogd и запустить rsyslogd -n (или rsyslog -4 -w -x -n, как указано в /e/sysconfig/rsyslog плюс опция -n), то rsyslog открывает /dev/log и локальные сообщения начинают протоколироваться. Я подозреваю, проблема как-то связана с косвенным вызовом initlog из /etc/init.d/rsyslogd