Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
Python×Ô¶¯»¯ÔËά֮³£ÓÃÄ£¿é¡ªlogging
 
  2062  次浏览      27
 2019-7-31
 
±à¼­ÍƼö:
±¾ÎÄÀ´Ô´51cto£¬ÎÄÕÂÖ÷Òª½éÉÜÁËÈçºÎʹÓÃPythonÄ£¿éloggingÒÔ¼°loggingÄ£¿éʹÓùý³ÌºÍ´¦Àí¹ý³Ì£¬Ï£Íû¶ÔÄúµÄѧϰÓÐËù°ïÖú¡£

ÔÚÏÖʵÉú»îÖУ¬¼Ç¼ÈÕÖ¾·Ç³£ÖØÒª¡£ÒøÐÐתÕËʱ»áÓÐתÕ˼Ǽ£»Èç¹ûÓгöÏÖʲôÎÊÌ⣬ÈËÃÇ¿ÉÒÔͨ¹ýÈÕÖ¾Êý¾ÝÀ´¸ãÇå³þµ½µ×·¢ÉúÁËʲô¡£

¶ÔÓÚϵͳ¿ª·¢¡¢µ÷ÊÔÒÔ¼°ÔËÐУ¬¼Ç¼ÈÕÖ¾¶¼ÊÇͬÑùµÄÖØÒª¡£Èç¹ûûÓÐÈÕÖ¾¼Ç¼£¬³ÌÐò±ÀÀ£Ê±Ä㼸ºõ¾Íû°ì·¨ÅªÃ÷°×µ½µ×·¢ÉúÁËʲôÊÂÇé¡£

1¡¢¼òµ¥Ê¹ÓÃ

import logging
logging.debug('debug message')
logging.info('info message')
logging.warn('warn message')
logging.error('error message')
logging.critical('critical message')

Ö´Ðнá¹û£º

WARNING:root:warn message
ERROR:root:error message
CRITICAL:root:critical message

ĬÈÏÇé¿öÏ£¬loggingÄ£¿é½«ÈÕÖ¾´òÓ¡µ½ÆÁÄ»ÉÏ(stdout)£¬ÈÕÖ¾¼¶±ðΪWARNING(¼´Ö»ÓÐÈÕÖ¾¼¶±ð¸ßÓÚWARNINGµÄÈÕÖ¾ÐÅÏ¢²Å»áÊä³ö)£¬ÈÕÖ¾¸ñʽÈçÏÂͼËùʾ£º

1.1 ÈÕÖ¾¼¶±ð

1.2 ¼òµ¥ÅäÖÃ

import logging
# ͨ¹ýÏÂÃæµÄ·½Ê½½øÐмòµ¥ÅäÖÃÊä³ö·½Ê½ÓëÈÕÖ¾¼¶±ð
logging.basicConfig(filename='logger.log', level=logging.INFO)
logging.debug('debug message')
logging.info('info message')
logging.warn('warn message')
logging.error('error message')
logging.critical('critical message')

Ö´Ðнá¹û£º

±ê×¼Êä³ö(ÆÁÄ»)δÏÔʾÈκÎÐÅÏ¢£¬·¢ÏÖµ±Ç°¹¤×÷Ŀ¼ÏÂÉú³ÉÁËlogger.log£¬ÄÚÈÝÈçÏ£º

INFO:root:info message
WARNING:root:warn message
ERROR:root:error message
CRITICAL:root:critical message

ÒòΪͨ¹ýlevel=logging.INFOÉèÖÃÈÕÖ¾¼¶±ðΪINFO£¬ËùÒÔËùÓеÄÈÕÖ¾ÐÅÏ¢¾ùÊä³ö³öÀ´ÁË¡£

2¡¢ÖØÒªµÄ¸ÅÄî

Logger ¼Ç¼Æ÷£¬±©Â¶ÁËÓ¦ÓóÌÐò´úÂëÄÜÖ±½ÓʹÓõĽӿڡ£

Handler ´¦ÀíÆ÷£¬½«£¨¼Ç¼Æ÷²úÉúµÄ£©ÈÕÖ¾¼Ç¼·¢ËÍÖÁºÏÊʵÄÄ¿µÄµØ¡£

Filter ¹ýÂËÆ÷£¬ÌṩÁ˸üºÃµÄÁ£¶È¿ØÖÆ£¬Ëü¿ÉÒÔ¾ö¶¨Êä³öÄÄЩÈÕÖ¾¼Ç¼¡£

Formatter ¸ñʽ»¯Æ÷£¬Ö¸Ã÷ÁË×îÖÕÊä³öÖÐÈÕÖ¾¼Ç¼µÄ²¼¾Ö¡£

1.2.1 Logger ¼Ç¼Æ÷

