±à¼ÍƼö: |
À´Ô´ÓÚPython¿ª·¢Õߣ¬ÕâÆª¹ØÓÚÈÕÖ¾¼Ç¼¿âµÄÁé»îÐԺͿÉÅäÖÃÐԵĽéÉÜ£¬Ä¿µÄÔÚÓÚÖ¤Ã÷ËüÈçºÎÉè¼ÆÁË·Ö±ðµÄ¹Ø×¢µãµÄÃÀѧ¡£ |
|

¶ÔÒ»Ãû¿ª·¢ÕßÀ´Ëµ×îÔã¸âµÄÇé¿ö£¬Äª¹ýÓÚҪŪÇå³þÒ»¸ö²»ÊìϤµÄÓ¦ÓÃΪºÎ²»¹¤×÷¡£ÓÐʱºò£¬ÄãÉõÖÁ²»ÖªµÀϵͳÔËÐУ¬ÊÇ·ñ¸úÔʼÉè¼ÆÒ»Ö¡£
ÔÚÏßÔËÐеÄÓ¦ÓþÍÊǺںÐ×Ó£¬ÐèÒª±»¸ú×Ù¼à¿Ø¡£×î¼òµ¥Ò²×îÖØÒªµÄ·½Ê½¾ÍÊǼǼÈÕÖ¾¡£¼Ç¼ÈÕÖ¾ÔÊÐíÎÒÃÇÔÚ¿ª·¢Èí¼þµÄͬʱ£¬ÈóÌÐòÔÚϵͳÔËÐÐʱ·¢³öÐÅÏ¢£¬ÕâЩÐÅÏ¢¶ÔÓÚÎÒÃǺÍϵͳ¹ÜÀíÔ±À´Ëµ¶¼ÊÇÓÐÓõġ£
¾ÍÏñΪ½«À´µÄ³ÌÐòԱд´úÂëÎĵµÒ»Ñù£¬ÎÒÃÇÓ¦¸ÃÈÃÐÂÈí¼þ²úÉú×ã¹»µÄÈÕÖ¾¹©ÏµÍ³µÄ¿ª·¢Õߺ͹ÜÀíԱʹÓá£ÈÕÖ¾ÊǹØÓÚÓ¦ÓÃÔËÐÐ״̬µÄϵͳÎļþµÄ¹Ø¼ü²¿·Ö¡£¸øÈí¼þ¼ÓÈÕÖ¾²úÉú¾äʱ£¬ÒªÏò¸øÎ´À´Î¬»¤ÏµÍ³µÄ¿ª·¢Õߺ͹ÜÀíԱдÎĵµÒ»Ñù¡£
һЩ´¿´âÖ÷ÒåÕßÈÏΪһ¸öÊܹýѵÁ·µÄ¿ª·¢ÕßʹÓÃÈÕÖ¾ºÍ²âÊÔµÄʱºò¼¸ºõ²»ÐèÒª½»»¥µ÷ÊÔÆ÷¡£Èç¹ûÎÒÃDz»ÄÜÓÃÏêϸµÄÈÕÖ¾½âÊÍ¿ª·¢¹ý³ÌÖеÄÓ¦Óã¬ÄÇôµ±´úÂëÔÚÏßÉÏÔËÐеÄʱºò£¬½âÊÍËüÃÇ»á±äµÃ¸üÀ§ÄÑ¡£
ÕâÆªÎÄÕ½éÉÜÁË Python µÄ logging Ä£¿é£¬°üÀ¨ËüµÄÉè¼ÆÒÔ¼°Õë¶Ô¸ü¶à¸´ÔÓ°¸ÀýµÄÊÊÓ÷½·¨¡£ÕâÆªÎÄÕ²»ÊÇд¸ø¿ª·¢ÕßµÄÎĵµ£¬Ëü¸üÏñÊÇÒ»¸öÖ¸µ¼ÊֲᣬÀ´ËµÃ÷
Python µÄ logging Ä£°åÊÇÈçºÎ´î½¨µÄ£¬²¢ÇÒ¼¤·¢¸ÐÐËȤµÄÈËÉîÈëÑо¿¡£
ΪʲôʹÓà logging Ä£¿é£¿
Ò²Ðí»áÓпª·¢Õß»áÎÊ£¬ÎªÊ²Ã´²»ÊǼòµ¥µÄ print Óï¾äÄØ£¿ Logging Ä£¿éÓкܶàÓÅÊÆ£¬°üÀ¨£º
1.¶àÏß³ÌÖ§³Ö
2.ͨ¹ý²»Í¬¼¶±ðµÄÈÕÖ¾·ÖÀà
3.Áé»îÐԺͿÉÅäÖÃÐÔ
4.½«ÈçºÎ¼Ç¼ÈÕÖ¾Óë¼Ç¼ʲôÄÚÈÝ·ÖÀë
×îºóÒ»µã£¬½«ÎÒÃǼǼÄÚÈݴӼǼ·½Ê½ÖÐÕæÕý·ÖÀ룬±£Ö¤ÁËÈí¼þ²»Í¬²¿·ÖµÄºÏ×÷¡£¾Ù¸öÀý×Ó£¬ËüÔÊÐíÒ»¸ö¿ò¼Ü»ò¿âµÄ¿ª·¢ÕßÔö¼ÓÈÕÖ¾²¢ÇÒÈÃϵͳ¹ÜÀíÔ±»ò¸ºÔðÔËÐÐÅäÖõÄÈËÔ±¾ö¶¨ÉÔºóÓ¦¸Ã¼Ç¼ʲô¡£
Logging Ä£¿éÖÐÓÐʲô
Logging Ä£¿éÍêÃÀµØ½«ËüµÄÿ¸ö²¿·ÖµÄÖ°Ôð·ÖÀ루×ñÑ Apache Log4j API µÄ·½·¨£©¡£ÈÃÎÒÃÇ¿´¿´Ò»¸öÈÕÖ¾ÏßÊÇÈçºÎͨ¹ýÕâ¸öÄ£¿éµÄ´úÂ룬²¢ÇÒÑо¿ÏÂËüµÄ²»Í¬²¿·Ö¡£
¼Ç¼Æ÷£¨Logger£©
¼Ç¼Æ÷ÊÇ¿ª·¢Õß¾³£½»»¥µÄ¶ÔÏó¡£ÄÇЩÖ÷ÒªµÄ API ˵Ã÷ÁËÎÒÃÇÏëÒª¼Ç¼µÄÄÚÈÝ¡£
¾Ù¸ö¼Ç¼Æ÷µÄÀý×Ó£¬ÎÒÃÇ¿ÉÒÔ·ÖÀàÇëÇó·¢³öÒ»ÌõÐÅÏ¢£¬¶ø²»Óõ£ÐÄËüÃÇÊÇÈçºÎ´ÓÄÄÀï±»·¢³öµÄ¡£
±ÈÈ磬µ±ÎÒÃÇдÏ logger.info(¡°Stock was sold at %s¡±, price)
ÎÒÃÇÔÚÍ·ÄÔÖоÍÓÐÈçÏÂÄ£¿é£º

