Почему SysLogHandler Python требует адрес?

Этот код записывает в системный журнал, используя syslog модуль:

import syslog

syslog.syslog(syslog.LOG_ERR, 'a')

А вот эквивалентный код, использующий logging модуль:

import logging
from logging.handlers import SysLogHandler

logger = logging.getLogger()
logger.addHandler(SysLogHandler(address='/dev/log'))
logger.setLevel(logging.ERROR)
logger.error('a')

Если я пропущу address параметр во втором фрагменте, он ничего не делает. Почему logging версия требует от меня указать адрес, когда syslog модуль может сам разобраться?

Я бы предпочел не указывать этот путь, так как он зависит от платформы. Я собираюсь написать свою собственную версию SysLogHandler, которая делегирует syslog модуль?

2 ответа

Решение

syslog.syslog API позволяет отправлять события в системный регистратор только на локальном компьютере, тогда как, указав адрес в журнале Python, вы можете регистрировать не только локальный компьютер, но и удаленный syslog сервер. Таким образом, подход к ведению журнала охватывает более широкий круг обстоятельств, чем syslog.syslog делает. Также обратите внимание, что на некоторых платформах / в некоторых средах syslog.syslog не всегда был поточно-ориентированным (в прошлом), потому что базовый API системного вызова не был поточно-ориентированным в этих средах. Это может быть не так, но лучше проверить документацию для syslog на вашей платформе. Для получения дополнительной информации см. Эту проблему Python.

Кроме того, вы можете войти в syslog сервер с Windows-компьютеров, используя API регистрации (syslog модуль недоступен в Windows).

Из документации:

Note that if your server is not listening on UDP port 514, SysLogHandler may appear not to work.

Вы убедились, что ваш системный журнал прослушивает порт по умолчанию (514), используемый SysLogHandler? Если они не совпадают, вам нужно будет указать конкретный номер порта или путь к журналу для использования.

Смотрите: https://docs.python.org/2/library/logging.handlers.html

Другие вопросы по тегам