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

#python #logging #syslog

#python #ведение журнала #системный журнал

Вопрос:

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

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

Ответ №1:

Я думаю, что имя ПРИЛОЖЕНИЯ (которое указывает источник) является необязательным компонентом в заголовке системного журнала. Последняя версия SysLogHandler (для Python 3.3) включает поддержку ИМЕНИ ПРИЛОЖЕНИЯ (вызываемого ident в соответствии с C syslog API), но она недоступна в более ранних версиях. См. Эту проблему Python.

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

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

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

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

в журнале.

Комментарии:

1. В соответствии с проблемой python вы можете присвоить свойству handler.ident значение string, и оно будет автоматически добавляться ко всем сообщениям.

2. @Hubro правда, это более позднее дополнение к коду ведения журнала — оно было добавлено в результате связанной проблемы. Это решение предназначено для более старых версий Python.

3. Исправление после тестирования недостаточно просто указать handler.ident значение "app_name" , так как оно просто добавит его как есть, и в итоге вы получите строку журнала типа "app_nameThis is a test" . Вы должны включить ": " вручную.

Ответ №2:

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

 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?
  

Комментарии:

1. Похоже, что API для обработчиков отличается в некоторых версиях Python. Мне просто нужно было сделать следующее, чтобы обработать наши 2 среды: попробуйте: handler.addFormatter(formatter), кроме AttributeError, e: handler.formatter = formatter

Ответ №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)
  

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