LoggerÊÇÒ»¸öÊ÷Ðβ㼶½á¹¹£¬ÔÚʹÓýӿÚdebug£¬info£¬warn£¬error£¬critical֮ǰ±ØÐë´´½¨LoggerʵÀý£¬¼´´´½¨Ò»¸ö¼Ç¼Æ÷£¬Èç¹ûûÓÐÏÔʽµÄ½øÐд´½¨£¬ÔòĬÈÏ´´½¨Ò»¸öroot logger£¬²¢Ó¦ÓÃĬÈϵÄÈÕÖ¾¼¶±ð(WARN)£¬´¦ÀíÆ÷Handler(StreamHandler£¬¼´½«ÈÕÖ¾ÐÅÏ¢´òÓ¡Êä³öÔÚ±ê×¼Êä³öÉÏ)£¬ºÍ¸ñʽ»¯Æ÷Formatter(ĬÈϵĸñʽ¼´ÎªµÚÒ»¸ö¼òµ¥Ê¹ÓóÌÐòÖÐÊä³öµÄ¸ñʽ)¡£

´´½¨·½·¨: logger = logging.getLogger(logger_name)

´´½¨LoggerʵÀýºó£¬¿ÉÒÔʹÓÃÒÔÏ·½·¨½øÐÐÈÕÖ¾¼¶±ðÉèÖã¬Ôö¼Ó´¦ÀíÆ÷Handler¡£

logger.setLevel(logging.ERROR) # ÉèÖÃÈÕÖ¾¼¶±ðΪERROR£¬¼´Ö»ÓÐÈÕÖ¾¼¶±ð´óÓÚµÈÓÚERRORµÄÈÕÖ¾²Å»áÊä³ö

logger.addHandler(handler_name) # ΪLoggerʵÀýÔö¼ÓÒ»¸ö´¦ÀíÆ÷
logger.removeHandler(handler_name) # ΪLoggerʵÀýɾ³ýÒ»¸ö´¦ÀíÆ÷

2.2 Handler ´¦ÀíÆ÷

Handler´¦ÀíÆ÷ÀàÐÍÓкܶàÖÖ£¬±È½Ï³£ÓõÄÓÐÈý¸ö£¬StreamHandler£¬FileHandler£¬NullHandler£¬ÏêÇé¿ÉÒÔ·ÃÎÊPython logging.handlers

´´½¨StreamHandlerÖ®ºó£¬¿ÉÒÔͨ¹ýʹÓÃÒÔÏ·½·¨ÉèÖÃÈÕÖ¾¼¶±ð£¬ÉèÖøñʽ»¯Æ÷Formatter£¬Ôö¼Ó»òɾ³ý¹ýÂËÆ÷Filter¡£

ch.setLevel(logging.WARN) # Ö¸¶¨ÈÕÖ¾¼¶±ð£¬µÍÓÚWARN¼¶±ðµÄÈÕÖ¾½«±»ºöÂÔ
ch.setFormatter(formatter_name) # ÉèÖÃÒ»¸ö¸ñʽ»¯Æ÷formatter
ch.addFilter(filter_name) # Ôö¼ÓÒ»¸ö¹ýÂËÆ÷£¬¿ÉÒÔÔö¼Ó¶à¸ö
ch.removeFilter(filter_name) # ɾ³ýÒ»¸ö¹ýÂËÆ÷

StreamHandler

´´½¨·½·¨: sh = logging.StreamHandler(stream=None)

FileHandler

´´½¨·½·¨: fh = logging.FileHandler(filename, mode='a', encoding=None, delay=False)

NullHandler

NullHandlerÀàλÓÚºËÐÄlogging°ü£¬²»×öÈκεĸñʽ»¯»òÕßÊä³ö¡£±¾ÖÊÉÏËüÊǸö¡°Ê²Ã´¶¼²»×ö¡±µÄhandler£¬Óɿ⿪·¢ÕßʹÓá£

2.3 Formatter ¸ñʽ»¯Æ÷

ʹÓÃFormatter¶ÔÏóÉèÖÃÈÕÖ¾ÐÅÏ¢×îºóµÄ¹æÔò¡¢½á¹¹ºÍÄÚÈÝ£¬Ä¬ÈϵÄʱ¼ä¸ñʽΪ%Y-%m-%d %H:%M:%S¡£

´´½¨·½·¨: formatter = logging.Formatter(fmt=None, datefmt=None)

ÆäÖУ¬fmtÊÇÏûÏ¢µÄ¸ñʽ»¯×Ö·û´®£¬datefmtÊÇÈÕÆÚ×Ö·û´®¡£Èç¹û²»Ö¸Ã÷fmt£¬½«Ê¹ÓÃ'%(message)s'¡£Èç¹û²»Ö¸Ã÷datefmt£¬½«Ê¹ÓÃISO8601ÈÕÆÚ¸ñʽ¡£

