2015-05-08 4 views
4

Я следил за несколькими ответами здесь, на SO безрезультатно.Как я могу регистрироваться из Python в syslog с помощью SysLogHandler или syslog в Mac OS X * и * Debian (7)

Я развиваюсь на Macbook (Yosemite), но наши тестовые/производственные коробки - это Debian 7 (с использованием rsyslog). Я пытаюсь выйти в syslog таким образом, который будет работать как локально, так и не.

Я попробовал использовать SysLogHandler. Это работает на Mac:

import logging 
import logging.handlers 
import syslog 

h = logging.handlers.SysLogHandler(address='/var/run/syslog', facility=syslog.LOG_LOCAL1) 
h.ident = 'works_on_macs' 
logger = logging.getLogger('i_am_a_lumberjack') 
logger.addHandler(h) 

logger.debug("And I don't care") 
logger.info('There is a sale on today') 
logger.warn('Do not touch the hot stove!') 
logger.error('Sorry, times up') 
logger.critical('That sure is an ugly tie') 

Эти сообщения будут отображаться в моем системном журнале. Однако, когда я меняю address='/dev/log' на Debian 7 ... без кубиков.

Еще:

import syslog 

syslog.openlog(ident='im_a_lumberjack', facility=syslog.LOG_LOCAL1) 
syslog.syslog(syslog.WARNING, 'Watch out!') 

Работы по Debian 7, но не на Mac.

Мне очень хотелось бы получить одно решение для регистрации, которое работает на обеих платформах. Очевидно, что адрес будет другим, но я уже устанавливаю его в config.

Как я могу получить syslog, работающий как для Mac , так и Debian?

Edit:

Как дополнительной информации - я обнаружил, что мой SysLogHandler, кажется, может быть, не может быть с помощью объекта правильно (?). Сообщения являются быть подобраны системным журналом, но они собираются поймать-все, что заставляет меня поверить, что они не получают помечены LOG_LOCAL1

ответ

8

Оказываются facility, что SysLogHandler ожидает это неsyslog.LOG_LOCAL1 или любое из значений в этом пространстве имен.

Ожидается, что 'local1' или другая строка, как описано в документации.

Простое изменение

h = logging.handlers.SysLogHandler(address='/var/run/syslog', facility=syslog.LOG_LOCAL1) 

в

h = logging.handlers.SysLogHandler(address='/var/run/syslog', facility='local1') 

Сделано все прямо на обеих системах.

+1

Если бы это было дело, кажется, были исправлены в коде питона: определение функции encodePriority (самость, объект, приоритет): если isinstance (объект, basestring): объект = self.facility_names [объект] ' – Chris