小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

多module使用Logging(只要在同一個(gè)Python interpreter process)

 小豬窩969 2015-05-09

  上面我曾提到過(guò),所有的對(duì)logging.getLogger(‘someLogger’)的調(diào)用都會(huì)返回同一個(gè)對(duì)象.這個(gè)規(guī)則不僅僅在同一個(gè)module有效,而且對(duì)在同一個(gè)Python的解釋器進(jìn)程里面的多個(gè)module也有效.而且,應(yīng)用代碼可以在一個(gè)module里面定義一個(gè)父logger,而在另一個(gè)module里面繼承這個(gè)logger,所有對(duì)這個(gè)子logger的調(diào)用都會(huì)轉(zhuǎn)到父logger里面去,如下所示:

下面這個(gè)是主模塊的代碼,

  1. import logging  
  2. import auxiliary_module  
  3. # create logger with "spam_application"  
  4. logger = logging.getLogger("spam_application")  
  5. logger.setLevel(logging.DEBUG)  
  6. # create file handler which logs even debug messages  
  7. fh = logging.FileHandler("spam.log")  
  8. fh.setLevel(logging.DEBUG)  
  9. # create console handler with a higher log level  
  10. ch = logging.StreamHandler()  
  11. ch.setLevel(logging.ERROR)  
  12. # create formatter and add it to the handlers  
  13. formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")  
  14. fh.setFormatter(formatter)  
  15. ch.setFormatter(formatter)  
  16. # add the handlers to the logger  
  17. logger.addHandler(fh)  
  18. logger.addHandler(ch)  
  19. logger.info("creating an instance of auxiliary_module.Auxiliary")  
  20. a = auxiliary_module.Auxiliary()  
  21. logger.info("created an instance of auxiliary_module.Auxiliary")  
  22. logger.info("calling auxiliary_module.Auxiliary.do_something")  
  23. a.do_something()  
  24. logger.info("finished auxiliary_module.Auxiliary.do_something")  
  25. logger.info("calling auxiliary_module.some_function()")  
  26. auxiliary_module.some_function()  
  27. logger.info("done with auxiliary_module.some_function()")  

這個(gè)是子模塊的代碼,

  1. import logging  
  2. # create logger  
  3. module_logger = logging.getLogger("spam_application.auxiliary")  
  4. class Auxiliary:  
  5.     def __init__(self):  
  6.         self.logger = logging.getLogger("spam_application.auxiliary.Auxiliary")  
  7.         self.logger.info("creating an instance of Auxiliary")  
  8.     def do_something(self):  
  9.         self.logger.info("doing something")  
  10.         a = 1 + 1  
  11.         self.logger.info("done doing something")  
  12. def some_function():  
  13.     module_logger.info("received a call to /"some_function/"")  

可以看到, 我們?cè)谥髂K里面定義了一個(gè)logger 'spam_application', 并對(duì)他進(jìn)行了配置.

那么在這個(gè)解釋器進(jìn)程里面的任何地方去通過(guò)getLogger('spam_application')得到的對(duì)象都是一樣的, 不需要從新定義配置, 可以直接使用.

更方便的是, 你定義任意該logger的子logger, 都可以共享父logger的定義和配置

所謂的父子logger只是簡(jiǎn)單的通過(guò)命名來(lái)識(shí)別, 任意以'spam_application.'開(kāi)頭的logger都是他的子logger, 例如'spam_application.auxiliary'

這個(gè)在實(shí)際的開(kāi)發(fā)中, 還是很方便的, 對(duì)于一個(gè)application,

首先通過(guò)logging配置文件編寫(xiě)好這個(gè)application所對(duì)應(yīng)的log策略, 可以只生成一個(gè)根logger, 比如叫'Project'

然后在Main函數(shù)里面, 通過(guò)fileConfig加載logging的配置

接著在appliction的任意地方, 不同的模塊中, 可以使用Project的子logger, 如Project.UI, Project.Core, 來(lái)進(jìn)行l(wèi)og, 并且不需要反復(fù)的定義和配置各個(gè)logger.

 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多