±à¼ÍƼö: |
±¾ÎÄÀ´Ô´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') |
|