Python:在其他输出之前将日志注释打印到控制台
我一直在努力理解python中的登录。我有一个init模块,另外两个模块和一个主模块。出于某种原因,当我运行模块时,日志详细信息会跳转到代码流,并在其他输出之前首先打印出来 有人能告诉我为什么会这样吗 这是在Python:在其他输出之前将日志注释打印到控制台,python,logging,Python,Logging,我一直在努力理解python中的登录。我有一个init模块,另外两个模块和一个主模块。出于某种原因,当我运行模块时,日志详细信息会跳转到代码流,并在其他输出之前首先打印出来 有人能告诉我为什么会这样吗 这是在\uuuu init\uuuuu.py from dir1.mod1 import FirstClass from dir1.mod2 import SecondClass logger = logging.getLogger(__name__) logger.setLevel(logg
\uuuu init\uuuuu.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)
这在resp类的其他两个模块中(写在resp类的\uuuu init\uuuu()
中)
self.logger = logging.getLogger(__name__)
在一个模块中定义的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
我运行的主要模块有:
from dir1.mod1 import FirstClass
from dir1.mod2 import SecondClass
number = FirstClass(2,2)
print('addition results')
number.addn()
我预期的输出如下所示
加法结果
总数是3
dir1.mod1
-错误-递增数字
但我得到的是
dir1.mod1
-错误-递增数字
dir1.mod1
-错误-递增数字
添加结果:
总数是3
为什么日志消息会首先从代码流中跳出?还有人能告诉我为什么日志消息会被打印两次吗?U可以尝试禁用记录器的“传播”属性 传播:如果此属性的计算结果为true,则记录到此记录器的事件将传递给更高级别(祖先)的处理程序除了附加到此记录器的任何处理程序之外,日志记录器。消息直接传递给祖先日志记录器的处理程序-不考虑相关祖先日志记录器的级别或筛选器 这是使用不同调试级别的文件和标准输出的init logger示例:
def init_logger_singleton():
global logger
logger = logging.getLogger(name='loggerName')
logger.propagate = False
logger.setLevel(10)
formatter = logging.Formatter(
'\t%(message)s'
)
filehandler = logging.StreamHandler()
filehandler.setLevel(40)
filehandler.setFormatter(formatter)
logger.addHandler(filehandler)
我使用number来定义日志级别,但是10=DEBUG和40=ERRO。在打印语句到stdout时,Python StreamHandler中的更多信息将默认记录到stderr。这是两个不同的管道,不能保证它们之间的顺序
为了确保正确的排序,首先将所有输出发送到同一管道。例如,您可以将
file=sys.stderr
参数添加到打印语句中。U还可以将参数sys.stdout
添加到流处理程序中,这样打印
和记录器事件都将传递到一个通道
stream_handler = logging.StreamHandler(sys.stdout)
在
addn
函数中,您混合了print
和logging。如果将print
替换为self.logger.info
,会发生什么?我怀疑print和logger的刷新不会按照您想象的顺序进行。在这种情况下,理想情况下应该首先打印“addition results”,因为它在addn之前执行Action被称为right?…但我仍然在日志消息hanks之后获得添加结果。但是我仍然不确定为什么日志会打印两次