Сообщения Syslog отображаются как "Неизвестные", когда я использую Python logging.handlers.SysLogHandler
Когда я запускаю это на своем mac:
import logging.handlers
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
syslog_address = '/var/run/syslog'
logger.addHandler(logging.handlers.SysLogHandler(syslog_address))
logger.error("What the crap?")
Это отображается в syslog:
Oct 18 19:02:06 nick Unknown[4294967295] <Error>: What the crap?
Почему это Неизвестно? Разве это не должно быть достаточно умным, чтобы называть себя после имени script ?
Ответы
Ответ 1
Чтобы получить то, что вам нужно, вы должны добавить formatter к обработчику, чтобы вам не пришлось вручную самостоятельно форматировать каждое сообщение.
import logging.handlers
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
syslog_address = '/var/run/syslog'
handler = logging.handlers.SysLogHandler(syslog_address)
# create the formatter
formatter = logging.Formatter('%(name)s: [%(levelname)s] %(message)s')
# plug this formatter into your handler(s)
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.error("What the crap?")
Теперь вы увидите, что вы видите записи в syslog, как и ожидалось:
Jul 4 14:34:40 ip-127-0-0-1 script_name.py: [ERROR] What the crap?
Ответ 2
Я думаю, что APP-NAME (который указывает источник) является необязательным компонентом в заголовке syslog. Последняя версия SysLogHandler (для Python 3.3) включает поддержку APP-NAME (называемую ident
в соответствии с API syslog C), но она недоступна в более ранних версиях. См. эту проблему Python.
Если вы добавите имя script ко всем сообщениям, вы получите желаемый эффект. Например,
logger.error('foo: What\ up?')
отобразится, например.
19/10/2011 13:51:17 foo [2147483647] Что?
в журнале.
Ответ 3
Можно найти весь список, какое слово соответствует тому, что в списке вы можете найти на этой ссылке
Если вам нужно больше, вы можете посмотреть следующий пример:
from logging.handlers import SysLogHandler
import logging
def log(self, severity=logging.DEBUG, message=None):
"""
Log utility for system wide logging needs
@param severity Log severity
@param message Log message
@return
"""
logger = logging.getLogger()
logger.setLevel(severity)
syslog = SysLogHandler(address="/dev/log")
syslog.setFormatter(
logging.Formatter("%(module)s-%(processName)s[%(process)d]: %(name)s: %(message)s")
)
logger.addHandler(syslog)
logger.log(severity, message)
Это довольно просто, и я использую этот метод как глобальный пакет протоколирования в моих проектах.