亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 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 關注
  • 194 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號