我一直在尝试了解 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
为什么打印的日志信息先跳出代码流?还有谁能告诉我为什么日志消息会打印两次?
默认情况下,Python StreamHandler 将记录到 stderr,而您将语句打印到 stdout。这是两个不同的管道,不能保证它们之间的顺序。
通过将所有输出发送到同一管道来确保正确排序。例如,您可以将file=sys.stderr参数添加到打印语句中。