用於便捷記錄日誌且線程安全的模塊html
1 import logging 2 logging.debug('debug message') 3 logging.info('info message') 4 logging.warning('warning message') 5 logging.error('error message') 6 logging.critical('critical message')
輸出結果:python
可見,默認狀況下python的logging模塊將日誌打印到了標準輸出中,且只顯示了大於等於WARNING級別的日誌,這說明默認的日誌級別設置爲WARNING(日誌級別等級CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET),
默認的日誌格式爲:安全
日誌級別:Logger名稱:用戶輸出消息。服務器
1 #!/usr/bin/env python 2 #-*- coding:utf-8 -*- 3 4 import logging 5 #日誌級別,日誌格式,日期格式,日誌名稱,寫方式,分爲a和w 6 logging.basicConfig(level=logging.DEBUG, 7 format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', 8 datefmt= '%a, %d %b %Y %H:%M:%S', 9 filename= 'log123.log', 10 filemode = 'w') 11 12 logging.debug('debug message') 13 logging.info('info message') 14 logging.warning('warning message') 15 logging.error('error message') 16 logging.critical('critical message')
輸出結果:網絡
Thu, 16 Jun 2016 10:04:03 s6.py[line:13] DEBUG debug message Thu, 16 Jun 2016 10:04:03 s6.py[line:14] INFO info message Thu, 16 Jun 2016 10:04:03 s6.py[line:15] WARNING warning message Thu, 16 Jun 2016 10:04:03 s6.py[line:16] ERROR error message Thu, 16 Jun 2016 10:04:03 s6.py[line:17] CRITICAL critical message
可見在logging.basicConfig()函數中可經過具體參數來更改logging模塊默認行爲,可用參數有:app
format參數中可能用到的格式化串:ide
上述幾個例子中咱們瞭解到了logging.debug()、logging.info()、logging.warning()、logging.error()、logging.critical()(分別用以記錄不一樣級別的日誌信息),logging.basicConfig()(用默認日誌格式(Formatter)爲日誌系統創建一個默認的流處理器(StreamHandler),設置基礎配置(如日誌級別等)並加到root logger(根Logger)中)這幾個logging模塊級別的函數,另外還有一個模塊級別的函數是logging.getLogger([name])(返回一個logger對象,若是沒有指定名字將返回root logger)。函數
1 #coding:utf-8 2 import logging 3 4 # 建立一個logger 5 logger = logging.getLogger() 6 7 logger1 = logging.getLogger('mylogger') 8 logger1.setLevel(logging.DEBUG) 9 10 logger2 = logging.getLogger('mylogger') 11 logger2.setLevel(logging.INFO) 12 13 logger3 = logging.getLogger('mylogger.child1') 14 logger3.setLevel(logging.WARNING) 15 16 logger4 = logging.getLogger('mylogger.child1.child2') 17 logger4.setLevel(logging.DEBUG) 18 19 logger5 = logging.getLogger('mylogger.child1.child2.child3') 20 logger5.setLevel(logging.DEBUG) 21 22 # 建立一個handler,用於寫入日誌文件 23 fh = logging.FileHandler('/tmp/test.log') 24 25 # 再建立一個handler,用於輸出到控制檯 26 ch = logging.StreamHandler() 27 28 # 定義handler的輸出格式formatter 29 formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') 30 fh.setFormatter(formatter) 31 ch.setFormatter(formatter) 32 33 #定義一個filter 34 #filter = logging.Filter('mylogger.child1.child2') 35 #fh.addFilter(filter) 36 37 # 給logger添加handler 38 #logger.addFilter(filter) 39 logger.addHandler(fh) 40 logger.addHandler(ch) 41 42 #logger1.addFilter(filter) 43 logger1.addHandler(fh) 44 logger1.addHandler(ch) 45 46 logger2.addHandler(fh) 47 logger2.addHandler(ch) 48 49 #logger3.addFilter(filter) 50 logger3.addHandler(fh) 51 logger3.addHandler(ch) 52 53 #logger4.addFilter(filter) 54 logger4.addHandler(fh) 55 logger4.addHandler(ch) 56 57 logger5.addHandler(fh) 58 logger5.addHandler(ch) 59 60 # 記錄一條日誌 61 logger.debug('logger debug message') 62 logger.info('logger info message') 63 logger.warning('logger warning message') 64 logger.error('logger error message') 65 logger.critical('logger critical message') 66 67 logger1.debug('logger1 debug message') 68 logger1.info('logger1 info message') 69 logger1.warning('logger1 warning message') 70 logger1.error('logger1 error message') 71 logger1.critical('logger1 critical message') 72 73 logger2.debug('logger2 debug message') 74 logger2.info('logger2 info message') 75 logger2.warning('logger2 warning message') 76 logger2.error('logger2 error message') 77 logger2.critical('logger2 critical message') 78 79 logger3.debug('logger3 debug message') 80 logger3.info('logger3 info message') 81 logger3.warning('logger3 warning message') 82 logger3.error('logger3 error message') 83 logger3.critical('logger3 critical message') 84 85 logger4.debug('logger4 debug message') 86 logger4.info('logger4 info message') 87 logger4.warning('logger4 warning message') 88 logger4.error('logger4 error message') 89 logger4.critical('logger4 critical message') 90 91 logger5.debug('logger5 debug message') 92 logger5.info('logger5 info message') 93 logger5.warning('logger5 warning message') 94 logger5.error('logger5 error message') 95 logger5.critical('logger5 critical message')
2016-06-16 10:26:24,263 - root - WARNING - logger warning message 2016-06-16 10:26:24,263 - root - ERROR - logger error message 2016-06-16 10:26:24,263 - root - CRITICAL - logger critical message 2016-06-16 10:26:24,263 - mylogger - INFO - logger1 info message 2016-06-16 10:26:24,263 - mylogger - INFO - logger1 info message 2016-06-16 10:26:24,263 - mylogger - WARNING - logger1 warning message 2016-06-16 10:26:24,263 - mylogger - WARNING - logger1 warning message 2016-06-16 10:26:24,263 - mylogger - ERROR - logger1 error message 2016-06-16 10:26:24,263 - mylogger - ERROR - logger1 error message 2016-06-16 10:26:24,263 - mylogger - CRITICAL - logger1 critical message 2016-06-16 10:26:24,263 - mylogger - CRITICAL - logger1 critical message 2016-06-16 10:26:24,263 - mylogger - INFO - logger2 info message 2016-06-16 10:26:24,263 - mylogger - INFO - logger2 info message 2016-06-16 10:26:24,263 - mylogger - WARNING - logger2 warning message 2016-06-16 10:26:24,263 - mylogger - WARNING - logger2 warning message 2016-06-16 10:26:24,263 - mylogger - ERROR - logger2 error message 2016-06-16 10:26:24,263 - mylogger - ERROR - logger2 error message 2016-06-16 10:26:24,265 - mylogger - CRITICAL - logger2 critical message 2016-06-16 10:26:24,265 - mylogger - CRITICAL - logger2 critical message 2016-06-16 10:26:24,265 - mylogger.child1 - WARNING - logger3 warning message 2016-06-16 10:26:24,265 - mylogger.child1 - WARNING - logger3 warning message 2016-06-16 10:26:24,265 - mylogger.child1 - WARNING - logger3 warning message 2016-06-16 10:26:24,265 - mylogger.child1 - ERROR - logger3 error message 2016-06-16 10:26:24,265 - mylogger.child1 - ERROR - logger3 error message 2016-06-16 10:26:24,265 - mylogger.child1 - ERROR - logger3 error message 2016-06-16 10:26:24,265 - mylogger.child1 - CRITICAL - logger3 critical message 2016-06-16 10:26:24,265 - mylogger.child1 - CRITICAL - logger3 critical message 2016-06-16 10:26:24,265 - mylogger.child1 - CRITICAL - logger3 critical message 2016-06-16 10:26:24,265 - mylogger.child1.child2 - DEBUG - logger4 debug message 2016-06-16 10:26:24,265 - mylogger.child1.child2 - DEBUG - logger4 debug message 2016-06-16 10:26:24,265 - mylogger.child1.child2 - DEBUG - logger4 debug message 2016-06-16 10:26:24,265 - mylogger.child1.child2 - DEBUG - logger4 debug message 2016-06-16 10:26:24,265 - mylogger.child1.child2 - INFO - logger4 info message 2016-06-16 10:26:24,265 - mylogger.child1.child2 - INFO - logger4 info message 2016-06-16 10:26:24,265 - mylogger.child1.child2 - INFO - logger4 info message 2016-06-16 10:26:24,265 - mylogger.child1.child2 - INFO - logger4 info message 2016-06-16 10:26:24,265 - mylogger.child1.child2 - WARNING - logger4 warning message 2016-06-16 10:26:24,265 - mylogger.child1.child2 - WARNING - logger4 warning message 2016-06-16 10:26:24,265 - mylogger.child1.child2 - WARNING - logger4 warning message 2016-06-16 10:26:24,265 - mylogger.child1.child2 - WARNING - logger4 warning message 2016-06-16 10:26:24,266 - mylogger.child1.child2 - ERROR - logger4 error message 2016-06-16 10:26:24,266 - mylogger.child1.child2 - ERROR - logger4 error message 2016-06-16 10:26:24,266 - mylogger.child1.child2 - ERROR - logger4 error message 2016-06-16 10:26:24,266 - mylogger.child1.child2 - ERROR - logger4 error message 2016-06-16 10:26:24,266 - mylogger.child1.child2 - CRITICAL - logger4 critical message 2016-06-16 10:26:24,266 - mylogger.child1.child2 - CRITICAL - logger4 critical message 2016-06-16 10:26:24,266 - mylogger.child1.child2 - CRITICAL - logger4 critical message 2016-06-16 10:26:24,266 - mylogger.child1.child2 - CRITICAL - logger4 critical message 2016-06-16 10:26:24,266 - mylogger.child1.child2.child3 - DEBUG - logger5 debug message 2016-06-16 10:26:24,266 - mylogger.child1.child2.child3 - DEBUG - logger5 debug message 2016-06-16 10:26:24,266 - mylogger.child1.child2.child3 - DEBUG - logger5 debug message 2016-06-16 10:26:24,266 - mylogger.child1.child2.child3 - DEBUG - logger5 debug message 2016-06-16 10:26:24,266 - mylogger.child1.child2.child3 - DEBUG - logger5 debug message 2016-06-16 10:26:24,266 - mylogger.child1.child2.child3 - INFO - logger5 info message 2016-06-16 10:26:24,266 - mylogger.child1.child2.child3 - INFO - logger5 info message 2016-06-16 10:26:24,266 - mylogger.child1.child2.child3 - INFO - logger5 info message 2016-06-16 10:26:24,266 - mylogger.child1.child2.child3 - INFO - logger5 info message 2016-06-16 10:26:24,266 - mylogger.child1.child2.child3 - INFO - logger5 info message 2016-06-16 10:26:24,266 - mylogger.child1.child2.child3 - WARNING - logger5 warning message 2016-06-16 10:26:24,266 - mylogger.child1.child2.child3 - WARNING - logger5 warning message 2016-06-16 10:26:24,266 - mylogger.child1.child2.child3 - WARNING - logger5 warning message 2016-06-16 10:26:24,266 - mylogger.child1.child2.child3 - WARNING - logger5 warning message 2016-06-16 10:26:24,266 - mylogger.child1.child2.child3 - WARNING - logger5 warning message 2016-06-16 10:26:24,266 - mylogger.child1.child2.child3 - ERROR - logger5 error message 2016-06-16 10:26:24,266 - mylogger.child1.child2.child3 - ERROR - logger5 error message 2016-06-16 10:26:24,266 - mylogger.child1.child2.child3 - ERROR - logger5 error message 2016-06-16 10:26:24,266 - mylogger.child1.child2.child3 - ERROR - logger5 error message 2016-06-16 10:26:24,266 - mylogger.child1.child2.child3 - ERROR - logger5 error message 2016-06-16 10:26:24,266 - mylogger.child1.child2.child3 - CRITICAL - logger5 critical message 2016-06-16 10:26:24,266 - mylogger.child1.child2.child3 - CRITICAL - logger5 critical message 2016-06-16 10:26:24,266 - mylogger.child1.child2.child3 - CRITICAL - logger5 critical message 2016-06-16 10:26:24,266 - mylogger.child1.child2.child3 - CRITICAL - logger5 critical message 2016-06-16 10:26:24,266 - mylogger.child1.child2.child3 - CRITICAL - logger5 critical message
Logger 對象提供應用程序可直接使用的接口,
Handler 發送日誌到適當的目的地,
Filter 提供了過濾日誌信息的方法,
Formatter 指定日誌顯示格式。ui
實例1:(一個具體例子的內容截取)this
Logger是一個樹形層級結構,輸出信息以前都要得到一個Logger(若是沒有顯示的獲取則自動建立並使用root Logger,如第一個例子所示)。
logger = logging.getLogger()返回一個默認的Logger也即root Logger,並應用默認的日誌級別、Handler和Formatter設置。
經過Logger.setLevel(lel)指定最低的日誌級別,可用的日誌級別有:logging.DEBUG、logging.INFO、logging.WARNING、logging.ERROR、logging.CRITICAL。Logger.debug()、Logger.info()、Logger.warning()、Logger.error()、Logger.critical()輸出不一樣級別的日誌,只有日誌等級大於或等於設置的日誌級別的日誌纔會被輸出。
1 logger.debug('logger debug message') 2 logger.info('logger info message') 3 logger.warning('logger warning message') 4 logger.error('logger error message') 5 logger.critical('logger critical message')
結果1:
2016-06-16 10:26:24,263 - root - WARNING - logger warning message 2016-06-16 10:26:24,263 - root - ERROR - logger error message 2016-06-16 10:26:24,263 - root - CRITICAL - logger critical message
結論1:
從這個輸出能夠看出logger = logging.getLogger()返回的Logger名爲root。這裏沒有用logger.setLevel()顯示的爲logger設置日誌級別,因此使用默認的日誌級別WARNIING,故結果只輸出了大於等於WARNIING級別的信息。
實例2:(一個具體例子的內容截取)
咱們明明經過logger1.setLevel(logging.DEBUG)將logger1的日誌級別設置爲了DEBUG,爲什麼顯示的時候沒有顯示出DEBUG級別的日誌信息,而是從INFO級別的日誌開始顯示呢?
1 logger1 = logging.getLogger('mylogger') 2 logger1.setLevel(logging.DEBUG) 3 4 logger2 = logging.getLogger('mylogger') 5 logger2.setLevel(logging.INFO)
結果2:
2016-06-16 10:26:24,263 - mylogger - INFO - logger1 info message 2016-06-16 10:26:24,263 - mylogger - INFO - logger1 info message 2016-06-16 10:26:24,263 - mylogger - WARNING - logger1 warning message 2016-06-16 10:26:24,263 - mylogger - WARNING - logger1 warning message 2016-06-16 10:26:24,263 - mylogger - ERROR - logger1 error message 2016-06-16 10:26:24,263 - mylogger - ERROR - logger1 error message 2016-06-16 10:26:24,263 - mylogger - CRITICAL - logger1 critical message 2016-06-16 10:26:24,263 - mylogger - CRITICAL - logger1 critical message 2016-06-16 10:26:24,263 - mylogger - INFO - logger2 info message 2016-06-16 10:26:24,263 - mylogger - INFO - logger2 info message 2016-06-16 10:26:24,263 - mylogger - WARNING - logger2 warning message 2016-06-16 10:26:24,263 - mylogger - WARNING - logger2 warning message 2016-06-16 10:26:24,263 - mylogger - ERROR - logger2 error message 2016-06-16 10:26:24,263 - mylogger - ERROR - logger2 error message 2016-06-16 10:26:24,265 - mylogger - CRITICAL - logger2 critical message 2016-06-16 10:26:24,265 - mylogger - CRITICAL - logger2 critical message
結論2:
原 來logger1和logger2對應的是同一個Logger實例,只要logging.getLogger(name)中名稱參數name相同則返回的 Logger實例就是同一個,且僅有一個,也即name與Logger實例一一對應。在logger2實例中經過 logger2.setLevel(logging.INFO)設置mylogger的日誌級別爲logging.INFO,因此最後logger1的輸 出聽從了後來設置的日誌級別。
實例3:(一個具體例子的內容截取)
爲何logger一、logger2對應的每一個輸出分別顯示兩次,logger3對應的輸出顯示3次,logger4對應的輸出顯示4次......呢?
1 logger1 = logging.getLogger('mylogger') 2 logger1.setLevel(logging.DEBUG) 3 4 logger2 = logging.getLogger('mylogger') 5 logger2.setLevel(logging.INFO) 6 7 logger3 = logging.getLogger('mylogger.child1') 8 logger3.setLevel(logging.WARNING) 9 10 logger4 = logging.getLogger('mylogger.child1.child2') 11 logger4.setLevel(logging.DEBUG)
結果3:
2016-06-16 10:26:24,263 - mylogger - INFO - logger1 info message 2016-06-16 10:26:24,263 - mylogger - INFO - logger1 info message 2016-06-16 10:26:24,263 - mylogger - WARNING - logger1 warning message 2016-06-16 10:26:24,263 - mylogger - WARNING - logger1 warning message 2016-06-16 10:26:24,263 - mylogger - ERROR - logger1 error message 2016-06-16 10:26:24,263 - mylogger - ERROR - logger1 error message 2016-06-16 10:26:24,263 - mylogger - CRITICAL - logger1 critical message 2016-06-16 10:26:24,263 - mylogger - CRITICAL - logger1 critical message 2016-06-16 10:26:24,263 - mylogger - INFO - logger2 info message 2016-06-16 10:26:24,263 - mylogger - INFO - logger2 info message 2016-06-16 10:26:24,263 - mylogger - WARNING - logger2 warning message 2016-06-16 10:26:24,263 - mylogger - WARNING - logger2 warning message 2016-06-16 10:26:24,263 - mylogger - ERROR - logger2 error message 2016-06-16 10:26:24,263 - mylogger - ERROR - logger2 error message 2016-06-16 10:26:24,265 - mylogger - CRITICAL - logger2 critical message 2016-06-16 10:26:24,265 - mylogger - CRITICAL - logger2 critical message 2016-06-16 10:26:24,265 - mylogger.child1 - WARNING - logger3 warning message 2016-06-16 10:26:24,265 - mylogger.child1 - WARNING - logger3 warning message 2016-06-16 10:26:24,265 - mylogger.child1 - WARNING - logger3 warning message 2016-06-16 10:26:24,265 - mylogger.child1 - ERROR - logger3 error message 2016-06-16 10:26:24,265 - mylogger.child1 - ERROR - logger3 error message 2016-06-16 10:26:24,265 - mylogger.child1 - ERROR - logger3 error message 2016-06-16 10:26:24,265 - mylogger.child1 - CRITICAL - logger3 critical message 2016-06-16 10:26:24,265 - mylogger.child1 - CRITICAL - logger3 critical message 2016-06-16 10:26:24,265 - mylogger.child1 - CRITICAL - logger3 critical message 2016-06-16 10:26:24,265 - mylogger.child1.child2 - DEBUG - logger4 debug message 2016-06-16 10:26:24,265 - mylogger.child1.child2 - DEBUG - logger4 debug message 2016-06-16 10:26:24,265 - mylogger.child1.child2 - DEBUG - logger4 debug message 2016-06-16 10:26:24,265 - mylogger.child1.child2 - DEBUG - logger4 debug message 2016-06-16 10:26:24,265 - mylogger.child1.child2 - INFO - logger4 info message 2016-06-16 10:26:24,265 - mylogger.child1.child2 - INFO - logger4 info message 2016-06-16 10:26:24,265 - mylogger.child1.child2 - INFO - logger4 info message 2016-06-16 10:26:24,265 - mylogger.child1.child2 - INFO - logger4 info message 2016-06-16 10:26:24,265 - mylogger.child1.child2 - WARNING - logger4 warning message 2016-06-16 10:26:24,265 - mylogger.child1.child2 - WARNING - logger4 warning message 2016-06-16 10:26:24,265 - mylogger.child1.child2 - WARNING - logger4 warning message 2016-06-16 10:26:24,265 - mylogger.child1.child2 - WARNING - logger4 warning message 2016-06-16 10:26:24,266 - mylogger.child1.child2 - ERROR - logger4 error message 2016-06-16 10:26:24,266 - mylogger.child1.child2 - ERROR - logger4 error message 2016-06-16 10:26:24,266 - mylogger.child1.child2 - ERROR - logger4 error message 2016-06-16 10:26:24,266 - mylogger.child1.child2 - ERROR - logger4 error message 2016-06-16 10:26:24,266 - mylogger.child1.child2 - CRITICAL - logger4 critical message 2016-06-16 10:26:24,266 - mylogger.child1.child2 - CRITICAL - logger4 critical message 2016-06-16 10:26:24,266 - mylogger.child1.child2 - CRITICAL - logger4 critical message 2016-06-16 10:26:24,266 - mylogger.child1.child2 - CRITICAL - logger4 critical message
結論3:
logger = logging.getLogger()顯示的建立了root Logger,
logger1 = logging.getLogger('mylogger')建立了root Logger的孩子(root.)mylogger,
logger2一樣。
logger3 = logging.getLogger('mylogger.child1')建立了(root.)mylogger.child1
logger4 = logging.getLogger('mylogger.child1.child2')建立了(root.)mylogger.child1.child2
logger5 = logging.getLogger('mylogger.child1.child2.child3')建立了(root.)mylogger.child1.child2.child3
而孩子,孫子,重孫……既會將消息分發給他的handler進行處理也會傳遞給全部的祖先Logger處理。
孩子,孫子,重孫……可逐層繼承來自祖先的日誌級別、Handler、Filter設置,
也能夠經過Logger.setLevel(lel)、Logger.addHandler(hdlr)、Logger.removeHandler(hdlr)、Logger.addFilter(filt)、Logger.removeFilter(filt)。
設置本身特別的日誌級別、Handler、Filter。若不設置則使用繼承來的值。
上述例子的輸出在標準輸出和指定的日誌文件中都可以看到,這是由於咱們定義並使用了兩種Handler。
1 #建立一個handler,用於寫入日誌文件 2 fh = logging.FileHandler('log456.log') 3 4 #在建立一個handler,用於輸出到控制檯 5 ch = logging.StreamHandler()
Handler對象負責發送相關的信息到指定目的地,有幾個經常使用的Handler方法:
Handler.setLevel(lel): 指定日誌級別,低於lel級別的日誌將被忽略
Handler.setFormatter(): 給這個handler選擇一個Formatter
Handler.addFilter(filt)、Handler.removeFilter(filt):新增或刪除一個filter對象
能夠經過addHandler()方法爲Logger添加多個Handler:
1 #給logger添加handler 2 3 #logger.addHandler(fh) 4 logger.addHandler(ch)
有多中可用的Handler:
logging.StreamHandler 能夠向相似與sys.stdout或者sys.stderr的任何文件對象(file object)輸出信息
logging.FileHandler 用於向一個文件輸出日誌信息
logging.handlers.RotatingFileHandler 相似於上面的FileHandler,可是它能夠管理文件大小。
當文件達到必定大小以後,它會自動將當前日誌文件更名,而後建立一個新的同名日誌文件繼續輸出
logging.handlers.TimedRotatingFileHandler 和RotatingFileHandler相似,不過,它沒有經過判斷文件大小來決定什麼時候從新建立日誌文件,而是間隔必定時間就自動建立新的日誌文件
logging.handlers.SocketHandler 使用TCP協議,將日誌信息發送到網絡。
logging.handlers.DatagramHandler 使用UDP協議,將日誌信息發送到網絡。
logging.handlers.SysLogHandler 日誌輸出到syslog
logging.handlers.NTEventLogHandler 遠程輸出日誌到Windows NT/2000/XP的事件日誌
logging.handlers.SMTPHandler 遠程輸出日誌到郵件地址
logging.handlers.MemoryHandler 日誌輸出到內存中的制定buffer
logging.handlers.HTTPHandler 經過"GET"或"POST"遠程輸出到HTTP服務器
Formatter對象設置日誌信息最後的規則、結構和內容,默認的時間格式爲%Y-%m-%d %H:%M:%S。
1 #定義handler的輸出格式formatter 2 formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') 3 fh.setFormatter(formatter)#寫入日誌文件應用這個格式 4 ch.setFormatter(formatter)#輸入到控制檯應用這個格式
Formatter參數中可能用到的格式化串參見上文(logging.basicConfig()函數format參數中可能用到的格式化串:)
限制只有知足過濾規則的日誌纔會輸出。好比咱們定義了filter = logging.Filter('a.b.c'),並將這個Filter添加到了一個Handler上,則使用該Handler的Logger中只有名字帶a.b.c前綴的Logger才能輸出其日誌。
1 #定義一個filter 2 filter = logging.Filter('mylogger.child1.child2') 3 fh.addFilter(filter)#這個地方是個文件句柄加的過濾,所以全部文件都受到了影響。
輸出結果:只有知足帶mylogger.child1.child2才被輸出了。
2016-06-17 10:40:47,571 - mylogger.child1.child2 - DEBUG - logger4 debug message 2016-06-17 10:40:47,571 - mylogger.child1.child2 - DEBUG - logger4 debug message 2016-06-17 10:40:47,571 - mylogger.child1.child2 - DEBUG - logger4 debug message 2016-06-17 10:40:47,571 - mylogger.child1.child2 - INFO - logger4 info message 2016-06-17 10:40:47,571 - mylogger.child1.child2 - INFO - logger4 info message 2016-06-17 10:40:47,571 - mylogger.child1.child2 - INFO - logger4 info message 2016-06-17 10:40:47,572 - mylogger.child1.child2 - WARNING - logger4 warning message 2016-06-17 10:40:47,572 - mylogger.child1.child2 - WARNING - logger4 warning message 2016-06-17 10:40:47,572 - mylogger.child1.child2 - WARNING - logger4 warning message 2016-06-17 10:40:47,573 - mylogger.child1.child2 - ERROR - logger4 error message 2016-06-17 10:40:47,573 - mylogger.child1.child2 - ERROR - logger4 error message 2016-06-17 10:40:47,573 - mylogger.child1.child2 - ERROR - logger4 error message 2016-06-17 10:40:47,573 - mylogger.child1.child2 - CRITICAL - logger4 critical message 2016-06-17 10:40:47,573 - mylogger.child1.child2 - CRITICAL - logger4 critical message 2016-06-17 10:40:47,573 - mylogger.child1.child2 - CRITICAL - logger4 critical message 2016-06-17 10:40:47,575 - mylogger.child1.child2.child3 - DEBUG - logger5 debug message 2016-06-17 10:40:47,575 - mylogger.child1.child2.child3 - DEBUG - logger5 debug message 2016-06-17 10:40:47,575 - mylogger.child1.child2.child3 - DEBUG - logger5 debug message 2016-06-17 10:40:47,575 - mylogger.child1.child2.child3 - DEBUG - logger5 debug message 2016-06-17 10:40:47,575 - mylogger.child1.child2.child3 - INFO - logger5 info message 2016-06-17 10:40:47,575 - mylogger.child1.child2.child3 - INFO - logger5 info message 2016-06-17 10:40:47,575 - mylogger.child1.child2.child3 - INFO - logger5 info message 2016-06-17 10:40:47,575 - mylogger.child1.child2.child3 - INFO - logger5 info message 2016-06-17 10:40:47,576 - mylogger.child1.child2.child3 - WARNING - logger5 warning message 2016-06-17 10:40:47,576 - mylogger.child1.child2.child3 - WARNING - logger5 warning message 2016-06-17 10:40:47,576 - mylogger.child1.child2.child3 - WARNING - logger5 warning message 2016-06-17 10:40:47,576 - mylogger.child1.child2.child3 - WARNING - logger5 warning message 2016-06-17 10:40:47,576 - mylogger.child1.child2.child3 - ERROR - logger5 error message 2016-06-17 10:40:47,576 - mylogger.child1.child2.child3 - ERROR - logger5 error message 2016-06-17 10:40:47,576 - mylogger.child1.child2.child3 - ERROR - logger5 error message 2016-06-17 10:40:47,576 - mylogger.child1.child2.child3 - ERROR - logger5 error message 2016-06-17 10:40:47,576 - mylogger.child1.child2.child3 - CRITICAL - logger5 critical message 2016-06-17 10:40:47,576 - mylogger.child1.child2.child3 - CRITICAL - logger5 critical message 2016-06-17 10:40:47,576 - mylogger.child1.child2.child3 - CRITICAL - logger5 critical message 2016-06-17 10:40:47,576 - mylogger.child1.child2.child3 - CRITICAL - logger5 critical message
能夠單獨對某個日誌進行過濾:這樣只有對應的日誌纔會受到影響。
1 logger.addFilter(filter) 2 logger1.addFilter(filter) 3 logger3.addFilter(filter) 4 logger4.addFilter(filter)
實例配置文件:
1 [loggers] 2 keys=root,simpleExample 3 4 [handlers] 5 keys=consoleHandler 6 7 [formatters] 8 keys=simpleFormatter 9 10 [logger_root] 11 level=ERROR 12 handlers=consoleHandler 13 14 [logger_simpleExample] 15 level=DEBUG 16 handlers=consoleHandler 17 qualname=simpleExample 18 propagate=0 19 20 [handler_consoleHandler] 21 class=StreamHandler 22 level=DEBUG 23 formatter=simpleFormatter 24 args=(sys.stdout,) 25 26 [formatter_simpleFormatter] 27 format=%(asctime)s - %(name)s - %(levelname)s - %(message)s 28 datefmt=
實例演示:
#!/usr/bin/env python #-*- coding:utf-8 -*- import logging import logging.config logging.config.fileConfig("logging.conf") # 採用配置文件 # create logger logger = logging.getLogger("simpleExample") logger1 = logging.getLogger('root') # "application" code logger.debug("debug message") logger.info("info message") logger.warn("warn message") logger.error("error message") logger.critical("critical message") logger1.debug("debug message") logger1.info("info message") logger1.warn("warn message") logger1.error("error message") logger1.critical("critical message")
輸出結果:
2016-06-17 11:15:39,845 - simpleExample - DEBUG - debug message 2016-06-17 11:15:39,845 - simpleExample - INFO - info message 2016-06-17 11:15:39,845 - simpleExample - WARNING - warn message 2016-06-17 11:15:39,845 - simpleExample - ERROR - error message 2016-06-17 11:15:39,845 - simpleExample - CRITICAL - critical message 2016-06-17 11:15:39,845 - root - ERROR - error message 2016-06-17 11:15:39,845 - root - CRITICAL - critical message
能夠看出,當用到的logger 是配置中的名字的話,就能夠直接使用不須要在代碼中定義了。
logging模塊保證在同一個python解釋器內,屢次調用logging.getLogger('log_name')都會返回同一個logger實例,即便是在多個模塊的狀況下。
因此典型的多模塊場景下使用logging的方式是在main模塊中配置logging,這個配置會做用於多個的子模塊,
而後在其餘模塊中直接經過getLogger獲取Logger對象便可。
1 #!/usr/bin/env python 2 #-*- coding:utf-8 -*- 3 __author__ = 'wyf' 4 5 import logging #導入logging模塊 6 import logging.config #導入log模塊配置文件 7 8 logging.config.fileConfig('logging.conf')#加載配置文件 9 root_logger = logging.getLogger('root')#引入配置文件的日誌實例 10 root_logger.debug('test root logger...')#輸出日誌 11 12 logger = logging.getLogger('main')#定義一個新的日誌實例 13 logger.info('test main logger')#輸出信息 14 logger.info('start import module \'mod\'...')#輸出信息 15 import mod 16 17 logger.debug('let\'s test mod.testLogger()')#輸出信息 18 mod.testLogger()#調用mod模塊的方法 19 20 root_logger.info('finish test...')
1 #!/usr/bin/env python 2 #-*- coding:utf-8 -*- 3 __author__ = 'wyf' 4 5 import logging 6 import submod 7 8 logger = logging.getLogger('main.mod') 9 logger.info('logger of mod say something...') 10 11 def testLogger(): 12 logger.debug('this is mod.testLogger...') 13 submod.tst()
1 #!/usr/bin/env python 2 #-*- coding:utf-8 -*- 3 __author__ = 'wyf' 4 5 import logging 6 7 logger = logging.getLogger('main.mod.submod') 8 logger.info('logger of submod say something...') 9 10 def tst(): 11 logger.info('this is submod.tst()...')
2016-06-17 11:30:08,352 - root - DEBUG - test root logger... 2016-06-17 11:30:08,354 - main - INFO - test main logger 2016-06-17 11:30:08,354 - main - INFO - start import module 'mod'... 2016-06-17 11:30:08,354 - main.mod.submod - INFO - logger of submod say something... 2016-06-17 11:30:08,354 - main.mod - INFO - logger of mod say something... 2016-06-17 11:30:08,354 - main - DEBUG - let's test mod.testLogger() 2016-06-17 11:30:08,354 - main.mod - DEBUG - this is mod.testLogger... 2016-06-17 11:30:08,354 - main.mod.submod - INFO - this is submod.tst()... 2016-06-17 11:30:08,355 - root - INFO - finish test...
參考文檔:http://blog.chinaunix.net/uid-26000296-id-4372063.html