проблемы с python logging.getLogger(__name__)

Я пытаюсь получить журналы из библиотеки, которую использую (PyAPN). Это, конечно, не работает из коробки. Я просмотрел код библиотеки, чтобы увидеть, что они используют для регистратора, и они используют метод logging.getLogger().

Существующий код ведения журнала библиотеки PyAPN:

_logger=logging.getLogger(__name__)

Вот одна плохая идея, которую я пытался заставить работать, но мне не повезло:

Код моего приложения (пример плохой идеи):

from apns import APNs

class Notifier():

def __init__(self, logger):

    self.logger = logger
    self.apns_client = APNs(arg_list)
    self.apns_client._logger = self.logger

def send_message:

    ...        
    self.apns_client.gateway_server.send_notification(token, payload, identfier=id)        
    ...

это не сработало

Библиотека (send_message) вызывается из задачи celery. Все ведение журнала отлично работает в классе Notifier и задаче celery, просто ничего не поступает в мой регистратор из библиотеки PyAPNs.

Может ли кто-нибудь помочь мне понять, что здесь может происходить?


person TheJeff    schedule 08.12.2014    source источник
comment
Идея плохая, не стоит связываться с приватными членами. Вы можете либо поймать все с помощью корневого регистратора, либо, возможно, получить их регистратор с getLogger(their_module.__name__) и настроить его соответствующим образом. Я предполагаю, что их регистратор не работает в отдельном процессе, а это совсем другая история.   -  person jwalker    schedule 09.12.2014
comment
Любые рекомендации по настройке их регистратора для ведения журнала через мой регистратор классов? Настройка регистратора довольно обширна и находится в другой области кода приложения.   -  person TheJeff    schedule 10.12.2014
comment
Создайте обработчик ведения журнала, который перенаправляет сообщения в ваш регистратор и прикрепите его к их.   -  person jwalker    schedule 11.12.2014


Ответы (1)


если вы хотите настроить обработчики журналов для библиотечного регистратора, просто настройте в

1) регистраторы верхнего уровня (например, корневой регистратор). Как ссылка из журнал-поваренная книга

rootLogger = logging.getLogger('')
rootLogger.setLevel(logging.DEBUG)
socketHandler = logging.handlers.SocketHandler('localhost',
                    logging.handlers.DEFAULT_TCP_LOGGING_PORT)
# don't bother with a formatter, since a socket handler sends the event as
# an unformatted pickle
rootLogger.addHandler(socketHandler)

# Now, we can log to the root logger, or any other logger. First the root...
logging.info('Jackdaws love my big sphinx of quartz.')

# Now, define a couple of other loggers which might represent areas in your
# application:

logger1 = logging.getLogger('myapp.area1')
logger2 = logging.getLogger('myapp.area2')

2) Или захватить логгер библиотеки и настроить его явно

apns_logger = logging.getLogger(apns.__name__)
apns_logger.addHandler(xxx)

3) или используйте фильтр, чтобы отфильтровать регистратор стороннего модуля -logging">Как я могу получить доступ к текущему исполняемому модулю или имени класса в Python?

person Jim Horng    schedule 13.12.2014