2.4 Filter ¹ýÂËÆ÷

HandlersºÍLoggers¿ÉÒÔʹÓÃFiltersÀ´Íê³É±È¼¶±ð¸ü¸´ÔӵĹýÂË¡£Filter»ùÀàÖ»ÔÊÐíÌØ¶¨Logger²ã´ÎÒÔϵÄʼþ¡£ÀýÈçÓá®A.B¡¯³õʼ»¯µÄFilterÔÊÐíLogger ¡®A.B¡¯, ¡®A.B.C¡¯, ¡®A.B.C.D¡¯, ¡®A.B.D¡¯µÈ¼Ç¼µÄʼþ£¬logger¡®A.BB¡¯, ¡®B.A.B¡¯ µÈ¾Í²»ÐС£ Èç¹ûÓÿÕ×Ö·û´®À´³õʼ»¯£¬ËùÓеÄʼþ¶¼½ÓÊÜ¡£

´´½¨·½·¨: filter = logging.Filter(name='')

ÒÔÏÂÊÇÏà¹Ø¸ÅÄî×ܽá:

ÊìϤÁËÕâЩ¸ÅÄîÖ®ºó£¬ÓÐÁíÍâÒ»¸ö±È½ÏÖØÒªµÄÊÂÇ鱨ÐëÇå³þ£¬¼´LoggerÊÇÒ»¸öÊ÷Ðβ㼶½á¹¹;

Logger¿ÉÒÔ°üº¬Ò»¸ö»ò¶à¸öHandlerºÍFilter£¬¼´LoggerÓëHandler»òFitlerÊÇÒ»¶Ô¶àµÄ¹ØÏµ;

Ò»¸öLoggerʵÀý¿ÉÒÔÐÂÔö¶à¸öHandler£¬Ò»¸öHandler¿ÉÒÔÐÂÔö¶à¸ö¸ñʽ»¯Æ÷»ò¶à¸ö¹ýÂËÆ÷£¬¶øÇÒÈÕÖ¾¼¶±ð½«»á¼Ì³Ð¡£

3¡¢Logging¹¤×÷Á÷³Ì

µÚÒ»´Îµ¼ÈëloggingÄ£¿é»òʹÓÃreloadº¯ÊýÖØÐµ¼ÈëloggingÄ£¿é£¬loggingÄ£¿éÖеĴúÂ뽫±»Ö´ÐУ¬Õâ¸ö¹ý³ÌÖн«²úÉúloggingÈÕ־ϵͳµÄĬÈÏÅäÖá£

×Ô¶¨ÒåÅäÖÃ(¿ÉÑ¡)¡£logging±ê׼ģ¿éÖ§³ÖÈýÖÖÅäÖ÷½Ê½: dictConfig£¬fileConfig£¬listen¡£ÆäÖУ¬dictConfigÊÇͨ¹ýÒ»¸ö×ֵ佸ÐÐÅäÖÃLogger£¬Handler£¬Filter£¬Formatter£»fileConfigÔòÊÇͨ¹ýÒ»¸öÎļþ½øÐÐÅäÖã»¶ølistenÔò¼àÌýÒ»¸öÍøÂç¶Ë¿Ú£¬Í¨¹ý½ÓÊÕÍøÂçÊý¾ÝÀ´½øÐÐÅäÖᣵ±È»£¬³ýÁËÒÔÉϼ¯Ì廯ÅäÖÃÍ⣬Ҳ¿ÉÒÔÖ±½Óµ÷ÓÃLogger£¬HandlerµÈ¶ÔÏóÖеķ½·¨ÔÚ´úÂëÖÐÀ´ÏÔʽÅäÖá£

ʹÓÃloggingÄ£¿éµÄÈ«¾Ö×÷ÓÃÓòÖеÄgetLoggerº¯ÊýÀ´µÃµ½Ò»¸öLogger¶ÔÏóʵÀý(Æä²ÎÊý¼´ÊÇÒ»¸ö×Ö·û´®£¬±íʾLogger¶ÔÏóʵÀýµÄÃû×Ö£¬¼´Í¨¹ý¸ÃÃû×ÖÀ´µÃµ½ÏàÓ¦µÄLogger¶ÔÏóʵÀý)¡£

ʹÓÃLogger¶ÔÏóÖеÄdebug£¬info£¬error£¬warn£¬criticalµÈ·½·¨¼Ç¼ÈÕÖ¾ÐÅÏ¢¡£

4¡¢loggingÄ£¿éʹÓùý³Ì

4.1 loggingÄ£¿é´¦ÀíÁ÷³Ì

