Как настроить rsyslog для использования с классом ведения журнала SysLogHandler?
Для записи сообщений журнала "myapp" в /var/log/local5.log я использую SysLogHandler.
Задача
"myapp" работает хорошо, без ошибок, но ничего не регистрируется, /var/log/local5.log остается пустым.
Конфигурация ведения журнала
Соответствующие части файла конфигурации ведения журнала:
handlers:
mainHandler:
class: logging.handlers.SysLogHandler
level: INFO
formatter: defaultFormatter
address: '/dev/log'
facility: 'local5'
loggers:
__main__:
level: INFO
handlers: [mainHandler]
Протоколирование теста
Вот как я пытаюсь записать лог в основной скрипт "myapp":
with open('myconfig.yml') as f:
logging.config.dictConfig(yaml.load(f))
log = logging.getLogger(__name__)
log.info("Starting")
Я добавил некоторые sys.stderr.write() к /usr/lib/python3.4/logging/handlers.py, чтобы посмотреть, что происходит, и я получить:
$ myapp
[SysLogHandler._connect_unixsocket()] Sucessfully connected to socket: /dev/log
[SysLogHandler.emit()] called
[SysLogHandler.emit()] msg=b'<174>2016/04/23 07:17:00.453 myapp: main: Startingx00'
[SysLogHandler.emit()] msg sent to unix socket (no OSError)
Конфигурация Rsyslog
/etc/rsyslog.conf(соответствующие части; приемы системного журнала TCP и UDP отключены):
$ModLoad imuxsock # provides support for local system logging
$ModLoad imklog # provides kernel logging support
[...]
$IncludeConfig /etc/rsyslog.d/*.conf
/etc/rsyslog.d/40-local.conf:
local5.* /var/log/local5.log
Тест Rsyslog
В соответствии с выводом lsof, похоже, что rsyslogd слушает /dev/log (или я ошибаюсь?):
# lsof | grep "/dev/log"
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
Output information may be incomplete.
rsyslogd 28044 syslog 0u unix 0xffff8800b4b9b100 0t0 3088160 /dev/log
in:imuxso 28044 28045 syslog 0u unix 0xffff8800b4b9b100 0t0 3088160 /dev/log
in:imklog 28044 28046 syslog 0u unix 0xffff8800b4b9b100 0t0 3088160 /dev/log
rs:main 28044 28047 syslog 0u unix 0xffff8800b4b9b100 0t0 3088160 /dev/log
Я не ставлю весь вывод rsyslogd -N1, так как он немного длинноват, но упомянутые "локальные" строки:
# rsyslogd -N1 | grep local
rsyslogd: version 7.4.4, config validation run (level 1), master config /etc/rsyslog.conf
3119.943361369:7f39080fc780: cnf:global:cfsysline: $ModLoad imuxsock # provides support for local system logging
3119.944034769:7f39080fc780: rsyslog/glbl: using '127.0.0.1' as localhost IP
3119.946084095:7f39080fc780: requested to include config file '/etc/rsyslog.d/40-local.conf'
3119.946135638:7f39080fc780: config parser: pushed file /etc/rsyslog.d/40-local.conf on top of stack
3119.946432390:7f39080fc780: config parser: resume parsing of file /etc/rsyslog.d/40-local.conf at line 1
3119.946678298:7f39080fc780: config parser: reached end of file /etc/rsyslog.d/40-local.conf
3119.946697644:7f39080fc780: Decoding traditional PRI filter 'local5.*'
3119.946723904:7f39080fc780: symbolic name: local5 ==> 168
3119.949560475:7f39080fc780: PRIFILT 'local5.*'
3119.949675782:7f39080fc780: ACTION 0x224cda0 [builtin:omfile:/var/log/local5.log]
3119.953397587:7f39080fc780: PRIFILT 'local5.*'
3119.953806713:7f39080fc780: ACTION 0x224cda0 [builtin:omfile:/var/log/local5.log]
rsyslogd: End of config validation run. Bye.
Я не понимаю, кто я такой. потерянный. документация rsyslog , соответствующая версии, которую я использую (7.4.4), кажется устаревшей, и я не могу найти в ней свой путь. Не уверен, что это то место, где можно найти способ решить мою проблему.
Правки:
- невозможно определить "личный" объект, такой как" myapp "(даже если он определен в
rsyslog.conf, поэтому я изменил его на "local5".
1 ответ:
Причина проблемы
Я наконец обнаружил, что ранее создал
/var/log/local5.logс неподходящим владельцем и группой (root:root). Они были неуместны, потому что/etc/rsyslog.confговорит явно владелец и группа должна бытьsyslog:syslog:# # Set the default permissions for all log files. # $FileOwner syslog $FileGroup adm $FileCreateMode 0640 $DirCreateMode 0755 $Umask 0022 $PrivDropToUser syslog $PrivDropToGroup syslogК сожалению, другие файлы журнала
rsyslog, о которых следует позаботиться (например,auth.log), также былиroot:root, поэтому, как видно изls -lah, мой не отличался от других... (какие еще пустые, интересно, почему такая нефункциональная конфигурация устанавливается по по умолчанию).К сожалению,
rsyslogне регистрирует никаких ошибок (или, по крайней мере, я не нашел, где).Некоторые дополнительные детали, которые могут быть полезны для завершения конфигурации rsyslog
В качестве примечания,
rsyslogожидает специальный формат для сообщений, которые он получает, и если это не так, он добавляет некоторую информацию, по умолчанию (имя хоста метки времени). Их можно модифицировать. В любом случае, из моего скрипта python я решил только отправить сообщение в журнал и позволитьrsyslogотформатировать вывод. Так наконец, соответствующие части моего файла конфигурации ведения журнала:formatters: rsyslogdFormatter: format: '%(filename)s: %(funcName)s: %(message)s' handlers: mainHandler: class: logging.handlers.SysLogHandler level: INFO formatter: rsyslogdFormatter address: '/dev/log' facility: 'local5' loggers: __main__: level: INFO handlers: [mainHandler]И я добавил настроенный шаблон в
/etc/rsyslog.conf:$template MyappTpl,"%$now% %timegenerated:12:23:date-rfc3339% %syslogtag%%msg%\n"И соответственно модифицированные
/etc/rsyslog.d/40-local.conf:Я также хочу отметить, что документация, предоставленная соответствующим пакетом (local5.* /var/log/local5.log;MyappTplrsyslog-docдля ubuntu), конечно, соответствует установленной версии и содержит подсказки, которые я не нашел в онлайн-документации.
Comments