Как настроить 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".

716   1  

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;MyappTpl
Я также хочу отметить, что документация, предоставленная соответствующим пакетом (rsyslog-doc для ubuntu), конечно, соответствует установленной версии и содержит подсказки, которые я не нашел в онлайн-документации.

Comments

    Ничего не найдено.