上面我曾提到過,所有的對logging.getLogger(‘someLogger’)的調(diào)用都會返回同一個對象.這個規(guī)則不僅僅在同一個module有效,而且對在同一個Python的解釋器進(jìn)程里面的多個module也有效.而且,應(yīng)用代碼可以在一個module里面定義一個父logger,而在另一個module里面繼承這個logger,所有對這個子logger的調(diào)用都會轉(zhuǎn)到父logger里面去,如下所示:
下面這個是主模塊的代碼,
- import logging
- import auxiliary_module
- # create logger with "spam_application"
- logger = logging.getLogger("spam_application")
- logger.setLevel(logging.DEBUG)
- # create file handler which logs even debug messages
- fh = logging.FileHandler("spam.log")
- fh.setLevel(logging.DEBUG)
- # create console handler with a higher log level
- ch = logging.StreamHandler()
- ch.setLevel(logging.ERROR)
- # create formatter and add it to the handlers
- formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
- fh.setFormatter(formatter)
- ch.setFormatter(formatter)
- # add the handlers to the logger
- logger.addHandler(fh)
- logger.addHandler(ch)
- logger.info("creating an instance of auxiliary_module.Auxiliary")
- a = auxiliary_module.Auxiliary()
- logger.info("created an instance of auxiliary_module.Auxiliary")
- logger.info("calling auxiliary_module.Auxiliary.do_something")
- a.do_something()
- logger.info("finished auxiliary_module.Auxiliary.do_something")
- logger.info("calling auxiliary_module.some_function()")
- auxiliary_module.some_function()
- logger.info("done with auxiliary_module.some_function()")
這個是子模塊的代碼,
- import logging
- # create logger
- module_logger = logging.getLogger("spam_application.auxiliary")
- class Auxiliary:
- def __init__(self):
- self.logger = logging.getLogger("spam_application.auxiliary.Auxiliary")
- self.logger.info("creating an instance of Auxiliary")
- def do_something(self):
- self.logger.info("doing something")
- a = 1 + 1
- self.logger.info("done doing something")
- def some_function():
- module_logger.info("received a call to /"some_function/"")
可以看到, 我們在主模塊里面定義了一個logger 'spam_application', 并對他進(jìn)行了配置.
那么在這個解釋器進(jìn)程里面的任何地方去通過getLogger('spam_application')得到的對象都是一樣的, 不需要從新定義配置, 可以直接使用.
更方便的是, 你定義任意該logger的子logger, 都可以共享父logger的定義和配置
所謂的父子logger只是簡單的通過命名來識別, 任意以'spam_application.'開頭的logger都是他的子logger, 例如'spam_application.auxiliary'
這個在實際的開發(fā)中, 還是很方便的, 對于一個application,
首先通過logging配置文件編寫好這個application所對應(yīng)的log策略, 可以只生成一個根logger, 比如叫'Project'
然后在Main函數(shù)里面, 通過fileConfig加載logging的配置
接著在appliction的任意地方, 不同的模塊中, 可以使用Project的子logger, 如Project.UI, Project.Core, 來進(jìn)行l(wèi)og, 并且不需要反復(fù)的定義和配置各個logger.
|