13.12 ç»™å‡½æ•°åº“å¢žåŠ æ—¥å¿—åŠŸèƒ½Â¶
问题¶
ä½ æƒ³ç»™æŸ�ä¸ªå‡½æ•°åº“å¢žåŠ æ—¥å¿—åŠŸèƒ½ï¼Œä½†æ˜¯å�ˆä¸�能影å“�到那些ä¸�使用日志功能的程åº�。
解决方案¶
对于想è¦�执行日志æ“�ä½œçš„å‡½æ•°åº“è€Œå·²ï¼Œä½ åº”è¯¥åˆ›å»ºä¸€ä¸ªä¸“å±žçš„ logger 对象,并且åƒ�下é�¢è¿™æ ·åˆ�始化é…�置:
# somelib.py
import logging
log = logging.getLogger(__name__)
log.addHandler(logging.NullHandler())
# Example function (for testing)
def func():
log.critical('A Critical Error!')
log.debug('A debug message')
使用这个�置,默认情况下�会打�日志。例如:
>>> import somelib
>>> somelib.func()
>>>
�过,如果�置过日志系统,那么日志消�打�就开始生效,例如:
>>> import logging
>>> logging.basicConfig()
>>> somelib.func()
CRITICAL:somelib:A Critical Error!
>>>
讨论¶
通常æ�¥è®²ï¼Œä½ ä¸�应该在函数库代ç �ä¸è‡ªå·±é…�置日志系统,或者是已ç»�å�‡å®šæœ‰ä¸ªå·²ç»�å˜åœ¨çš„æ—¥å¿—é…�置了。
调用 getLogger(__name__) 创建一个和调用模���的logger模�。
由于模å�—éƒ½æ˜¯å”¯ä¸€çš„ï¼Œå› æ¤åˆ›å»ºçš„logger也将是唯一的。
log.addHandler(logging.NullHandler()) �作将一个空处�器绑定到刚刚已�创建好的logger对象上。
一个空处�器默认会忽略调用所有的日志消�。
å› æ¤ï¼Œå¦‚果使用该函数库的时候还没有é…�置日志,那么将ä¸�会有消æ�¯æˆ–è¦å‘Šå‡ºçŽ°ã€‚
还有一点就是对于å�„个函数库的日志é…�ç½®å�¯ä»¥æ˜¯ç›¸äº’独立的,ä¸�å½±å“�其他库的日志é…�置。 例如,对于如下的代ç �:
>>> import logging
>>> logging.basicConfig(level=logging.ERROR)
>>> import somelib
>>> somelib.func()
CRITICAL:somelib:A Critical Error!
>>> # Change the logging level for 'somelib' only
>>> logging.getLogger('somelib').level=logging.DEBUG
>>> somelib.func()
CRITICAL:somelib:A Critical Error!
DEBUG:somelib:A debug message
>>>
åœ¨è¿™é‡Œï¼Œæ ¹æ—¥å¿—è¢«é…�ç½®æˆ�仅仅输出ERROR或更高级别的消æ�¯ã€‚
�过 ,somelib 的日志级别被�独�置��以输出debug级别的消�,它的优先级比全局�置高。
åƒ�è¿™æ ·æ›´æ”¹å�•独模å�—的日志é…�置对于调试æ�¥è®²æ˜¯å¾ˆæ–¹ä¾¿çš„,
å› ä¸ºä½ æ— éœ€åŽ»æ›´æ”¹ä»»ä½•çš„å…¨å±€æ—¥å¿—é…�置——å�ªéœ€è¦�ä¿®æ”¹ä½ æƒ³è¦�更多输出的模å�—的日志ç‰çº§ã€‚
Logging HOWTO 详细介�了如何�置日志模�和其他有用技巧,�以�阅下。