Python:在其他输出之前记录打印到控制台的注释

San*_*nju 5 python logging

我一直在尝试了解 python 中的日志记录。我有一个init模块、两个其他模块和一个主模块。出于某种原因,当我运行我的模块时,日志详细信息会跳转代码流并在其他输出之前首先打印

有人能告诉我为什么会这样吗

这是在 __init__.py

from dir1.mod1 import FirstClass
from dir1.mod2 import SecondClass

logger = logging.getLogger(__name__)

logger.setLevel(logging.DEBUG)
f_handler=logging.FileHandler('python_logs.log')
f_handler.setLevel(logging.DEBUG)
c_handler = logging.StreamHandler()
c_handler.setLevel(logging.ERROR)

f_formatter = logging.Formatter('%(name)s - %(levelname)s - %(message)s')
c_formatter = logging.Formatter('%(name)s - %(levelname)s - %(message)s')

f_handler.setFormatter(f_formatter)
c_handler.setFormatter(c_formatter)

logger.addHandler(f_handler)
logger.addHandler(c_handler)
Run Code Online (Sandbox Code Playgroud)

这是在其他两个模块中(写在__init__()resp 类中

self.logger = logging.getLogger(__name__)
Run Code Online (Sandbox Code Playgroud)

在模块之一中定义的 addn() 函数片段

def addn(self):
    z=self.x +self.y
    print('sum is '+z)
    self.logger.error('incrementing number!')
    self.logger.info('Still incrementing number!!')
    return z
Run Code Online (Sandbox Code Playgroud)

我的主要模块(我运行的)有这个:

from dir1.mod1 import FirstClass
from dir1.mod2 import SecondClass

number = FirstClass(2,2)
print('addition results')
number.addn()
Run Code Online (Sandbox Code Playgroud)

我期待输出如下

加法结果

总和是 3

dir1.mod1 - 错误 - 增加数字!

但我得到的是

dir1.mod1 - 错误 - 增加数字!

dir1.mod1 - 错误 - 增加数字!

加法结果:

总和是 3

为什么打印的日志信息先跳出代码流?还有谁能告诉我为什么日志消息会打印两次?

Tho*_*est 5

默认情况下,Python StreamHandler 将记录到 stderr,而您将语句打印到 stdout。这是两个不同的管道,不能保证它们之间的顺序。

通过将所有输出发送到同一管道来确保正确排序。例如,您可以将file=sys.stderr参数添加到打印语句中。