ÅжÏÈÕÖ¾µÄµÈ¼¶ÊÇ·ñ´óÓÚLogger¶ÔÏóµÄµÈ¼¶£¬Èç¹û´óÓÚ£¬ÔòÍùÏÂÖ´ÐУ¬·ñÔò£¬Á÷³Ì½áÊø¡£

²úÉúÈÕÖ¾¡£µÚÒ»²½£¬ÅжÏÊÇ·ñÓÐÒì³££¬Èç¹ûÓУ¬ÔòÌí¼ÓÒì³£ÐÅÏ¢¡£µÚ¶þ²½£¬´¦ÀíÈÕÖ¾¼Ç¼·½·¨(Èçdebug£¬infoµÈ)ÖеÄռλ·û£¬¼´Ò»°ãµÄ×Ö·û´®¸ñʽ»¯´¦Àí¡£

ʹÓÃ×¢²áµ½Logger¶ÔÏóÖеÄFilters½øÐйýÂË¡£Èç¹ûÓжà¸ö¹ýÂËÆ÷£¬ÔòÒÀ´Î¹ýÂË£»Ö»ÒªÓÐÒ»¸ö¹ýÂËÆ÷·µ»Ø¼Ù£¬Ôò¹ýÂ˽áÊø£¬ÇÒ¸ÃÈÕÖ¾ÐÅÏ¢½«¶ªÆú£¬²»ÔÙ´¦Àí£¬¶ø´¦ÀíÁ÷³ÌÒ²ÖÁ´Ë½áÊø¡£·ñÔò£¬´¦ÀíÁ÷³ÌÍùÏÂÖ´ÐС£

ÔÚµ±Ç°Logger¶ÔÏóÖвéÕÒHandlers£¬Èç¹ûÕÒ²»µ½ÈκÎHandler£¬ÔòÍùÉϵ½¸ÃLogger¶ÔÏóµÄ¸¸LoggerÖвéÕÒ£»Èç¹ûÕÒµ½Ò»¸ö»ò¶à¸öHandler£¬ÔòÒÀ´ÎÓÃHandlerÀ´´¦ÀíÈÕÖ¾ÐÅÏ¢¡£µ«ÔÚÿ¸öHandler´¦ÀíÈÕÖ¾ÐÅÏ¢¹ý³ÌÖУ¬»áÊ×ÏÈÅжÏÈÕÖ¾ÐÅÏ¢µÄµÈ¼¶ÊÇ·ñ´óÓÚ¸ÃHandlerµÄµÈ¼¶£¬Èç¹û´óÓÚ£¬ÔòÍùÏÂÖ´ÐÐ(ÓÉLogger¶ÔÏó½øÈëHandler¶ÔÏóÖÐ)£¬·ñÔò£¬´¦ÀíÁ÷³Ì½áÊø¡£

Ö´ÐÐHandler¶ÔÏóÖеÄfilter·½·¨£¬¸Ã·½·¨»áÒÀ´ÎÖ´ÐÐ×¢²áµ½¸ÃHandler¶ÔÏóÖеÄFilter¡£Èç¹ûÓÐÒ»¸öFilterÅжϸÃÈÕÖ¾ÐÅϢΪ¼Ù£¬Ôò´ËºóµÄËùÓÐFilter¶¼²»ÔÙÖ´ÐУ¬¶øÖ±½Ó½«¸ÃÈÕÖ¾ÐÅÏ¢¶ªÆú£¬´¦ÀíÁ÷³Ì½áÊø¡£

ʹÓÃFormatterÀà¸ñʽ»¯×îÖÕµÄÊä³ö½á¹û¡£ ×¢£ºFormatterͬÉÏÊöµÚ2²½µÄ×Ö·û´®¸ñʽ»¯²»Í¬£¬Ëü»áÌí¼Ó¶îÍâµÄÐÅÏ¢£¬±ÈÈçÈÕÖ¾²úÉúµÄʱ¼ä£¬²úÉúÈÕÖ¾µÄÔ´´úÂëËùÔÚµÄÔ´ÎļþµÄ·¾¶µÈµÈ¡£

ÕæÕýµØÊä³öÈÕÖ¾ÐÅÏ¢(µ½ÍøÂ磬Îļþ£¬ÖÕ¶Ë£¬ÓʼþµÈ)¡£ÖÁÓÚÊä³öµ½ÄĸöÄ¿µÄµØ£¬ÓÉHandlerµÄÖÖÀàÀ´¾ö¶¨¡£

×¢£ºÒÔÉÏÄÚÈÝÕª³­×ÔµÚÈýÌõ²Î¿¼×ÊÁÏ£¬ÄÚÈÝÂÔÓи͝£¬×ªÔØÌØ´ËÉùÃ÷¡£

5¡¢ÈÕÖ¾ÅäÖÃ

5.1 ÅäÖ÷½Ê½

