我尝试在使用两个logger对象之前和之后使用print函数,这两个对象将输出流式传输到控制台。 问题是我得到了一个非常混乱的输出,这是不符合预期的顺序。你知道吗
我试过把print()改成logger_对象信息()并且工作正常。你知道吗
包含意外输出的完整代码:
import logging
# Create logger objects and set level
loggerA = logging.getLogger()
loggerA.setLevel(logging.DEBUG)
loggerB = logging.getLogger()
loggerB.setLevel(logging.DEBUG)
# Set log output format
log_format = logging.Formatter('%(asctime)s - %(levelname)s - %(name)s - %(message)s', datefmt='%m/%d/%Y - %I:%M:%S %p')
# Create a console stream handler
stream_handler = logging.StreamHandler()
stream_handler.setFormatter(log_format)
# Add handlers to the loggers
loggerA.addHandler(stream_handler)
loggerB.addHandler(stream_handler)
def main():
for i in range(10):
print('Starting loop number {}'.format(i))
loggerA.info("loop number {}".format(i))
loggerB.info("loop number {}".format(i))
print('Finished loop number {}'.format(i))
if __name__ == '__main__':
main()
添加loggerC对象以将print()替换为日志信息():
...
loggerC = logging.getLogger()
loggerC.setLevel(logging.DEBUG)
...
def main():
for i in range(10):
loggerC('Starting loop number {}'.format(i))
loggerA.info("loop number {}".format(i))
loggerB.info("loop number {}".format(i))
loggerC('Finished loop number {}'.format(i))
...
使用print()意外输出的第一种情况是:
04/06/2019 - 10:10:34 AM - INFO - loggerA - loop number 1
Starting loop number 1
04/06/2019 - 10:10:34 AM - INFO - loggerB - loop number 1
04/06/2019 - 10:10:34 AM - INFO - loggerA - loop number 2
04/06/2019 - 10:10:34 AM - INFO - loggerB - loop number 2
Finished loop number 1
Starting loop number 2
Finished loop number 2
Starting loop number 3
Finished loop number 3
04/06/2019 - 10:10:34 AM - INFO - loggerA - loop number 3
04/06/2019 - 10:10:34 AM - INFO - loggerB - loop number 3
第二种情况是使用日志信息()而不是预期输出的print():
04/06/2019 - 10:12:21 AM - INFO - loggerC - Starting loop number 1
04/06/2019 - 10:12:21 AM - INFO - loggerA - loop number 1
04/06/2019 - 10:12:21 AM - INFO - loggerB - loop number 1
04/06/2019 - 10:12:21 AM - INFO - loggerC - Finished loop number 1
04/06/2019 - 10:12:21 AM - INFO - loggerC - Starting loop number 2
04/06/2019 - 10:12:21 AM - INFO - loggerA - loop number 2
04/06/2019 - 10:12:21 AM - INFO - loggerB - loop number 2
04/06/2019 - 10:12:21 AM - INFO - loggerC - Finished loop number 2
04/06/2019 - 10:12:21 AM - INFO - loggerC - Starting loop number 3
04/06/2019 - 10:12:21 AM - INFO - loggerA - loop number 3
04/06/2019 - 10:12:21 AM - INFO - loggerB - loop number 3
04/06/2019 - 10:12:21 AM - INFO - loggerC - Finished loop number 3
您的问题可能是standard streams的问题。默认情况下,
print
使用std::out
,logger.info
使用std::err
。两个流are bound to your terminal但是它们可能有不同的flush
刷新或触发器。你知道吗这就是为什么输出混合在一起,函数写入不同的流,它们以不同的方式刷新到终端,导致明显不一致的结果。你知道吗
将第一个代码更改为强制
logger.info
使用与print
相同的流来解决问题:现在,它返回正确的输出:
因为
print
和logger.info
以正确的顺序将相同的流刷新到终端,所以结果是正确的。你知道吗您还可以保留different streams并强制
std::out
流为flushed explicitly:第二个版本也会产生预期的结果。你知道吗
还要记住,根据定义,
logger
是thread-safe,但print
不是。如果要使用线程创建模块,请仅使用logger
跟踪执行。你知道吗相关问题 更多 >
编程相关推荐