我无法让Python日志记录模块从其他模块写入日志文件

时间:2019-08-01 19:16:20

标签: python logging python-3.7

我有一个包含几个模块的项目。有一个主模块(main.py)创建TK GUI并加载数据。它将这些数据传递给process.py,后者使用checks.py中的函数处理数据。我正在尝试为所有模块实现日志记录以记录到文件。在main.py中,日志消息被写入日志文件,而在其他模块中,它们仅被写入控制台。我认为这与在main.py中的代码设置记录器之前执行部分代码的import模块行有关,但是我无法解决如何避免这种情况。在Stackoverflow上,这似乎是一个相当普遍的问题,但我无法获得其他对我有用的答案。我相信我不会错过太多。简化的代码如下所示:

在模块中各种功能的内部和外部移动日志记录代码。我开始使用的代码是Corey Schaffer的Youtube频道中的代码。

Main.py

import logging
from process import process_data

def main():

    logger = logging.getLogger()
    logger.setLevel(logging.DEBUG)

    formatter = logging.Formatter('%(asctime)s:%(name)s:%(message)s')
    templogfile = tempfile.gettempdir() + '\\' + 'TST_HA_Debug.log'
    file_handler = logging.FileHandler(templogfile)
    file_handler.setLevel(logging.DEBUG)
    file_handler.setFormatter(formatter)

    stream_handler = logging.StreamHandler()
    stream_handler.setFormatter(formatter)

    logger.addHandler(file_handler)
    logger.addHandler(stream_handler)

    logger.debug('Logging has started') # This gets written to the file

    process_data(data_object) # call process_data in process.py

process.py

import logging

def process_data(data):

    logger = logging.getLogger(__name__)

    logger.debug('This message is logged by process') #This wont get written to the log file but get written to the console

   #do some stuff with data here and log some msgs

   return

Main.py将写入日志文件,process.py将仅写入控制台。

1 个答案:

答案 0 :(得分:1)

我已经稍微重写了您的脚本,以便此代码可以独立存在。如果我对此进行了太多更改,请告诉我,我可以重新进行检查。这两个文件是将其记录到文件的示例。注意我的评论:

##  main.py

import logging
from process import process_data
import os

def main():
    # Give this logger a name
    logger = logging.getLogger("Example")
    logger.setLevel(logging.DEBUG)

    formatter = logging.Formatter('%(asctime)s:%(name)s:%(message)s')
    # I changed this to the same directory, for convenience 
    templogfile = os.path.join(os.getcwd(), 'TST_HA_Debug.log')
    file_handler = logging.FileHandler(templogfile)
    file_handler.setLevel(logging.DEBUG)
    file_handler.setFormatter(formatter)

    stream_handler = logging.StreamHandler()
    stream_handler.setFormatter(formatter)

    logger.addHandler(file_handler)
    logger.addHandler(stream_handler)

    logging.getLogger("Example").debug('Logging has started') # This still gets written to the file

    process_data() # call process_data in process.py

if __name__ == '__main__':
    main()
##  process.py

import logging

def process_data(data=None):

    # make sure to grab the correct logger
    logger = logging.getLogger("Example")

    logger.debug('This message is logged by process') # This does get logged to file now

   #do some stuff with data here and log some msgs

    return

为什么这样做?由于模块级功能使用默认的根记录器,因此它不是您配置的。有关更多信息,请参见these docs。还有一个类似的问题更深入here

通过在开始记录之前获取已配置的记录器,便可以记录到正确的配置。希望这会有所帮助!