×òÌ죬Lord LeatherfaceÎÊÎÒΪʲôʹÓÃÁËsudsºó£¬Êä³öÈÕÖ¾±ä³ÉÁËÁ½Ìõ¡£ÓÚÊÇÎÒ×ÐϸµØÑо¿ÁËloggingµÄÈÕÖ¾´¦Àí»úÖÆ£¬²¢ÇÒÔٴο¼ÂÇÁËuliwebµÄÈÕÖ¾´¦Àí£¬×îÖÕ¶ÔuliwebµÄÈÕÖ¾½øÐÐÁËÖØ¹¹£¬²¢ÇÒŪÇå³þÁËΪʲô»áÓÐÁ½ÌõÈÕÖ¾µÄÏÖÏó£¬Òò´ËÒÔ±¾ÎÄ×÷Ò»¸ö¼Ç¼¡£
¶ÔÓÚloggingÎÒÏë´ó¼ÒÓõÃÓ¦¸Ã²»ÉÙ£¬ÄÇôÎÒÏÈÌἸ¸öÎÊÌ⣺
1. loggingÖ±½ÓÊä³öÈÕÖ¾£¬Èçlogging.info()Óëlog = logging.getLogger('name') log.info()ÓÐʲô²»Í¬£¿
2. ¡°No handlers could be found for logger¡±ÊÇÔõô»ØÊ£¿
3. root loggerÓÐʲôÓã¬ÈçºÎ»ñµÃ£¿
4. ÐÎÈç"a.b.c"µÄloggerÃûÓÐʲôÓã¿
5. Èç¹ûÒ»¸öloggerÖ´Ðжà´ÎaddHandler£¬ÄÇôÿ¸öhandler¶¼»á±»Ö´ÐÐÂð£¿
6. loggerµÄ´«²¥(propagate)ÊÇÔõô»ØÊ£¿ÈçºÎ×èÖ¹Ëü£¿
ÓÐʱºò´ø×ÅÎÊÌâѧϰ¿ÉÄÜ»á¸ü¿ì¡£ÄÇôÏÂÃæ¸ù¾ÝÎÒµÄÀí½âÒ»µãµã½øÐнâÊÍ¡£
loggingÖÐlogÊÇ¿ÉÒÔ·Ö¼¶µÄ£¬ËüµÄ¼¶±ðÓëÄãʹÓÃgetLogger()ÖеÄÃû×ÖÓйØÏµ¡£±ÈÈ磬Äã¿ÉÒÔʹÓÃ"uliweb"»ò"uliweb.app"£¬ËüÃǵÄÇø±ð¾ÍÊÇ"uliweb.app"ÖÐÓÐÒ»¸ö'.'¡£ÄÇôlogging»á×Ô¶¯Éú³É"uliweb"ºÍ"uliweb.app"µÄlogger£¬²¢ÇÒ"uliweb"½«ÊÇ"uliweb.app"µÄloggerµÄ¸¸¶ÔÏó¡£ÕâÒ»µã¿ÉÒÔÕâÑùÑéÖ¤£º
>>> import logging
>>> log = logging.getLogger('uliweb.app')
>>> log.manager.loggerDict.items()
[('uliweb.app', <logging.Logger instance at 0x017CE238>), ('uliweb', <logging.PlaceHolder instance at 0x017CE2D8>)]
ÕâÀïÓÐÒ»¸öͦÓÐÒâ˼µÄ£¬¾ÍÊÇ'uliweb'Õâ¸öloggerËüµÄ¶ÔÏóÊÇPlaceHolder£¬Ï൱ÓÚÊÇÒ»¸ö¡°Ðé"ÈÕÖ¾¶ÔÏó¡£logging¿ÉÒÔÔÊÐíͨ¹ýgetLogger()À´×Ô¶¯Éú³É¶ÔÓ¦µÄlogger¶ÔÏó¡£¶ÔÓÚ·Ö¼¶µÄÈÕÖ¾Ãû×Ö£¬Ëü»áÒ»¼¶¼¶µØ´´½¨£¬Èç¹û¸¸¶ÔÏó»¹²»´æÔÚ£¬Ôò»á×Ô¶¯´´½¨Ò»¸öռλ¶ÔÏó¡£Èç¹û£¬ºóÃæÓû§ÓÖͨ¹ýgetLogger()À´´´½¨Ò»¸ö¸¸¶ÔÏó£¬Ôòlogging»á×Ô¶¯¶Ô¸¸×Ó¹ØÏµ½øÐÐÖØÐÂÐÞ¶©£¬±£Ö¤¶ÔÏó¹ØÏµµÄÕýÈ·ÐÔ¡£
ÔÙ¿´Ò»¿´¸¸×Ó¹ØÏµ£º
>>> log.parent
<logging.RootLogger instance at 0x017E3AD0>
>>> log1 = logging.getLogger('uliweb')
>>> log.parent
<logging.Logger instance at 0x01820DA0>
>>> log.parent.name
'uliweb'
ͦÓÐÒâ˼¡£µ±ÎÒÃÇÖ±½Óͨ¹ýgetLogger('uliweb.app')»ñµÃÈÕÖ¾¶ÔÏóʱ£¬ËüµÄparent²¢²»ÊÇռλ¶ÔÏó'uliweb'£¬¶øÊÇRootLogger¡£Õâ¸öRootLoggerÊÇÔÚµ¼Èëloggingʱ×Ô¶¯ÓÉÄ£¿é´´½¨µÄ£¬ËüµÄ´´½¨´úÂëÊÇ£º
root = RootLogger(WARNING)
Logger.root = root
Logger.manager = Manager(Logger.root)
LoggerÊÇÕæÕýµÄloggerµÄÀà¡£¿ÉÒÔ¿´ËüÔÚÔËÐÐʱ»á¸øËü¸³ÓèrootºÍmanager¶ÔÏó¡£¶ømanager¾ÍÊÇÓÃÀ´´´½¨logger²¢½øÐйÜÀíµÄÀà¡£Ç°ÃæµÄ´úÂë¾ÍÊÇͨ¹ý²é¿´manager.loggerDictÀ´²é¿´ËùÓÐÒѾ¶¨ÒåµÄlogger¡£
Òò´Ë´ÓÉÏÃæµÄ´úÂëÎÒÃÇ¿ÉÒÔÀí½â£¬ÔÚÖ±½Ó´´½¨Ò»¸ö¶à¼¶µÄloggerʱ£¬Èç¹û¸¸¶ÔÏó²»´æÔÚ£¬Ôò¸¸¶ÔÏó×ÔÈ»ÊÇroot¶ÔÏó¡£Èç¹û¸¸¶ÔÏó±»´´½¨£¬Ôò¸¸×Ó¹ØÏµ±»ÐÞÕý¡£
root¶ÔÏóÓÐʲôÓÃÄØ£¿Ëü¾ÍÊÇȱʡµÄÈÕÖ¾¶ÔÏó¡£Ê¹ÓÃloggingµÄ×î¼òµ¥µÄ·½·¨ÊÇ£º
import logging
logging.info()
¿ÉÒÔÖ±½ÓÊä³ö¡£ÕâÀïÓÐÊ²Ã´ÃØÃÜ£¿¿´Ò»¿´´úÂëÒ»ÇоͶ¼Çå³þÁË¡£
def info(msg, *args, **kwargs):
"""
Log a message with severity 'INFO' on the root logger.
"""
if len(root.handlers) == 0:
basicConfig()
root.info(*((msg,)+args), **kwargs)
ÕâÀïÏȶÔrootµÄhandlers½øÐÐÅжϡ£ÄÇôhandlersÊÇʲô¶«Î÷£¿Ëü¾ÍÊÇÓÃÀ´´¦ÀíÿÌõÈÕÖ¾µÄ´¦ÀíÀàµÄʵÀý¡£Ã¿¸ölogger¿ÉÒÔÓв»Ö¹Ò»¸öhandlerʵÀý¡£²¢ÇÒÿ¸öhandler¶ÔÏó¿ÉÒÔÓÐ×ÔÒѵÄÈÕÖ¾Êä³ö¼¶±ð£¬¿ÉÒÔºÍloggerµÄ²»Í¬¡£handlerµÄ´¦ÀíÎÒÃǺóÃæÔÙ˵¡£ÉÏÃæµÄ´úÂëÒâ˼¾ÍÊÇ£¬Èç¹ûroot»¹Ã»Óж¨Òå´¦Àí¶ÔÏó£¬ÔòÖ´ÐÐbasicConfig()½øÐÐȱʡÅäÖá£È»ºóʹÓÃroot.info()½øÐÐÊä³ö¡£ËùÒÔÎÒÃÇ¿ÉÒÔÀí½â£ºlogging.info()Æäʵ¾ÍÊÇʹÓÃrootÀ´½øÐÐÊä³öµÄ£¬Äã¿ÉÒÔÀí½âËüÊÇÒ»¸öÈ«¾ÖÐԵģ¬È±Ê¡µÄÈÕÖ¾¶ÔÏó¡£²¢ÇÒ¿ÉÒÔ×Ô¶¯½øÐÐÅäÖá£
ÄÇô£¬ÎªÊ²Ã´ÒªÅäÖã¿ÒòΪRootLogger(WARNING)Ö»ÊÇ´´½¨ÁËloggerÀ࣬µ«ÊÇ»¹Ã»ÓÐÌí¼ÓÈκεÄhandler£¬Òò´ËhandlersÊǿյġ£Ò²¾ÍÊÇ˵£¬´´½¨ÁËÒ»¸ölogger£¬²¢²»±íʾËü¾Í¿ÉÒÔÊä³öÈÕÖ¾¡£ÊDz»ÊÇÓÐÐ©Ææ¹Ö£¿»¹ÊÇÒÔ´úÂëΪÉÏ£º
def callHandlers(self, record):
c = self
found = 0
while c:
for hdlr in c.handlers:
found = found + 1
if record.levelno >= hdlr.level:
hdlr.handle(record)
if not c.propagate:
c = None #break out
else:
c = c.parent
if (found == 0) and raiseExceptions and not self.manager.emittedNoHandlerWarning:
sys.stderr.write("No handlers could be found for logger"
" \"%s\"\n" % self.name)
self.manager.emittedNoHandlerWarning = 1
ÉÏÃæµÄ´úÂëÊÇLoggerÀàÖÐÓÃÀ´Êä³öÈÕÖ¾µÄÒ»¸ö·½·¨£¬ËùÓеÄÃØÃܶ¼ÔÚÕâÀïÃæÁË¡£ÕâÀï²»Ò»ÌõÌõ½â¾öÁË£¬ËµÒ»ÏÂÎÒµÄÀí½â°É¡£ËüÊ×ÏÈÉèÖÃÁËÒ»¸öfoundµÄ±êÖ¾£¬ËüµÄ×÷ÓþÍÊÇÈç¹ûÕÒµ½ÁËÒ»¸ö¿ÉÓõÄhandler£¬Ôò¼Ó1£¬È»ºóµÈ×îºóÅжÏһϣ¬Èç¹ûfoundΪ0£¬Ôò±íʾÄ㻹ûÓжÔlogger½øÐÐÅäÖã¬ÔÚ×îºó»áÊä³ö¡°No handlers could be found for logger¡±µÄÐÅÏ¢¡£»¹¼ÇµÃrootµÄÊÂÇéÂ𣿴´½¨ÁËÒ»¸ölogger²¢²»±íʾËü¾Í´øÓÐhandlerÁË£¬Ò²¾ÍÊÇÎÞ·¨½øÐд¦Àí¡£Òò´Ëlogging.info()´úÂëÖУ¬»áµ±rootûÓÐÅäÖÃhandlerʱ£¬Ê¹ÓÃbasicConfig()À´½øÐÐÅäÖá£ÄÇôÔÚbasicConfig()µÄ´úÂëÖУ¬Äã»á¿´µ½Ëü»á¸ù¾Ý´«ÈëµÄ²ÎÊý×Ô¶¯Éú³ÉÏàÓ¦µÄHandlerʵÀý£¬Ìí¼Óµ½rootÖÐÈ¥¡£ËùÒÔlogging.info()²»»á±¨´í£¬ÊÇÒòΪËü×Ô¶¯ÅäÖÃÁË¡£¶øÄã×ÔÒÑͨ¹ýgetLogger()µÃµ½µÄij¸öÈÕÖ¾¶ÔÏ󣬿ÉûÓÐ×Ô¶¯»¯µÄÅäÖ÷½Ê½£¬ËùÒÔÓпÉÄܻᱨ´í¡£Òò´ËÏÖÔÚÎÒÃÇ¿ÉÒÔ¾ÍÓÐÒ»¸öÓ¡Ïó£¬ÈÕ־ʹÓÃǰҪÅäÖã¬Ö÷ÒªÊÇÌí¼ÓÏàÓ¦µÄhandler¡£ÄÇôÕâ¶Î´úÂ뻹ÓÐÊ²Ã´ÌØÊâµÄ£¿Ò»¸ö¾ÍÊÇc.propagate(propagateµÄÖÐÎÄÒâ˼ÊÇ´«²¥)£¬ËüÊÇLoggerµÄÒ»¸öÊôÐÔ£¬È±Ê¡Îª1¡£´ÓÉÏÃæµÄ´úÂë¿ÉÒÔ¿´³ö£¬Èç¹ûpropagateΪ0»ò¼ÙÖµ£¬ÔòÑ»·¾ÍÍ˳öÁË¡£Èç¹ûΪ1£¬ÔòÑ»·»á¼ÌÐø´Ó¸¸¶ÔÏó¿ªÊ¼£¬Ö±µ½ÕÒ²»µ½»òpropagateΪ¼Ù¡£Òò´Ëlogging»áÀûÓÃpropagateºÍ¸¸¶ÔÏó½øÐеݹ鴦Àí»ò´«²¥´¦Àí¡£Òò´Ë¾ÍÑù¾ÍʵÏÖÕâÑùÒ»ÖÖЧ¹û£ºÔÚ´«²¥Çé¿öÏ£¬´Ó×Ó½áµãµ½¸¸½áµãµÄhandler¶¼»á±»´¦ÀíÒ»·¬¡£µ±È»£¬»¹ÓÐÒ»¸ö¼ì²éµã¾ÍÊÇÐÅÏ¢Êä³öµÄÈÕÖ¾¼¶±ðÒª´óÓÚµÈÓÚhandlerµÄÈÕÖ¾¼¶±ð¡£Òò´Ë£¬Èç¹û¸¸½áµãºÍ×Ó½áµã¶¼¶¨ÒåÁËhandler£¬²¢ÇÒÈÕÖ¾¼¶±ð¶¼·ûºÏÒªÇó£¬ÕâÑùµÄÈ·»áÊä³öÁ½ÌõÈÕÖ¾£¬µ«ÊÇÓɲ»Í¬µÄhandlerÊä³öµÄ¡£ËùÒÔ£¬Èç¹û×Ó¶ÔÏó¶¨ÒåÁË×ÔÒѵÄhandler£¬ÎªÁ˱ÜÃâ´«²¥£¬Òò´ËÓ¦¸ÃÉèÖÃËüµÄpropagate=0¡£µ«ÊÇ£¬ÀûÓô«²¥£¬ÎÒÃÇÒ²¿ÉÒÔʵÏÖ£¬×ÓÈÕÖ¾¶ÔÏó²»¶¨Òå×ÔÒѵÄhandler£¬Òò´Ë×îÖÕÊÇʹÓø¸¶ÔÏóµÄhandler¡£ÌرðÊǶÔÓÚ¸¸¶ÔÏóÊÇroot¶ÔÏóµÄÇé¿ö£¬Ö»ÒªÖ´ÐÐÁËbasicConfig()£¬ÔòÒ»¶¨»á´æÔÚhandler£¬¾Í¿ÉÒÔ¸´ÓÃrootµÄhandlerÁË¡£
ÉÏÃæµÄ´úÂ뻹ÓÐÒ»µãҪעÒâµÄ¾ÍÊÇ£¬Ëü»á¶ÔloggerµÄËùÓÐhandler½øÐÐÑ»·£¬µ±È»Í¬Ê±Òª¼ì²éÈÕÖ¾Êä³ö¼¶±ð¡£Òò´Ë£¬Èç¹ûÄãΪһ¸ölogger¶¨ÒåÁ˶à¸öhandler£¬ÄÇô¾ÍÓпÉÄܶ¼»áÊä³ö¡£Èç¹ûÏëÇø·Ö²»Í¬µÄhandler£¬¿ÉÒÔÀûÓü¶±ðÀ´¿ØÖÆ¡£
¶ÔÓÚroot¶ÔÏó£¬ÔÙ˵һµã¾ÍÊÇʲôʱºòÒªÖ´ÐÐbasicConfig()½øÐÐÅäÖã¿Èç¹ûÄãûÓÐ×Ô¶¨Òålogger£¬Ö»ÊÇʹÓÃloggingÖÐÒѾÌṩµÄÈ磺info(), debug()Ö®ÀàµÄ·½·¨£¬µÄÈ·²»±ØÌرðµ÷ÓÃbasicConfig()£¬ÒòΪÕâЩº¯ÊýÔÚÖ´ÐÐʱ¶¼×öÁ˼ì²é£¬Èç¹ûûͨ¹ý£¬Ôò×Ô¶¯»áµ÷ÓÃbasicConfig()¡£µ«ÊÇ£¬Èç¹ûÄã²»ÊÇÕâÑùʹÓ㬶øÊÇʹÓÃ×Ô¶¨ÒåµÄlogger£¬Òò´Ë»¹Êǽ¨ÒéÄãÏÈÖ´ÐÐbasicConfig()½øÐÐȱʡµÄÅäÖá£ÔÚʹÓÃ×Ô¶¨ÒåµÄlogger£¬Òª×¢ÒâµÄÎÊÌâ¾ÍÊÇ£ºhandlerµÄÌí¼ÓÓëpropagateµÄ´¦Àí¡£
ÄÇôÈç¹ûÎÒÏë»ñµÃroot¶ÔÏó¸ÃÈçºÎ×öÄØ£¿Ê¹ÓÃlogging.rootÂ𣿳£Óõķ½·¨»¹ÊÇͨ¹ýgetLogger('')À´»ñµÃ¡£²ÎÊý¿ÉÒÔÊÇ''»òÆäËüΪ¼ÙµÄÖµ¡£
ͨ¹ýÉÏÃæµÄ½²½â£¬ÎÒÏëÄãÓ¦¸ÃÖªµÀÎÒÌáµÄ¼¸¸öÎÊÌâµÄ´ð°¸Á˰ɡ£ÏÂÃæÔÙ¼òµ¥×ܽáһϣº
loggerÊÇ·Ö¼¶µÄ£¬Óи¸×Ó¹ØÏµ¡£
loggerµÄ´¦ÀíÒª¿¿handlerÀ´Êä³ö£¬»ñµÃÁËlogger²¢²»Ò»¶¨»á×Ô¶¯´´½¨handler£¬Òò´ËloggerÒ»°ã¶¼ÐèÒªÅäÖá£
ÔÚ´æÔÚ¸¸×Ó¹ØÏµµÄÇé¿öÏ£¬ÈÕÖ¾ÊÇ¿ÉÒÔ±»´«²¥Êä³öµÄ£¬²¢ÇÒ¿ÉÒÔͨ¹ýpropagateÊôÐÔÀ´¿ØÖÆ¡£
Àà±ð£ºUliweb ²é¿´ÆÀÂÛ