ÏÔʽ´´½¨¼Ç¼Æ÷Logger¡¢´¦ÀíÆ÷HandlerºÍ¸ñʽ»¯Æ÷Formatter£¬²¢½øÐÐÏà¹ØÉèÖã»

ͨ¹ý¼òµ¥·½Ê½½øÐÐÅäÖã¬Ê¹ÓÃbasicConfig()º¯ÊýÖ±½Ó½øÐÐÅäÖã»

ͨ¹ýÅäÖÃÎļþ½øÐÐÅäÖã¬Ê¹ÓÃfileConfig()º¯Êý¶ÁÈ¡ÅäÖÃÎļþ£»

ͨ¹ýÅäÖÃ×ֵ佸ÐÐÅäÖã¬Ê¹ÓÃdictConfig()º¯Êý¶ÁÈ¡ÅäÖÃÐÅÏ¢£»

ͨ¹ýÍøÂç½øÐÐÅäÖã¬Ê¹ÓÃlisten()º¯Êý½øÐÐÍøÂçÅäÖá£

5.2 basicConfig¹Ø¼ü×Ö²ÎÊý

5.3 ÓÐÓõÄformat¸ñʽ

5.4 ÅäÖÃʾÀý

5.4.1 ÏÔʽÅäÖÃ

ʹÓóÌÐòlogger.pyÈçÏÂ:

import logging
# create logger
logger_name = "example"
file_log = "accesss.log"
logger = logging.getLogger(logger_name)
logger.setLevel(logging.DEBUG)
# create file handler
fh = logging.FileHandler(file_log)
fh.setLevel(logging.WARN)
# create formatter
fmt = "%(asctime)-15s %(levelname)s %(filename)s %(lineno)d %(process)d %(message)s"
datefmt = "%a %d %b %Y %H:%M:%S"
formatter = logging.Formatter(fmt, datefmt)
# add handler and formatter to logger
fh.setFormatter(formatter)
logger.addHandler(fh)
# print log info
logger.debug('debug message')
logger.info('info message')
logger.warn('warn message')
logger.error('error message')
logger.critical('critical message')

5.4.2 ÎļþÅäÖÃ

ÅäÖÃÎļþlogging.confÈçÏÂ:

[loggers]
keys=root,example01
[logger_root]
level=DEBUG
handlers=hand01,hand02
[logger_example01]
handlers=hand01,hand02
qualname=example01
propagate=0
[handlers]
keys=hand01,hand02
[handler_hand01]
class=StreamHandler
level=INFO
formatter=form02
args=(sys.stderr,)
[handler_hand02]
class=FileHandler
level=DEBUG
formatter=form01
args=('log.log', 'a')
[formatters]
keys=form01,form02
[formatter_form01]
format=%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s

ʹÓóÌÐòlogger.pyÈçÏÂ:

import logging
import logging.config
logging.config.fileConfig("logging.conf")
# create logger
logger_name = "example"
logger = logging.getLogger(logger_name)
logger.debug('debug message')
logger.info('info message')
logger.warn('warn message')
logger.error('error message')
logger.critical('critical message')

5.4.3 ×ÖµäÅäÖÃ

import logging
import logging.config
logger = logging.getLogger(__name__)
# load config from file
# logging.config.fileConfig('logging.ini', disable_existing_loggers=False)
# or, for dictConfig
logging.config.dictConfig({
'version': 1,
'disable_existing_loggers': False, # this fixes the problem

'formatters': {
'standard': {
'format': '%(asctime)s [%(levelname)s] %(name)s: %(message)s'
},
},
'handlers': {
'default': {
'level':'INFO',
'class':'logging.StreamHandler',
},
},
'loggers': {
'': {
'handlers': ['default'],
'level': 'INFO',
'propagate': True
}
}
})
logger.info('It works!')

5.4.4 ¼àÌýÅäÖÃ

¿ÉÒÔʹÓÃlogging.config.listen(port=DEFAULT _ LOGGING _ CONFIG _ PORT )½øÐÐÍêÉÆ±¾ÎÄ¡£

5.4.5 JSONÅäÖÃ

ÅäÖÃÎļþlogging.jsonÈçÏ£º

{
"version": 1,
"disable_existing_loggers": false,
"formatters": {
"simple": {
"format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
}
},

"handlers": {
"console": {
"class": "logging.StreamHandler",
"level": "DEBUG",
"formatter": "simple",
"stream": "ext://sys.stdout"
},

"info_file_handler": {
"class": "logging.handlers.RotatingFileHandler",
"level": "INFO",
"formatter": "simple",
"filename": "info.log",
"maxBytes": 10485760,
"backupCount": 20,
"encoding": "utf8"
},

"error_file_handler": {
"class": "logging.handlers.RotatingFileHandler",
"level": "ERROR",
"formatter": "simple",
"filename": "errors.log",
"maxBytes": 10485760,
"backupCount": 20,
"encoding": "utf8"
}
},

"loggers": {
"my_module": {
"level": "ERROR",
"handlers": ["console"],
"propagate": "no"
}
},

"root": {
"level": "INFO",
"handlers": ["console", "info_file_handler", "error_file_handler"]
}
}