ÎÒÃÇÐèÒªÒ»ÌõÏß¡£¼ÙÉèÓÐЩ´úÂëÔڼǼÆ÷ÖÐÔËÐУ¬ÈÃÕâÌõÏß³öÏÖÔÚ¿ØÖÆÌ¨»òÎļþÖС£µ«ÊÇÔÚÄÚ²¿Êµ¼Ê·¢ÉúÁËÊ²Ã´ÄØ£¿
ÈÕÖ¾¼Ç¼
ÈÕÖ¾¼Ç¼ÊÇ logging Ä£¿éÓÃÀ´Âú×ãËùÓÐÐèÇóÐÅÏ¢µÄ°ü¡£ËüÃǰüº¬ÁËÐèÒª¼Ç¼ÈÕÖ¾µÄµØ·½¡¢±ä»¯µÄ×Ö·û´®¡¢²ÎÊý¡¢ÇëÇóµÄÐÅÏ¢¶ÓÁеÈÐÅÏ¢¡£
ËüÃǶ¼ÊDZ»¼Ç¼µÄ¶ÔÏó¡£Ã¿´ÎÎÒÃǵ÷ÓüǼÆ÷ʱ£¬¶¼»áÉú³ÉÕâЩ¶ÔÏó¡£µ«ÕâЩ¶ÔÏóÊÇÈçºÎÐòÁл¯µ½Á÷ÖеÄÄØ£¿Í¨¹ý´¦ÀíÆ÷£¡
´¦ÀíÆ÷
´¦ÀíÆ÷½«ÈÕÖ¾¼Ç¼·¢Ë͸øÆäËûÊä³öÖÕ¶Ë£¬ËûÃÇ»ñÈ¡ÈÕÖ¾¼Ç¼²¢ÓÃÏà¹Øº¯ÊýÖд¦ÀíËüÃÇ¡£
±ÈÈ磬һ¸öÎļþ´¦ÀíÆ÷½«»á»ñȡһÌõÈÕÖ¾¼Ç¼£¬²¢ÇÒ°ÑËüÌí¼Óµ½ÎļþÖС£
±ê×¼µÄ logging Ä£¿éÒѾ¾ß±¸Á˶àÖÖÄÚÖõĴ¦ÀíÆ÷£¬ÀýÈ磺
¶àÖÖÎļþ´¦ÀíÆ÷£¨TimeRotated, SizeRotated, Watched£©£¬¿ÉÒÔдÈëÎļþÖÐ
1.StreamHandler Êä³öÄ¿±êÁ÷±ÈÈç stdout »ò stderr
2.SMTPHandler ͨ¹ý email ·¢ËÍÈÕÖ¾¼Ç¼
3.SocketHandler ½«ÈÕÖ¾Îļþ·¢Ë͵½Á÷Ì×½Ó×Ö
4.SyslogHandler¡¢NTEventHandler¡¢HTTPHandler¼°MemoryHandlerµÈ
ĿǰÎÒÃÇÓиöÀàËÆÓÚÕæÊµÇé¿öµÄÄ£ÐÍ£º

