日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

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

 小豬窩969 2015-05-09

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

下面這個是主模塊的代碼,

  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()")  

這個是子模塊的代碼,

  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/"")  

可以看到, 我們在主模塊里面定義了一個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.

 

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多