ʹÓóÌÐòlogger.pyÈçÏÂ:

import json
import logging.config

def setup_logging(
default_path='logging.json',
default_level=logging.INFO,
env_key='LOG_CFG'
):
"""Setup logging configuration

"""
path = default_path
value = os.getenv(env_key, None)
if value:
path = value
if os.path.exists(path):
with open(path, 'rt') as f:
config = json.load(f)
logging.config.dictConfig(config)
else:
logging.basicConfig(level=default_level)

5.4.6 YAMLÅäÖÃ

ÅäÖÃÎļþlogging.yamlÈçÏ£º

---
version: 1
disable_existing_loggers: False
formatters:
simple:
format: "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
handlers:
console:
class: logging.StreamHandler
level: DEBUG
formatter: simple
stream: ext://sys.stdout
info_file_handler:
class: logging.handlers.RotatingFileHandler
level: INFO
formatter: simple
filename: info.log
maxBytes: 10485760 # 10MB
backupCount: 20
encoding: utf8
error_file_handler:
class: logging.handlers.RotatingFileHandler
level: ERROR
formatter: simple
filename: errors.log
maxBytes: 10485760 # 10MB
backupCount: 20
encoding: utf8
loggers:
my_module:
level: ERROR
handlers: [console]
propagate: no
root:
level: INFO
handlers: [console, info_file_handler, error_file_handler]

ʹÓóÌÐòlogger.pyÈçÏÂ:

import os
import logging.config
import yaml
def setup_logging(
default_path='logging.yaml',
default_level=logging.INFO,
env_key='LOG_CFG'
):
"""Setup logging configuration
"""
path = default_path
value = os.getenv(env_key, None)
if value:
path = value
if os.path.exists(path):
with open(path, 'rt') as f:
config = yaml.load(f.read())
logging.config.dictConfig(config)
else:
lo

6¡¢Ê¹Óà __name__ ×÷Ϊ logger µÄÃû³Æ

ËäÈ»²»ÊǷǵý« logger µÄÃû³ÆÉèÖÃΪ __name__ £¬µ«ÊÇÕâÑù×ö»á¸øÎÒÃÇ´øÀ´Öî¶àÒæ´¦¡£ÔÚ python ÖУ¬±äÁ¿ __name__ µÄÃû³Æ¾ÍÊǵ±Ç°Ä£¿éµÄÃû³Æ¡£±ÈÈ磬ÔÚÄ£¿é ¡°foo.bar.my_module¡± Öе÷Óà logger.getLogger(__name__) µÈ¼ÛÓÚµ÷ÓÃlogger.getLogger(¡°foo.bar.my_module¡±) ¡£µ±ÄãÐèÒªÅäÖà logger ʱ£¬Äã¿ÉÒÔÅäÖõ½ ¡°foo¡± ÖУ¬ÕâÑù°ü foo ÖеÄËùÓÐÄ£¿é¶¼»áʹÓÃÏàͬµÄÅäÖᣵ±ÄãÔÚ¶ÁÈÕÖ¾ÎļþµÄʱºò£¬Äã¾ÍÄܹ»Ã÷°×ÏûÏ¢µ½µ×À´×ÔÓÚÄÄÒ»¸öÄ£¿é¡£

7¡¢²¶×½Òì³£²¢Ê¹Óà traceback ¼Ç¼Ëü

³öÎÊÌâµÄʱºò¼Ç¼ÏÂÀ´ÊǸöºÃϰ¹ß£¬µ«ÊÇÈç¹ûûÓÐ traceback £¬ÄÇôËüÒ»µã¶ùÓÃҲûÓС£ÄãÓ¦¸Ã²¶»ñÒì³£²¢Óà traceback °ÑËüÃǼǼÏÂÀ´¡£±ÈÈçÏÂÃæÕâ¸öÀý×Ó£º

ʹÓòÎÊý exc_info=true µ÷Óà logger ·½·¨, traceback »áÊä³öµ½ logger ÖС£Äã¿ÉÒÔ¿´µ½ÏÂÃæµÄ½á¹û£º

pen('/path/to/does/not/exist', 'rb')
except (SystemExit, KeyboardInterrupt):
raise
except Exception, e:
logger.error('Failed to open file', exc_info=True)

ÄãÒ²¿ÉÒÔµ÷Óà logger.exception(msg, _args)£¬ËüµÈ¼ÛÓÚ logger.error(msg, exc_info=True, _args)¡£

