Почему регистрация идет в бесконечном цикле? - PullRequest
1 голос
/ 10 июня 2009

У меня есть следующий код:

#!/usr/bin/env python
import logging
import sys
import copy

class Wrapper:
    def write(self, s):
        #sys.__stdout__.write(s)
        loggy = logging.getLogger('foobar')
        loggy.info(s)

def blah():
    logger = logging.getLogger('foobar')
    logger.setLevel(logging.DEBUG)
    streamhandle = logging.StreamHandler(sys.stdout)
    streamhandle.setFormatter(logging.Formatter('[%(message)s]'))
    logger.addHandler(streamhandle)

    sys.stdout = Wrapper()
    sys.stderr = Wrapper()

if __name__ == '__main__':

    blah()
    logger = logging.getLogger('')
    #print logger.handlers
    #for handler in logger.handlers:
    #    print handler

    fooy = logging.getLogger('foobar')
    #print fooy.handlers

    sys.stdout.write('i love you')

    logging.log(logging.DEBUG, 'i love you')

Этот код заставляет python работать в бесконечном рекурсивном цикле, и результат на самом деле невероятно крут:

[Error in sys.exitfunc:
]
[INFO:foobar:Error in sys.exitfunc:

]
[INFO:foobar:INFO:foobar:Error in sys.exitfunc:


]
[INFO:foobar:INFO:foobar:INFO:foobar:Error in sys.exitfunc:



]
[INFO:foobar:INFO:foobar:INFO:foobar:INFO:foobar:Error in sys.exitfunc:




]
[INFO:foobar:INFO:foobar:INFO:foobar:INFO:foobar:INFO:foobar:Error in sys.exitfunc:

Это продолжает расти в геометрической прогрессии :) Это мило, но почему это происходит?

1 Ответ

6 голосов
/ 10 июня 2009

Бесконечный цикл происходит, потому что StreamHandler вашего регистратора настроен на запись его сообщений журнала в sys.stdout, но sys.stdout в свою очередь упакован и записывает обратно в тот самый регистратор, который только что отправил ему сообщение записи.

В зависимости от ваших целей, вы, вероятно, лучше, если бы Wrapper действительно выполнял вывод, а не использовал внутреннее ведение журнала. Что-то вроде:

class Wrapper(object):
    def write(self, s):
        sys.__stdout__.write(s) # sys.__stdout__ points to the original stdout, rather
                                # than the redirected sys.stdout
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...