python - 我无法让 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 只会写入控制台。
解决方案
我已经稍微改写了你的脚本,这样这段代码就可以独立存在了。如果我改变了太多,请告诉我,我可以重新访问它。这两个文件是让它记录到文件的一个例子。注意我的评论:
## 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
为什么这行得通?因为模块级函数使用默认的根记录器,这不是您配置的。有关这方面的更多详细信息,请参阅这些文档。有一个类似的问题在这里更深入。
通过在开始记录之前获取配置的记录器,您可以记录到正确的配置。希望这可以帮助!
推荐阅读
- c# - 如何通过模型访问cshtml页面中的子列表
- javascript - 将文本框设置为 jquery datepicker
- html - 将一个 div 放在另一个 div 下方并防止重叠
- javascript - 如何在 React 中从可重用表单中传递道具
- python-3.x - 无法启动 lighttpd 服务守护进程
- spring - 如何在 BeanFactoryPostProcessor 中获取命令行参数?
- unit-testing - 如何在某些测试中隐藏日志但在其他测试中不隐藏?
- selenium - 如何处理硒中的铬通知?
- sql-server-2008 - 递归 CTE 以提取 BOM(物料清单)
- high-availability - 如何在 HA 模式下使用首选主机配置 Wildfly 11?