ǧÍò²»ÒªÔÚÄ£¿é²ã´Î»ñÈ¡ Logger£¬³ý·Ç disable_existing_loggers ±»ÉèÖÃΪ False

Äã¿ÉÒÔ¿´µ½ºÜ¶àÔÚÄ£¿é²ã´Î»ñÈ¡ logger µÄÀý×Ó£¨ÔÚÕâÆªÎÄÕÂÎÒҲʹÓÃÁ˺ܶ࣬µ«Õâ½ö½öΪÁËÈÃʾÀý¸ü¶ÌһЩ£©¡£ËüÃÇ¿´ÉÏȥûʲô»µ´¦£¬µ«ÊÂʵÉÏ£¬Õâ¶ùÊÇÓÐÏÝÚåµÄ ¨C Èç¹ûÄãÏñÕâÑùÔÚÄ£¿éÖÐʹÓà Logger£¬Python »á±£Áô´ÓÎļþÖжÁÈëÅäÖÃǰËùÓд´½¨µÄËùÓÐ logger¡£

import logging
logger = logging.getLogger(__name__)
def foo():
logger.info('Hi, foo')
class Bar(object):
def bar(self):
logger.info('Hi, bar')
main.py
import logging

logger = logging.getLogger(__name__)

def foo():
logger.info('Hi, foo')

class Bar(object):
def bar(self):
logger.info('Hi, bar')

±¾Ó¦¸ÃÔÚÈÕÖ¾Öп´µ½¼Ç¼£¬µ«ÊÇÄãȴʲôҲûÓп´µ½¡£ÎªÊ²Ã´ÄØ£¿Õâ¾ÍÊÇÒòΪÄãÔÚÄ£¿é²ã´Î´´½¨ÁË logger£¬È»ºóÄãÓÖÔÚ¼ÓÔØÈÕÖ¾ÅäÖÃÎļþ֮ǰ¾Íµ¼ÈëÁËÄ£¿é¡£logging.fileConfig Óë logging.dictConfig ĬÈÏÇé¿öÏ»áʹµÃÒѾ­´æÔÚµÄ logger ʧЧ¡£ËùÒÔ£¬ÕâЩÅäÖÃÐÅÏ¢²»»áÓ¦Óõ½ÄãµÄ Logger ÉÏ¡£Äã×îºÃÖ»ÔÚÄãÐèÒª logger µÄʱºò²Å»ñµÃËü¡£·´Õý´´½¨»òÕßÈ¡µÃ logger µÄ³É±¾ºÜµÍ¡£Äã¿ÉÒÔÕâÑùдÄãµÄ´úÂ룺

import logging

def foo():
logger = logging.getLogger(__name__)
logger.info('Hi, foo')

class Bar(object):
def __init__(self, logger=None):
self.logger = logger or logging.getLogger(__name__)

def bar(self):
self.logger.info('Hi, bar')

ÕâÑù£¬logger ¾Í»áÔÚÄã¼ÓÔØÅäÖúó²Å»á±»´´½¨¡£ÕâÑùÅäÖÃÐÅÏ¢¾Í¿ÉÒÔÕý³£Ó¦Óá£

python2.7 Ö®ºóµÄ°æ±¾ÖÐ fileConfg Óë dictConfig ¶¼ÐÂÌí¼ÓÁË ¡°disable_existing_loggers¡± ²ÎÊý£¬½«ÆäÉèÖÃΪ False£¬ÉÏÃæÌáµ½µÄÎÊÌâ¾Í¿ÉÒÔ½â¾öÁË¡£ÀýÈ磺

8¡¢Ê¹ÓÃÐýתÎļþ¾ä±ú

Èç¹ûÄãÓà FileHandler дÈÕÖ¾£¬ÎļþµÄ´óС»áËæ×Åʱ¼äÍÆÒÆ¶ø²»¶ÏÔö´ó¡£×îÖÕÓÐÒ»ÌìËü»áÕ¼ÂúÄãËùÓеĴÅÅ̿ռ䡣ΪÁ˱ÜÃâÕâÖÖÇé¿ö³öÏÖ£¬Äã¿ÉÒÔÔÚÄãµÄÉú³É»·¾³ÖÐʹÓà RotatingFileHandler Ìæ´ú FileHandler¡£

9¡¢Èç¹ûÄãÓжà¸ö·þÎñÆ÷¿ÉÒÔÆôÓÃÒ»¸öרÓõÄÈÕÖ¾·þÎñÆ÷