´ó²¿·ÖµÄ´¦ÀíÆ÷¶¼ÔÚ´¦Àí×Ö·û´®(SMTPHandlerºÍFileHandlerµÈ)¡£»òÐíÄãÏëÖªµÀÕâЩ½á¹¹»¯µÄÈÕÖ¾¼Ç¼ÊÇÈçºÎת±äΪÒ×ÓÚÐòÁл¯µÄ×ֽڵġ£
¸ñʽÆ÷
¸ñʽÆ÷¸ºÔ𽫷ḻµÄÔªÊý¾ÝÈÕÖ¾¼Ç¼ת»»Îª×Ö·û´®£¬Èç¹ûʲô¶¼Ã»ÓÐÌṩ£¬½«»áÓиöĬÈϵĸñʽÆ÷¡£
Ò»°ãµÄ¸ñʽÆ÷ÀàÓÉ logging ¿âÌṩ£¬²ÉÓÃÄ£°åºÍ·ç¸ñ×÷ΪÊäÈ롣Ȼºóռλ·û¿ÉÒÔÔÚÒ»¸ö LogRecord
¶ÔÏóÖÐÉùÃ÷ËùÓÐÊôÐÔ¡£
±ÈÈ磺¡¯%(asctime)s %(levelname)s %(name)s: %(message)s¡¯
½«»áÉú³ÉÈÕÖ¾ÀàËÆÓÚ 2017-07-19 15:31:13,942 INFO parent.child:
Hello EuroPython.
Çë×¢Ò⣺ÊôÐÔÐÅÏ¢ÊÇͨ¹ýÌṩµÄ²ÎÊý¶ÔÈÕÖ¾µÄÔʼģ°å½øÐвåÖµµÄ½á¹û¡££¨±ÈÈ磬¶ÔÓÚ logger.info(¡°Hello
%s¡±, ¡°Laszlo¡±) ÕâÌõÐÅÏ¢½«»áÊÇ ¡°Hello Laszlo¡±£©
ËùÓÐĬÈϵÄÊôÐÔ¶¼¿ÉÒÔÔÚÈÕÖ¾ÎĵµÖÐÕÒµ½¡£
ºÃÁË£¬ÏÖÔÚÎÒÃÇÁ˽âÁ˸ñʽÆ÷£¬ÎÒÃǵÄÄ£ÐÍÓÖ·¢ÉúÁ˱仯£º

¹ýÂËÆ÷
ÎÒÃÇÈÕÖ¾¹¤¾ßµÄ×îºóÒ»¸ö¶ÔÏó¾ÍÊǹýÂËÆ÷¡£
¹ýÂËÆ÷ÔÊÐí¶ÔÓ¦¸Ã·¢Ë͵ÄÈÕÖ¾¼Ç¼½øÐÐϸÁ£¶È¿ØÖÆ¡£¶àÖÖ¹ýÂËÆ÷ÄÜͬʱӦÓÃÔڼǼÆ÷ºÍ´¦ÀíÆ÷ÖС£¶ÔÓÚÒ»Ìõ·¢Ë͵ÄÈÕÖ¾À´Ëµ£¬ËùÓеĹýÂËÆ÷¶¼Ó¦¸Ãͨ¹ýÕâÌõ¼Ç¼¡£
Óû§¿ÉÒÔÉùÃ÷ËûÃÇ×Ô¼ºµÄ¹ýÂËÆ÷×÷Ϊ¶ÔÏó£¬Ê¹Óà filter ·½·¨»ñÈ¡ÈÕÖ¾¼Ç¼×÷ΪÊäÈ룬·´À¡ True
/ False ×÷ΪÊä³ö¡£
³öÓÚÕâÖÖ¿¼ÂÇ£¬ÒÔÏÂÊǵ±Ç°µÄÈÕÖ¾¹¤×÷Á÷£º

