2016-09-15 44 views
1

我想要的: 要使用日志库而不是打印语句,无处不在。有些时候,不用终止一条新线是很好的。考虑这个简化的例子:Python日志记录,作为选项的终止符

for file in files: 
    print('Loading {}'.format(file), end='', flush=True) 
    try: 
     data = load(file) 
     print('\rLoaded {}'.format(file)) 
    except: 
     print('\rFailed loading {}'.format(file)) 

最显而易见的方法是使用:

handler = logging.StreamHandler() 
handler.terminator = "" 

不过,我不想一个处理程序添加到我的图书馆,和我想要的默认行为,我主记录器将以新行结束。以“”结尾的感觉应该是例外,而不是规则。
有没有一种方法,我可以这样做:

logger.info(msg, terminator="") 

,而无需创建大量的子类来记录模块?

我认为这个问题是否合理,还是有更好的方法来处理这个问题?

+0

有点相关: http://stackoverflow.com/questions/12699645/how-can-i-suppress-newline-in-python-logging-module 和 http://stackoverflow.com/questions/7168790/suppress-newline -in-python-logging-module – InvaderZim

回答

1

我也有类似的问题,这是我用它来得到我想要的结果,似乎是类似于你想达到什么目的:

import logging 


def getLogger(name, fmt="[%(asctime)s]%(name)s<%(levelname)s>%(message)s", 
       terminator='\n'): 
    logger = logging.getLogger(name) 
    cHandle = logging.StreamHandler() 
    cHandle.terminator = terminator 
    cHandle.setFormatter(logging.Formatter(fmt=fmt, datefmt="%H:%M:%S")) 
    logger.addHandler(cHandle) 
    return logger 


logger = getLogger(r'\n', terminator='\n') 
rlogger = getLogger(r'\r', terminator='\r') 

logger.setLevel(logging.DEBUG) 
rlogger.setLevel(logging.DEBUG) 


logger.info('test0') 
logger.info('test1') 
logger.info('-----------------------\n') 
rlogger.info('test2') 
rlogger.info('test3\n\n') 

for i in range(100000): 
    rlogger.info("%d/%d", i + 1, 100000) 
rlogger.info('\n') 

结果:

[14:48:00]\n<INFO>test0 
[14:48:00]\n<INFO>test1 
[14:48:00]\n<INFO>----------------------- 

[14:48:00]\r<INFO>test3 

[14:48:04]\r<INFO>100000/100000 
+0

感谢您的支持但我不想拥有两个不同的记录器,我想。另外,我正在编写一个包含多个模块和子模块的包。我更喜欢一个解决方案,我只需将常规日志记录模块导入到子模块,并让顶级日志记录器处理实际的日志记录。 – InvaderZim