µ±ÄãÓжà¸ö·þÎñÆ÷ºÍ²»Í¬µÄÈÕÖ¾Îļþʱ£¬Äã¿ÉÒÔ´´½¨Ò»¸ö¼¯ÖÐʽµÄÈÕ־ϵͳÀ´ÊÕ¼¯ÖØÒªµÄ£¨´ó¶àÊýÇé¿öÊǾ¯¸æ»òÕß´íÎóÏûÏ¢£©ÐÅÏ¢¡£È»ºóͨ¹ý¼à²âÕâЩÈÕÖ¾ÐÅÏ¢£¬Äã¾Í¿ÉÒÔºÜÈÝÒ׵ط¢ÏÖϵͳÖеÄÎÊÌâÁË¡£

10¡¢×ܽá

Python µÄÈÕÖ¾¿âÉè¼ÆµÃÈç´ËÖ®ºÃ£¬ÕæÊÇÈÃÈËÐÀÎÒ¾õµÃÕâÊDZê×¼¿âÖÐ×îºÃµÄÒ»²¿·ÖÁË£¬Äã²»µÃ²»Ñ¡ÔñËü¡£ËüºÜÁé»î£¬Äã¿ÉÒÔÓÃÄã×Ô¼ºµÄ handler »òÕß filter¡£ÒѾ­ÓкܶàµÄµÚÈý·½µÄ handler ÁË£¬±ÈÈç pyzmq ÌṩµÄ ZeroMQ ÈÕÖ¾¾ä±ú£¬ËüÔÊÐíÄãͨ¹ý zmq Ì×½Ó×Ö·¢ËÍÈÕÖ¾ÏûÏ¢¡£Èç¹ûÄ㻹²»ÖªµÀÔõôÕýÈ·µÄʹÓÃÈÕ־ϵͳ£¬ÕâÆªÎÄÕ½«»á·Ç³£ÓÐÓá£ÓÐÁ˺ܺõÄÈÕÖ¾¼Ç¼ʵ¼ù£¬Äã¾ÍÄܷdz£ÈÝÒ׵ط¢ÏÖϵͳÖеÄÎÊÌâ¡£ÕâÊǺܷdz£ÖµµÃͶ×ʵġ£:)

ÈÕ־ģ¿éʹÓÃ×ܽ᣺

1¡¢¼ÓÔØloggingÄ£¿é
2¡¢´´½¨Ò»¸ölogger,²¢ÉèÖÃserviceÓû§¼Ç¼ÈÕÖ¾
logger = logging.getLogger("service"),ʹÓÃ%(name)s¼Ç¼
3¡¢ÉèÖÃlogger¼¶±ð
logger.setLevel(logging.DEBUG)
4¡¢´´½¨Ò»¸öhandler£¬ÈÕÖ¾Á÷Ïò£¨Îļþ»ò¿ØÖÆÌ¨£¬Ä¬ÈÏÊÇ¿ØÖÆÌ¨£©
# ´´½¨Ò»¸öhandler£¬ÓÃÓÚдÈëÈÕÖ¾Îļþ
fh = logging.FileHandler('access.log')
# ÔÙ´´½¨Ò»¸öhandler£¬ÓÃÓÚÊä³öµ½¿ØÖÆÌ¨
ch = logging.StreamHandler()
5¡¢# ¶¨ÒåhandlerµÄÊä³ö¸ñʽformatter
formatter = logging.Formatter('%(asctime)s - %(filename)s[line:%(lineno)d] - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
ch.setFormatter(formatter)
6¡¢¸øloggerÌí¼Óhandler
logger.addHandler(fh)
logger.addHandler(ch)
7¡¢¼Ç¼һÌõÈÕÖ¾
logger.debug('logger debug message')
logger.info('logger info message')
logger.warning('logger warning message')
logger.error('logger error message')
logger.critical('logger critical message')
 
   
2062 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

DevOpsתÐÍÈÚÈëµ½ÆóÒµÎÄ»¯
DevOps ÄÜÁ¦Ä£ÐÍ¡¢Ñݽø¼°°¸ÀýÆÊÎö
»ùÓÚ DevOps ÀíÄîµÄ˽ÓÐ PaaS ƽ̨ʵ¼ù
΢Èí¿ª·¢ÍŶӵÄDevOpsʵ¼ùÆôʾ
Ïà¹ØÎĵµ

DevOpsÇý¶¯Ó¦ÓÃÔËά±ä¸ïÓë´´ÐÂ
ÔËά¹ÜÀí¹æ»®
ÈçºÎʵÏÖÆóÒµÓ¦Óò¿Êð×Ô¶¯»¯
ÔËά×Ô¶¯»¯Êµ¼ù֮·
Ïà¹Ø¿Î³Ì

×Ô¶¯»¯ÔËά¹¤¾ß£¨»ùÓÚDevOps£©
»¥ÁªÍøÔËάÓëDevOps
MySQLÐÔÄÜÓÅ»¯¼°ÔËάÅàѵ
ITϵͳÔËά¹ÜÀí