Сообщения системного журнала отображаются как «Неизвестные», когда я использую Python logging.handlers.SysLogHandler - PullRequest
11 голосов
/ 19 октября 2011

Когда я запускаю это на моем 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?")

Это выглядит так в системном журнале:

Oct 18 19:02:06 nick Unknown[4294967295] <Error>: What the crap?

Почему это неизвестно?Разве это не должно быть достаточно умно, чтобы называть себя после name ?

скрипта

Ответы [ 3 ]

15 голосов
/ 19 октября 2011

Я думаю, что APP-NAME (который указывает на источник) является необязательным компонентом в заголовке системного журнала.Последняя версия SysLogHandler (для Python 3.3) включает поддержку APP-NAME (называемой ident в соответствии с API syslog для C), но она недоступна в более ранних версиях.См. этот выпуск Python .

Если вы добавите имя скрипта ко всем сообщениям, вы получите желаемый эффект.Например,

logger.error('foo: What\'s up?')

будет отображаться, например,

19/10 / 2011 13:51:17 foo [2147483647] Что случилось?

в журнале.

6 голосов
/ 05 июля 2012

Чтобы получить то, что вам нужно, вы должны добавить форматировщик в обработчик, чтобы вам не приходилось вручную форматировать каждое сообщение.

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?")

Теперь вы должны увидеть, что вы видите записи в системном журнале каквы ожидаете:

Jul  4 14:34:40 ip-127-0-0-1 script_name.py: [ERROR] What the crap?
3 голосов
/ 18 августа 2013

Можно найти весь список, какое слово соответствует тому, что в списке вы можете найти на этой ссылке

Если вам нужно больше, вы можете посмотреть следующий пример:

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)

Это довольно просто, и я использую этот метод в качестве глобального пакета регистрации в моих проектах.

...