¼Ç¼Æ÷²ã¼¶
´Ëʱ£¬Äã¿ÉÄÜ»á¶Ô´óÁ¿¸´ÔÓµÄÄÚÈݺÍÇÉÃîÒþ²ØµÄÄ£¿éÅäÖÃÓ¡ÏóÉî¿Ì£¬µ«ÊÇ»¹ÓиüÐèÒª¿¼Âǵģº¼Ç¼Æ÷·Ö²ã¡£
ÎÒÃÇ¿ÉÒÔͨ¹ý logging.getLogger() ´´½¨Ò»¸ö¼Ç¼Æ÷¡£ÕâÌõ×Ö·ûÏò getLogger
´«µÝÁËÒ»¸ö²ÎÊý£¬Õâ¸ö²ÎÊý¿ÉÒÔͨ¹ýʹÓÃÔ²µã·Ö¸ôÔªËØÀ´¶¨ÒåÒ»¸ö²ã¼¶¡£
¾Ù¸öÀý×Ó£¬logging.getLogger(¡°parent.child¡±) ½«»á´´½¨Ò»¸ö ¡°child¡±
µÄ¼Ç¼Æ÷£¬ËüµÄ¸¸¼¶¼Ç¼Æ÷½Ð×ö ¡°parent.¡± ¼Ç¼Æ÷ÊDZ» logging Ä£¿é¹ÜÀíµÄÈ«¾Ö¶ÔÏó£¬ËùÒÔÎÒÃÇ¿ÉÒÔ·½±ãµØÔÚÏîÄ¿ÖеÄÈκεط½¼ìË÷ËûÃÇ¡£
¼Ç¼Æ÷µÄÀý×Óͨ³£Ò²±»ÈÏΪÊÇÇþµÀ¡£²ã¼¶ÔÊÐí¿ª·¢ÕßÈ¥¶¨ÒåÇþµÀºÍËûÃǵIJ㼶¡£
ÔÚÈÕÖ¾¼Ç¼±»´«µÝµ½ËùÓмǼÆ÷ÄڵĴ¦ÀíÆ÷ʱ£¬¸¸¼¶´¦ÀíÆ÷½«»á½øÐеݹ鴦Àí£¬Ö±µ½ÎÒÃǵ½´ï¶¥¼¶µÄ¼Ç¼Æ÷£¨±»¶¨ÒåΪһ¸ö¿Õ×Ö·û´®£©£¬»òÕßÓÐÒ»¸ö¼Ç¼Æ÷ÉèÖÃÁË
propagate = False¡£ÎÒÃÇ¿Éͨ¹ý¸üеÄͼÖп´³ö£º

Çë×¢Ò⸸¼¶¼Ç¼Æ÷ûÓб»µ÷Óã¬Ö»ÓÐËüµÄ´¦ÀíÆ÷±»µ÷Óá£ÕâÒâζ׏ýÂËÆ÷ºÍÆäËûÔڼǼÆ÷ÀàÖеĴúÂë²»»áÔÚ¸¸¼¶Öб»Ö´ÐС£µ±ÎÒÃÇÔڼǼÆ÷ÖÐÔö¼Ó¹ýÂËÆ÷ʱ£¬Õâͨ³£ÊǸöÏÝÚå¡£
¹¤×÷Á÷С½á
ÎÒÃÇÒѾ²ûÃ÷¹ýÖ°ÔðµÄ»®·ÖÒÔ¼°ÎÒÃÇÊÇÈçºÎ΢µ÷ÈÕÖ¾¹ýÂË¡£È»¶ø»¹ÊÇÓÐÁ½¸öÆäËûµÄÊôÐÔÎÒÃÇûÓÐÌá¼°£º
1.¼Ç¼Æ÷¿ÉÒÔÊDzÐȱµÄ£¬´Ó¶ø²»ÔÊÐíÈκμǼ´ÓÕâ±»·¢³ö¡£
2.Ò»¸öÓÐЧµÄ²ã¼¶¿ÉÒÔͬʱÔڼǼÆ÷ºÍ´¦ÀíÆ÷Öб»ÉèÖá£
¾Ù¸öÀý×Ó£¬µ±Ò»¸ö¼Ç¼Æ÷±»ÉèÖÃΪ INFO µÄµÈ¼¶£¬Ö»ÓÐ INFO µÈ¼¶¼°ÒÔÉϵIJŻᱻ´«µÝ£¬Í¬ÑùµÄ¹æÔòÊÊÓÃÓÚ´¦ÀíÆ÷¡£
»ùÓÚÒÔÉÏËùÓеĿ¼ÂÇ£¬×îºóµÄÈÕÖ¾¼Ç¼µÄÁ÷³Ìͼ¿´ÆðÀ´ÏñÕâÑù£º

