2009-06-10 90 views
0

我有以下代码:为什么Logging会进入无限循环?

#!/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') 

此代码会导致蟒蛇无限递归循环中去,并输出实际上是令人难以置信的冷静:

[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

这是线性增长,而不是指数增长。 – nosklo 2009-06-10 18:17:01

回答

5

发生无限循环是因为您的记录器的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 
+0

如果我将其更改为: streamhandle = logging.StreamHandler(sys .__ stdout__)因此它现在指向orignal sys.stdout。这不解决问题,但为什么? – UberJumper 2009-06-10 13:29:55