首页 > 解决方案 > 我无法让 Python 日志记录模块从不同的模块写入日志文件

问题描述

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

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

主文件

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

进程.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 只会写入控制台。

标签: pythonloggingpython-3.7

解决方案


我已经稍微改写了你的脚本,这样这段代码就可以独立存在了。如果我改变了太多,请告诉我,我可以重新访问它。这两个文件是让它记录到文件的一个例子。注意我的评论:

##  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

为什么这行得通?因为模块级函数使用默认的根记录器,这不是您配置的。有关这方面的更多详细信息,请参阅这些文档有一个类似的问题在这里更深入。

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


推荐阅读