Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:在其他输出之前将日志注释打印到控制台_Python_Logging - Fatal编程技术网

Python:在其他输出之前将日志注释打印到控制台

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

我一直在努力理解python中的登录。我有一个init模块,另外两个模块和一个主模块。出于某种原因,当我运行模块时,日志详细信息会跳转到代码流,并在其他输出之前首先打印出来

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

这是在
\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之后获得添加结果。但是我仍然不确定为什么日志会打印两次