ÈçºÎʹÓÃÈÕÖ¾¼Ç¼ģ¿é
ÏÖÔÚÎÒÃÇÒѾÁ˽âÁË logging Ä£¿éµÄ²¿·Ö¼°Éè¼Æ£¬ÊÇʱºòÈ¥Á˽âÒ»¸ö¿ª·¢ÕßÊÇÈçºÎÓëËü½»»¥µÄÁË¡£ÒÔÏÂÊÇÒ»¸ö´úÂëÀý×Ó£º
import
logging
def sample_function(secret_parameter):
logger = logging.getLogger(__name__) # __name__=projectA.moduleB
logger.debug("Going to perform magic with
'%s'", secret_parameter)
...
try:
result = do_magic(secret_parameter)
except IndexError:
logger.exception("OMG it happened again,
someone please tell Laszlo")
except:
logger.info("Unexpected exception",
exc_info=True)
raise
else:
logger.info("Magic with '%s' resulted in
'%s'", secret_parameter, result, stack_info=True) |
ËüÓÃÄ£¿é __name__ ´´½¨ÁËÒ»¸öÈÕÖ¾¼Ç¼Æ÷¡£Ëü»á»ùÓÚÏîÄ¿½á¹¹´´½¨ÇþµÀºÍµÈ¼¶£¬ÕýÈç Pyhon
Ä£¿éÓÃÔ²µãÁ¬½ÓÒ»Ñù¡£
¼Ç¼Æ÷±äÁ¿ÒýÓüǼÆ÷µÄ ¡°module¡± £¬Óà ¡°projectA¡± ×÷Ϊ¸¸¼¶£¬ ¡°root¡± ×÷Ϊ¸¸¼¶µÄ¸¸¼¶¡£
ÔÚµÚÎåÐУ¬ÎÒÃÇ¿´µ½ÈçºÎÖ´Ðе÷ÓÃÈ¥·¢ËÍÈÕÖ¾¡£ÎÒÃÇ¿ÉÒÔÓà debug ¡¢ info ¡¢error »ò
critical ÕâЩ·½·¨Ö®Ò»ÔÚºÏÊʵĵȼ¶ÉÏÈ¥¼Ç¼ÈÕÖ¾¡£
µ±¼Ç¼һÌõÐÅϢʱ£¬³ýÁËÄ£°å²ÎÊý£¬ÎÒÃÇ¿ÉÒÔͨ¹ýÌØÊâµÄº¬Òå´«µÝÃÜÂë²ÎÊý£¬×îÓÐÒâ˼µÄÊÇ exc_info
ºÍ stack_info¡£ËüÃǽ«»á·Ö±ðÔö¼Ó¹ØÓÚµ±Ç°Òì³£ºÍÕ»Ö¡µÄÐÅÏ¢¡£ÎªÁË·½±ãÆð¼û£¬ÔڼǼÆ÷¶ÔÏóÖÐÓÐÒ»¸ö·½·¨Òì³££¬ÕýÈçÕâ¸ö´íÎóµ÷ÓÃ
exc_info=True ¡£
ÕâЩÊÇÈçºÎʹÓüǼÆ÷Ä£¿éµÄ»ù´¡£¬µ«ÊÇÓÐЩͨ³£±»ÈÏΪÊDz»Á¼²Ù×÷µÄ×ö·¨Í¬ÑùÖµµÃ˵Ã÷¡£
¹ý¶È¸ñʽ»¯×Ö·û´®
Ó¦¸Ã¾¡Á¿±ÜÃâʹÓà loggger.info(¡°string template {}¡±.format(argument))
£¬¿ÉÄܵϰ¾¡Á¿Ê¹Óà logger.info(¡°string template %s¡±, argument)¡£
ÕâÊǸö¸üºÃµÄʵ¼ù£¬ÒòΪֻÓе±ÈÕÖ¾±»·¢ËÍʱ£¬×Ö·û´®²Å»á·¢ÉúÕæÕý¸Ä±ä¡£µ±ÎÒÃǼǼµÄ²ã¼¶ÔÚ INFO Ö®ÉÏʱ£¬²»Õâô×ö»áµ¼ÖÂÀË·ÑÖÜÆÚ£¬ÒòΪÕâ¸ö¸Ä±äÈÔÈ»»á·¢Éú¡£
²¶×½ºÍ¸ñʽ»¯Òì³£
ͨ³££¬ÎÒÃÇÏë¼Ç¼ÔÚץȡģ¿éÒì³£µÄÈÕÖ¾ÐÅÏ¢£¬Èç¹ûÕâÑùд»áºÜÖ±¹Û£º
try:
...
except Exception as error:
logger.info("Something bad happened: %s",
error) |
µ«ÊÇÕâÑùµÄ´úÂë»á¸øÎÒÃÇÏÔʾÀàËÆÓÚ Something bad happened: ¡°secret_key.¡±
µÄÈÕÖ¾ÐУ¬Õâ²¢²»ÊǺÜÓÐÓá£Èç¹ûÎÒÃÇʹÓà exc_info ×÷ΪÊÂÏÈ˵Ã÷£¬ÄÇôËü½«»áÈçÏÂÏÔʾ£º
try:
...
except Exception:
logger.info("Something bad happened",
exc_info=True)
Something bad happened
Traceback (most recent call last):
File "sample_project.py", line 10,
in code
inner_code()
File "sample_project.py", line 6,
in inner_code
x = data["secret_key"]
KeyError: 'secret_key' |
Õâ²»½ö½ö»á°üº¬Òì³£µÄ׼ȷ×ÊÔ´£¬Í¬Ê±Ò²»á°üº¬ËüµÄÀàÐÍ¡£
ÉèÖüǼÆ÷
×°±¸ÎÒÃǵÄÈí¼þºÜ¼òµ¥£¬ÎÒÃÇÐèÒªÉèÖÃÈÕÖ¾Õ»£¬²¢ÇÒÖÆ¶¨ÕâЩ¼Ç¼ÊÇÈçºÎ±»·¢³öµÄ¡£
ÒÔÏÂÊÇÉèÖÃÈÕÖ¾Õ»µÄ¶àÖÖ·½·¨
»ù´¡ÉèÖÃ
ÕâÊÇÖÁ½ñ×î¼òµ¥µÄÉèÖÃÈÕÖ¾¼Ç¼µÄ·½·¨¡£Ê¹Óà logging.basicConfig(level=¡±INFO¡±)
´î½¨Ò»¸ö»ù´¡µÄ StreamHandler £¬ÕâÑù¾Í»á¼Ç¼ÔÚ INFO ÉϵÄÈκζ«Î÷£¬²¢ÇÒµ½¿ØÖÆÌ¨ÒÔÉϵļ¶±ð¡£ÒÔÏÂÊDZàд»ù´¡ÉèÖõÄһЩ²ÎÊý£º

Çë×¢Ò⣬ basicConfig ½ö½öÔÚÔËÐеÄÒ»¿ªÊ¼¿ÉÒÔÕâôµ÷Óá£Èç¹ûÄãÒѾÉèÖÃÁËÄãµÄ¸ù¼Ç¼Æ÷£¬µ÷ÓÃ
basicConfig ½«²»»á×àЧ¡£
×ÖµäÉèÖÃ
ËùÓÐÔªËØµÄÉèÖÃÒÔ¼°ÈçºÎÁ¬½ÓËüÃÇ¿ÉÒÔ×÷Ϊ×ÖµäÀ´ËµÃ÷¡£Õâ¸ö×ÖµäÓ¦µ±Óɲ»Í¬µÄ²¿·Ö×é³É£¬°üÀ¨¼Ç¼Æ÷¡¢´¦ÀíÆ÷¡¢¸ñʽ»¯ÒÔ¼°Ò»Ð©»ù±¾µÄͨÓòÎÊý¡£
Àý×ÓÈçÏ£º
config
= {
'disable_existing_loggers': False,
'version': 1,
'formatters': {
'short': {
'format': '%(asctime)s %(levelname)s %(name)s:
%(message)s'
},
},
'handlers': {
'console': {
'level': 'INFO',
'formatter': 'short',
'class': 'logging.StreamHandler',
},
},
'loggers': {
'': {
'handlers': ['console'],
'level': 'ERROR',
},
'plugins': {
'handlers': ['console'],
'level': 'INFO',
'propagate': False
}
},
}
import logging.config
logging.config.dictConfig(config)
|
µ±±»ÒýÓÃʱ£¬ dictConfig ½«»á½ûÓÃËùÓÐÔËÐеļǼÆ÷£¬³ý·Ç disable_existing_loggers
±»ÉèÖÃΪ false¡£Õâͨ³£ÊÇÐèÒªµÄ£¬ÒòΪºÜ¶àÄ£¿éÉùÃ÷ÁËÒ»¸öÈ«Çò¼Ç¼Æ÷£¬ËüÔÚ dictConfig
±»µ÷ÓÃ֮ǰ±»µ¼ÈëµÄʱºò½«»áʵÀý»¯¡£
Äã¿ÉÒԲ鿴 schema that can be used for the dictConfig
method£¨Á´½Ó£©¡£Í¨³££¬ÕâЩÉèÖý«»á´æ´¢ÔÚÒ»¸ö YAML ÎļþÖУ¬²¢ÇÒ´ÓÄÇÀïÉèÖ᣺ܶ࿪·¢Õß»áÇãÏòÓÚʹÓÃÕâÖÖ·½Ê½¶ø²»ÊÇʹÓÃ
fileConfig£¨Á´½Ó£©,ÒòΪËüΪ¶¨ÖÆ»¯ÌṩÁ˸üºÃµÄÖ§³Ö¡£
ÍØÕ¹ logging
ÐÒ¿÷Éè¼ÆÁËÕâÖÖ·½Ê½£¬ÍØÕ¹ logging Ä£¿éºÜÈÝÒס£ÈÃÎÒÃÇÀ´¿´Ð©Àý×Ó£º
logging JSON | ¼Ç¼ JSON
Ö»ÒªÎÒÃÇÏëÒª¼Ç¼£¬ÎÒÃÇ¿ÉÒÔͨ¹ý´´½¨Ò»ÖÖ×Ô¶¨Òå¸ñʽ»¯À´¼Ç¼ JSON £¬Ëü»á½«ÈÕÖ¾¼Ç¼ת»¯Îª JSON
±àÂëµÄ×Ö·û´®¡£
import
logging
import logging.config
import json
ATTR_TO_JSON = ['created', 'filename', 'funcName',
'levelname', 'lineno', 'module', 'msecs', 'msg',
'name', 'pathname', 'process', 'processName',
'relativeCreated', 'thread', 'threadName']
class JsonFormatter:
def format(self, record):
obj = {attr: getattr(record, attr)
for attr in ATTR_TO_JSON}
return json.dumps(obj, indent=4)
handler = logging.StreamHandler()
handler.formatter = JsonFormatter()
logger = logging.getLogger(__name__)
logger.addHandler(handler)
logger.error("Hello")
|
Ìí¼Ó¸ü¶àÉÏÏÂÎÄ
ÔÚ¸ñʽ»¯ÖУ¬ÎÒÃÇ¿ÉÒÔÖ¸¶¨ÈκÎÈÕÖ¾¼Ç¼µÄÊôÐÔ¡£
ÎÒÃÇ¿ÉÒÔͨ¹ý¶àÖÖ·½Ê½Ôö¼ÓÊôÐÔ£¬ÔÚÕâ¸öÀý×ÓÖУ¬ÎÒÃÇÓùýÂËÆ÷À´·á¸»ÈÕÖ¾¼Ç¼¡£
import
logging
import logging.config
GLOBAL_STUFF = 1
class ContextFilter(logging.Filter):
def filter(self, record):
global GLOBAL_STUFF
GLOBAL_STUFF += 1
record.global_data = GLOBAL_STUFF
return True
handler = logging.StreamHandler()
handler.formatter = logging.Formatter("%(global_data)s
%(message)s")
handler.addFilter(ContextFilter())
logger = logging.getLogger(__name__)
logger.addHandler(handler)
logger.error("Hi1")
logger.error("Hi2") |
ÕâÑùÓÐЧµØÔÚËùÓÐÈÕÖ¾¼Ç¼ÖÐÔö¼ÓÁËÒ»¸öÊôÐÔ£¬Ëü¿ÉÒÔͨ¹ý¼Ç¼Æ÷¡£¸ñʽ»¯»áÔÚÈÕÖ¾ÐÐÖаüº¬Õâ¸öÊôÐÔ¡£
Çë×¢ÒâÕâ»áÔÚÄãµÄÓ¦ÓÃÖÐÓ°ÏìËùÓеÄÈÕÖ¾¼Ç¼£¬°üº¬Äã¿ÉÄÜÓõ½ÒÔ¼°Äã·¢ËÍÈÕÖ¾µÄ¿âºÍÆäËûµÄ¿ò¼Ü¡£Ëü¿ÉÒÔÓÃÀ´¼Ç¼ÀàËÆÓÚÔÚËùÓÐÈÕÖ¾ÐÐÀïµÄÒ»¸ö¶ÀÁ¢ÇëÇó
ID £¬È¥×·×ÙÇëÇó»òÕßÈ¥Ìí¼Ó¶îÍâµÄÉÏÏÂÎÄÐÅÏ¢¡£
´Ó Python 3.2 ¿ªÊ¼£¬Äã¿ÉÒÔʹÓà setLogRecordFactory È¥»ñµÃËùÓÐÈÕÖ¾µÄ´´½¨¼Ç¼ºÍÔö¼Ó¶îÍâµÄÐÅÏ¢¡£Õâ¸ö
extra attribute ºÍ LoggerAdapter class »òÐíͬÑùÊÇÓÐȤµÄ¡£
»º³åÈÕÖ¾
ÓÐʱºòµ±´íÎó·¢Éúʱ£¬ÎÒÃÇÏëÒªÅųýÈÕÖ¾¹ÊÕÏ¡£´´½¨Ò»¸ö»º³åµÄ´¦ÀíÆ÷£¬À´¼Ç¼µ±´íÎó·¢ÉúʱµÄ×îйÊÕÏÐÅÏ¢ÊÇÒ»ÖÖ¿ÉÐеİ취¡£ÏÂÃæµÄ´úÂëÊǸö·ÇÈËΪ²ß»®µÄÀý×Ó£º
import
logging
import logging.handlers
class SmartBufferHandler(logging.handlers.MemoryHandler):
def __init__(self, num_buffered, *args, **kwargs):
kwargs["capacity"] = num_buffered
+ 2 # +2 one for current, one for prepop
super().__init__(*args, **kwargs)
def emit(self, record):
if len(self.buffer) == self.capacity - 1:
self.buffer.pop(0)
super().emit(record)
handler = SmartBufferHandler(num_buffered=2,
target=logging.StreamHandler(), flushLevel=logging.ERROR)
logger = logging.getLogger(__name__)
logger.setLevel("DEBUG")
logger.addHandler(handler)
logger.error("Hello1")
logger.debug("Hello2") # This line
won't be logged
logger.debug("Hello3")
logger.debug("Hello4")
logger.error("Hello5") # As error
will flush the buffered logs, the two last debugs
will be logged |
¸ü¶àÐÅÏ¢
ÕâÆª¹ØÓÚÈÕÖ¾¼Ç¼¿âµÄÁé»îÐԺͿÉÅäÖÃÐԵĽéÉÜ£¬Ä¿µÄÔÚÓÚÖ¤Ã÷ËüÈçºÎÉè¼ÆÁË·Ö±ðµÄ¹Ø×¢µãµÄÃÀѧ¡£ËüͬÑùΪÈκζÔ
logging documentation ºÍ how-to guide ¸ÐÐËȤµÄÈËÌṩÁËÒ»¸ö¼áʵµÄ»ù´¡¡£ËäÈ»ÕâÆªÎÄÕ¶ÔÓÚ
Python ÈÕ־ģ¿é²¢²»ÊÇÒ»¸ö×ÛºÏÐÔµÄÖªµÀ£¬µ«ÊÇÕâÀïÓÐһЩÕë¶ÔÓÚ³£¼ûµÄÎÊÌâµÄ»Ø´ð¡£
ÎÊ£ºÎҵĿⷢËÍÁËÒ»¸ö¡° no logger configured¡± µÄ¾¯¸æ
´ð£º´Ó The Hitchhiker¡¯s Guide to Python ²éÔÄ how to configure
logging in a library
ÎÊ£ºÈç¹ûÒ»¸ö¼Ç¼Æ÷ûÓв㼶ÉèÖûáÔõôÑù£¿
´ð£º¼Ç¼Æ÷µÄÓÐЧ²ã¼¶£¬»áÓÉËüµÄ¸¸¼¶µÝ¹é¶¨Òå¡£
ÎÊ£ºÎÒËùÓеÄÈÕÖ¾¶¼ÔÚ±¾µØÊ±¼ä£¬ÎÒÈçºÎ¼Ç¼ÔÚ UTC £¿
´ð£º¸ñʽ»¯¾ÍÊǴ𰸣¡ÄãÐèÒªÔÚÄãµÄ¸ñʽ»¯ÖÐÉèÖà converter ÊôÐÔΪͨÓÃµÄ UTC ʱ¼ä¡£Ê¹ÓÃ
converter = time.gmtime ¡£
|