簡體   English   中英

Python 跨子類共享日志記錄

[英]Python share logging across subclasses

我試圖找到一種跨類/子類/模塊共享日志記錄的最佳實踐方法。 以下類可以在同一個文件中或分布在包/模塊中。

例如

-- A.py  
class A:
  def __init__(self):
    self.logger = logging.getLogger(someName)

-- B.py  
class B(A):
  ...

-- C.py  
class C(B):
  def foo(self):
    self.logger.info('Hello from C!')

現在在這種情況下,整個類層次結構共享相同的記錄器實例,由基類設置。

這是一個好習慣嗎? 或者我應該在每個 .py 文件的頂部設置一個全局變量,例如:

logger = logging.getLogger(__name__)

第一種方法似乎更面向 OO,並且避免在模塊導入時執行任何操作(僅在對象創建時),而第二種方法創建每個類看到的不同記錄器,其名稱反映了它所在的模塊。

第一種情況的另一個優點是我可以在單個實例上設置自定義日志記錄選項,它可以跨所有類工作,而在第二種情況下,它僅在每個記錄器名稱擴展父/基記錄器名稱時才有效,例如 logging .getLogger('ABC')。 然而,這些類不需要在同一個包或包層次結構中,所以這可能並不總是有意義的。

最好的方法是什么?

這是非常主觀的,但我之前采用的方法是在commonsutils模塊中配置logging設置,這些模塊可以由不同的文件導入。 每個文件都會實例化它們自己的logger 我認為始終執行logger = logging.getLogger(__name__)是一種很好的做法,因為它確實有助於調試。

例子:

-- commons.py
logging.setLevel('INFO')

-- A.py
from commons import logging

logger = logging.getLogger(__name__)

class A:
    def __init__(self):
        logger.info("init")

    def foo(self):
        logger.info("foo")

在這個例子中,好處是你有一個配置的中心位置,而不是分散在任何地方的日志記錄。 唯一的缺點是每次都實例化一個新的記錄器的樣板。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM