为了账号安全,请及时绑定邮箱和手机立即绑定

在 Python 中跨多个模块的每个对象日志记录

在 Python 中跨多个模块的每个对象日志记录

慕码人8056858 2022-05-19 15:59:45
我有一个 Python 代码,它实现了一个用于处理独立数据集的类。对于每个数据集,我从类中实例化一个对象,该对象处理数据集。我想实现一个日志记录功能,在控制台和与每个数据集一起存储的日志文件中显示日志消息。我在模块级别实现了一个根记录器,并在创建每个对象时实现了一个带有 FileHandler 的特定记录器。它可以记录课堂内部发生的一些信息,但我也在使用另一个工具箱模块,那里发生的事情只记录在控制台中,而不是记录在日志文件中。为了说明这个问题,我实现了一个演示模块:├──log│  ├── __init__.py│  ├── my_object.py│  ├── toolbox.py内容__init__.py:import logginglogging.basicConfig(format='%(name)12s - %(levelname)5s - %(message)s')_log = logging.getLogger(__name__)_log.setLevel(logging.DEBUG)内容my_object.py:import loggingfrom . import toolboxclass MyObject():    def __init__(self, name):        self._name = name        # configure logging        logger = logging.getLogger(name)        logger.setLevel(logging.DEBUG)        if logger.hasHandlers():            for hdlr in logger.handlers:                logger.removeHandler(hdlr)        handler = logging.FileHandler('/home/user/Desktop/test/{}.log'.format(name), mode='w', encoding='utf-8')        formatter = logging.Formatter('%(name)12s - %(levelname)5s - %(message)s')        handler.setFormatter(formatter)        logger.addHandler(handler)        self._logger = logger    def do_something(self):        self._logger.info('{} is doing something'.format(self._name))        toolbox.use_tool(self._name)内容toolbox.py:import logging_log = logging.getLogger(__name__)def use_tool(name):    _log.info('Using some tool for {}'.format(name))然后,我运行这个:import logfrom log.my_object import MyObjectobj = MyObject('object1')obj.do_something()这是我在控制台中得到的:     object1 -  INFO - object1 is doing something log.toolbox -  INFO - Using some tool for object1这是我在/home/user/Desktop/test/object1.log文件中得到的:     object1 -  INFO - object1 is doing something如何让 log.toolbox 也显示在object1.log文件中?
查看完整描述

1 回答

?
千巷猫影

TA贡献1829条经验 获得超7个赞

罪魁祸首在于你如何调用getLogger函数。你有两次这样做:

  1. logger = logging.getLogger(name)里面my_object.py

  2. _log = logging.getLogger(__name__)里面toolbox.py

如果您比较这些调用返回的对象,它们是 2 个独立的对象(您可以通过 打印它们的地址print(id(obj)))。这就是为什么logger从不调用工具箱内的行 - 那里有一个不同的记录器(_log)!

要修复您的错误,只需为您的记录器提供相同的名称 - 例如“全局”:

  1. logger = logging.getLogger("global")

  2. _log = logging.getLogger("global")

该文件的输出现在如下:

global -  INFO - object1 is doing something

global -  INFO - Using some tool for object1

在您的具体示例中,您可以将代码调整toolbox.py为:


import logging



def use_tool(name):

    _log = logging.getLogger(name)

    _log.info('Using some tool for {}'.format(name))

并将记录器留在里面my_object.py(logger = logging.getLogger(name))。如果您随后在 中执行以下操作main.py:


obj = MyObject('object1')

obj2 = MyObject('object2')

obj.do_something()

obj2.do_something()

你最终会得到 2 个日志文件:


对象1.log


object1 -  INFO - object1 is doing something

object1 -  INFO - Using some tool for object1

对象2.log


object2 -  INFO - object2 is doing something

object2 -  INFO - Using some tool for object2


查看完整回答
反对 回复 2022-05-19
  • 1 回答
  • 0 关注
  • 162 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信