2013-11-27 2 views
2

Я знаю, как сделать twisted использования питоном каротажа (docs)Использования Python Logging с витым

Но нормальный питон протоколирования еще проглатывание. Печать-заявления видны, но logger.warn('...') нет.

Я использую эту регистрацию, установленный в моей библиотеке, которую я хочу использовать из крученой:

import logging 
logger=logging.getLogger(os.path.basename(sys.argv[0])) 

class Foo: 
    def foo(self): 
     logger.warn('...') 

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

Если у меня возникла проблема с Google, я нахожу решения, которые соединяют скрученные журналы с протоколом python.

Как я могу просмотреть запись в моей библиотеке (без ее изменения)?

ответ

0

Дело в том, что Twisted является асинхронным и позволяет избежать блокировки ввода/вывода везде, где это возможно. Тем не менее, запись stdlib не является асинхронной, и поэтому она блокирует ввод-вывод, и из-за этого они не могут легко смешиваться. Возможно, вы сможете достичь определенного уровня сотрудничества между ними, если вы, например, используйте QueueHandler (представленный в stdlib в Python 3.2 и упомянутый here, но доступный для более ранних версий через проект logutils). Вы можете использовать этот обработчик (и только этот обработчик) для обработки событий, отправленных с помощью stdlib-ведения журнала, а ваш соответствующий QueueListener может отправлять события, полученные с использованием вложенных (неблокирующих) операций ввода-вывода. Он должен работать, поскольку обработчик очереди не должен блокироваться, если он создан без конечной емкости, и полагая, что приемники ввода-вывода могут быстро избавиться от событий (в противном случае память заполнится).

+0

Я думаю, вы ответили на вопрос, который является противоположностью того, что - спросил плакат. Если события журнала поступают через 'logging', то не должно быть проблем с доставкой их в систему регистрации Twisted. Если ожидание (по модулю 'logging') заключается в том, что потребитель журнала собирается блокировать, а затем потребитель не блокирует, какой вред был сделан? –

+0

@ Jean-Paul Calderone: Возможно, ошибочно, у меня сложилось впечатление, что сторонний модуль, который использует запись stdlib, может быть задействован. Чтобы доставлять события из таких модулей в неблокирующие выходы Twisted из регистраторов stdlib, пользователь должен использовать неблокирующий обработчик, такой как «QueueHandler», и иметь соответствующий «QueueListener» разговор с неблокирующими приемниками ввода/вывода - IIUC. –

+0

Почему? Неблокирующий обработчик Twisted будет ... не ... заблокирован. Здесь нет проблемы для QueueHandler. QueueHandler был бы полезен, если бы были обработаны * блокирующие * обработчики журналов в Twisted, тогда QueueHandler был бы полезен для доставки событий к ним * без * блокировки. Но нет (насколько это можно понять из исходного вопроса). –

0

Utils/log.py

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import logging 
import logging.handlers 
from logging.config import dictConfig 

from twisted.python.failure import Failure 
from twisted.python import log as twisted_log 

logger = logging.getLogger(__name__) 

DEFAULT_LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': False, 
    'loggers': { 
     'twisted':{ 
      'level': 'ERROR', 
     } 
    } 
} 
def failure_to_exc_info(failure): 
    """Extract exc_info from Failure instances""" 
    if isinstance(failure, Failure): 
     return (failure.type, failure.value, failure.getTracebackObject()) 

def configure_logging(logfile_path): 
    """ 
    Initialize logging defaults for Project. 

    :param logfile_path: logfile used to the logfile 
    :type logfile_path: string 

    This function does: 

    - Assign INFO and DEBUG level to logger file handler and console handler 
    - Route warnings and twisted logging through Python standard logging 

    """ 
    observer = twisted_log.PythonLoggingObserver('twisted') 
    observer.start() 

    dictConfig(DEFAULT_LOGGING) 

    default_formatter = logging.Formatter(
     "[%(asctime)s] [%(levelname)s] [%(name)s] [%(funcName)s():%(lineno)s] [PID:%(process)d TID:%(thread)d] %(message)s", 
     "%d/%m/%Y %H:%M:%S") 

    file_handler = logging.handlers.RotatingFileHandler(logfile_path, maxBytes=10485760,backupCount=300, encoding='utf-8') 
    file_handler.setLevel(logging.INFO) 

    console_handler = logging.StreamHandler() 
    console_handler.setLevel(logging.DEBUG) 

    file_handler.setFormatter(default_formatter) 
    console_handler.setFormatter(default_formatter) 

    logging.root.setLevel(logging.DEBUG) 
    logging.root.addHandler(file_handler) 
    logging.root.addHandler(console_handler) 

hello.py

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import logging 

logger = logging.getLogger(__name__) 

from twisted.internet import reactor 
from twisted.web.server import Site 
from twisted.web.resource import Resource 


class BasicPage(Resource): 
    isLeaf = True 

    def render_GET(self, request): 
     logger.info("<html><body><h1>Basic Test</h1><p>This is a basic test page.</p></body></html>") 
     return "<html><body><h1>Basic Test</h1><p>This is a basic test page.</p></body></html>" 

def hello(): 
    logger.info("Basic web server started. Visit http://localhost:8000.") 
    root = BasicPage() 
    factory = Site(root) 
    reactor.listenTCP(8000, factory) 
    reactor.run() 
    exit() 

main.py

def main(): 
configure_logging('logfilepath') 
hello.hello()