1. 程式人生 > >[轉載]Python logging模塊詳解

[轉載]Python logging模塊詳解

.html key 文件名 屏幕 輸出 mov say line log

原文地址: http://blog.csdn.net/zyz511919766/article/details/25136485

簡單將日誌打印到屏幕:

[python] view plain copy
  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‘)

輸出:

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

可見,默認情況下Python的logging模塊將日誌打印到了標準輸出中,且只顯示了大於等於WARNING級別的日誌,這說明默認的日誌級別設置為WARNING(日誌級別等級CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET),默認的日誌格式為日誌級別:Logger名稱:用戶輸出消息。


靈活配置日誌級別,日誌格式,輸出位置

[python] view plain copy
  1. import logging
  2. logging.basicConfig(level=logging.DEBUG,
  3. format=‘%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s‘,
  4. datefmt=‘%a, %d %b %Y %H:%M:%S‘,
  5. filename=‘/tmp/test.log‘,
  6. filemode=‘w‘)
  7. logging.debug(‘debug message‘)
  8. logging.info(‘info message‘)
  9. logging.warning(‘warning message‘)
  10. logging.error(‘error message‘)
  11. logging.critical(‘critical message‘)

查看輸出:
cat /tmp/test.log
Mon, 05 May 2014 16:29:53 test_logging.py[line:9] DEBUG debug message
Mon, 05 May 2014 16:29:53 test_logging.py[line:10] INFO info message
Mon, 05 May 2014 16:29:53 test_logging.py[line:11] WARNING warning message
Mon, 05 May 2014 16:29:53 test_logging.py[line:12] ERROR error message
Mon, 05 May 2014 16:29:53 test_logging.py[line:13] CRITICAL critical message

可見在logging.basicConfig()函數中可通過具體參數來更改logging模塊默認行為,可用參數有
filename:用指定的文件名創建FiledHandler(後邊會具體講解handler的概念),這樣日誌會被存儲在指定的文件中。
filemode:文件打開方式,在指定了filename時使用這個參數,默認值為“a”還可指定為“w”。
format:指定handler使用的日誌顯示格式。
datefmt:指定日期時間格式。
level:設置rootlogger(後邊會講解具體概念)的日誌級別
stream:用指定的stream創建StreamHandler。可以指定輸出到sys.stderr,sys.stdout或者文件,默認為sys.stderr。若同時列出了filename和stream兩個參數,則stream參數會被忽略。

format參數中可能用到的格式化串:
%(name)s Logger的名字
%(levelno)s 數字形式的日誌級別
%(levelname)s 文本形式的日誌級別
%(pathname)s 調用日誌輸出函數的模塊的完整路徑名,可能沒有
%(filename)s 調用日誌輸出函數的模塊的文件名
%(module)s 調用日誌輸出函數的模塊名
%(funcName)s 調用日誌輸出函數的函數名
%(lineno)d 調用日誌輸出函數的語句所在的代碼行
%(created)f 當前時間,用UNIX標準的表示時間的浮 點數表示
%(relativeCreated)d 輸出日誌信息時的,自Logger創建以 來的毫秒數
%(asctime)s 字符串形式的當前時間。默認格式是 “2003-07-08 16:49:45,896”。逗號後面的是毫秒
%(thread)d 線程ID。可能沒有
%(threadName)s 線程名。可能沒有
%(process)d 進程ID。可能沒有
%(message)s用戶輸出的消息


若要對logging進行更多靈活的控制有必要了解一下Logger,Handler,Formatter,Filter的概念
上述幾個例子中我們了解到了logging.debug()、logging.info()、logging.warning()、logging.error()、logging.critical()(分別用以記錄不同級別的日誌信息),logging.basicConfig()(用默認日誌格式(Formatter)為日誌系統建立一個默認的流處理器(StreamHandler),設置基礎配置(如日誌級別等)並加到root logger(根Logger)中)這幾個logging模塊級別的函數,另外還有一個模塊級別的函數是logging.getLogger([name])(返回一個logger對象,如果沒有指定名字將返回root logger)

先看一個具體的例子

[python] view plain copy
  1. #coding:utf-8
  2. import logging
  3. # 創建一個logger
  4. logger = logging.getLogger()
  5. logger1 = logging.getLogger(‘mylogger‘)
  6. logger1.setLevel(logging.DEBUG)
  7. logger2 = logging.getLogger(‘mylogger‘)
  8. logger2.setLevel(logging.INFO)
  9. logger3 = logging.getLogger(‘mylogger.child1‘)
  10. logger3.setLevel(logging.WARNING)
  11. logger4 = logging.getLogger(‘mylogger.child1.child2‘)
  12. logger4.setLevel(logging.DEBUG)
  13. logger5 = logging.getLogger(‘mylogger.child1.child2.child3‘)
  14. logger5.setLevel(logging.DEBUG)
  15. # 創建一個handler,用於寫入日誌文件
  16. fh = logging.FileHandler(‘/tmp/test.log‘)
  17. # 再創建一個handler,用於輸出到控制臺
  18. ch = logging.StreamHandler()
  19. # 定義handler的輸出格式formatter
  20. formatter = logging.Formatter(‘%(asctime)s - %(name)s - %(levelname)s - %(message)s‘)
  21. fh.setFormatter(formatter)
  22. ch.setFormatter(formatter)
  23. #定義一個filter
  24. #filter = logging.Filter(‘mylogger.child1.child2‘)
  25. #fh.addFilter(filter)
  26. # 給logger添加handler
  27. #logger.addFilter(filter)
  28. logger.addHandler(fh)
  29. logger.addHandler(ch)
  30. #logger1.addFilter(filter)
  31. logger1.addHandler(fh)
  32. logger1.addHandler(ch)
  33. logger2.addHandler(fh)
  34. logger2.addHandler(ch)
  35. #logger3.addFilter(filter)
  36. logger3.addHandler(fh)
  37. logger3.addHandler(ch)
  38. #logger4.addFilter(filter)
  39. logger4.addHandler(fh)
  40. logger4.addHandler(ch)
  41. logger5.addHandler(fh)
  42. logger5.addHandler(ch)
  43. # 記錄一條日誌
  44. logger.debug(‘logger debug message‘)
  45. logger.info(‘logger info message‘)
  46. logger.warning(‘logger warning message‘)
  47. logger.error(‘logger error message‘)
  48. logger.critical(‘logger critical message‘)
  49. logger1.debug(‘logger1 debug message‘)
  50. logger1.info(‘logger1 info message‘)
  51. logger1.warning(‘logger1 warning message‘)
  52. logger1.error(‘logger1 error message‘)
  53. logger1.critical(‘logger1 critical message‘)
  54. logger2.debug(‘logger2 debug message‘)
  55. logger2.info(‘logger2 info message‘)
  56. logger2.warning(‘logger2 warning message‘)
  57. logger2.error(‘logger2 error message‘)
  58. logger2.critical(‘logger2 critical message‘)
  59. logger3.debug(‘logger3 debug message‘)
  60. logger3.info(‘logger3 info message‘)
  61. logger3.warning(‘logger3 warning message‘)
  62. logger3.error(‘logger3 error message‘)
  63. logger3.critical(‘logger3 critical message‘)
  64. logger4.debug(‘logger4 debug message‘)
  65. logger4.info(‘logger4 info message‘)
  66. logger4.warning(‘logger4 warning message‘)
  67. logger4.error(‘logger4 error message‘)
  68. logger4.critical(‘logger4 critical message‘)
  69. logger5.debug(‘logger5 debug message‘)
  70. logger5.info(‘logger5 info message‘)
  71. logger5.warning(‘logger5 warning message‘)
  72. logger5.error(‘logger5 error message‘)
  73. logger5.critical(‘logger5 critical message‘)

輸出:
2014-05-06 12:54:43,222 - root - WARNING - logger warning message
2014-05-06 12:54:43,223 - root - ERROR - logger error message
2014-05-06 12:54:43,224 - root - CRITICAL - logger critical message
2014-05-06 12:54:43,224 - mylogger - INFO - logger1 info message
2014-05-06 12:54:43,224 - mylogger - INFO - logger1 info message
2014-05-06 12:54:43,225 - mylogger - WARNING - logger1 warning message
2014-05-06 12:54:43,225 - mylogger - WARNING - logger1 warning message
2014-05-06 12:54:43,226 - mylogger - ERROR - logger1 error message
2014-05-06 12:54:43,226 - mylogger - ERROR - logger1 error message
2014-05-06 12:54:43,227 - mylogger - CRITICAL - logger1 critical message
2014-05-06 12:54:43,227 - mylogger - CRITICAL - logger1 critical message
2014-05-06 12:54:43,228 - mylogger - INFO - logger2 info message
2014-05-06 12:54:43,228 - mylogger - INFO - logger2 info message
2014-05-06 12:54:43,229 - mylogger - WARNING - logger2 warning message
2014-05-06 12:54:43,229 - mylogger - WARNING - logger2 warning message
2014-05-06 12:54:43,230 - mylogger - ERROR - logger2 error message
2014-05-06 12:54:43,230 - mylogger - ERROR - logger2 error message
2014-05-06 12:54:43,231 - mylogger - CRITICAL - logger2 critical message
2014-05-06 12:54:43,231 - mylogger - CRITICAL - logger2 critical message
2014-05-06 12:54:43,232 - mylogger.child1 - WARNING - logger3 warning message
2014-05-06 12:54:43,232 - mylogger.child1 - WARNING - logger3 warning message
2014-05-06 12:54:43,232 - mylogger.child1 - WARNING - logger3 warning message
2014-05-06 12:54:43,234 - mylogger.child1 - ERROR - logger3 error message
2014-05-06 12:54:43,234 - mylogger.child1 - ERROR - logger3 error message
2014-05-06 12:54:43,234 - mylogger.child1 - ERROR - logger3 error message
2014-05-06 12:54:43,235 - mylogger.child1 - CRITICAL - logger3 critical message
2014-05-06 12:54:43,235 - mylogger.child1 - CRITICAL - logger3 critical message
2014-05-06 12:54:43,235 - mylogger.child1 - CRITICAL - logger3 critical message
2014-05-06 12:54:43,237 - mylogger.child1.child2 - DEBUG - logger4 debug message
2014-05-06 12:54:43,237 - mylogger.child1.child2 - DEBUG - logger4 debug message
2014-05-06 12:54:43,237 - mylogger.child1.child2 - DEBUG - logger4 debug message
2014-05-06 12:54:43,237 - mylogger.child1.child2 - DEBUG - logger4 debug message
2014-05-06 12:54:43,239 - mylogger.child1.child2 - INFO - logger4 info message
2014-05-06 12:54:43,239 - mylogger.child1.child2 - INFO - logger4 info message
2014-05-06 12:54:43,239 - mylogger.child1.child2 - INFO - logger4 info message
2014-05-06 12:54:43,239 - mylogger.child1.child2 - INFO - logger4 info message
2014-05-06 12:54:43,240 - mylogger.child1.child2 - WARNING - logger4 warning message
2014-05-06 12:54:43,240 - mylogger.child1.child2 - WARNING - logger4 warning message
2014-05-06 12:54:43,240 - mylogger.child1.child2 - WARNING - logger4 warning message
2014-05-06 12:54:43,240 - mylogger.child1.child2 - WARNING - logger4 warning message
2014-05-06 12:54:43,242 - mylogger.child1.child2 - ERROR - logger4 error message
2014-05-06 12:54:43,242 - mylogger.child1.child2 - ERROR - logger4 error message
2014-05-06 12:54:43,242 - mylogger.child1.child2 - ERROR - logger4 error message
2014-05-06 12:54:43,242 - mylogger.child1.child2 - ERROR - logger4 error message
2014-05-06 12:54:43,243 - mylogger.child1.child2 - CRITICAL - logger4 critical message
2014-05-06 12:54:43,243 - mylogger.child1.child2 - CRITICAL - logger4 critical message
2014-05-06 12:54:43,243 - mylogger.child1.child2 - CRITICAL - logger4 critical message
2014-05-06 12:54:43,243 - mylogger.child1.child2 - CRITICAL - logger4 critical message
2014-05-06 12:54:43,244 - mylogger.child1.child2.child3 - DEBUG - logger5 debug message
2014-05-06 12:54:43,244 - mylogger.child1.child2.child3 - DEBUG - logger5 debug message
2014-05-06 12:54:43,244 - mylogger.child1.child2.child3 - DEBUG - logger5 debug message
2014-05-06 12:54:43,244 - mylogger.child1.child2.child3 - DEBUG - logger5 debug message
2014-05-06 12:54:43,244 - mylogger.child1.child2.child3 - DEBUG - logger5 debug message
2014-05-06 12:54:43,246 - mylogger.child1.child2.child3 - INFO - logger5 info message
2014-05-06 12:54:43,246 - mylogger.child1.child2.child3 - INFO - logger5 info message
2014-05-06 12:54:43,246 - mylogger.child1.child2.child3 - INFO - logger5 info message
2014-05-06 12:54:43,246 - mylogger.child1.child2.child3 - INFO - logger5 info message
2014-05-06 12:54:43,246 - mylogger.child1.child2.child3 - INFO - logger5 info message
2014-05-06 12:54:43,247 - mylogger.child1.child2.child3 - WARNING - logger5 warning message
2014-05-06 12:54:43,247 - mylogger.child1.child2.child3 - WARNING - logger5 warning message
2014-05-06 12:54:43,247 - mylogger.child1.child2.child3 - WARNING - logger5 warning message
2014-05-06 12:54:43,247 - mylogger.child1.child2.child3 - WARNING - logger5 warning message
2014-05-06 12:54:43,247 - mylogger.child1.child2.child3 - WARNING - logger5 warning message
2014-05-06 12:54:43,249 - mylogger.child1.child2.child3 - ERROR - logger5 error message
2014-05-06 12:54:43,249 - mylogger.child1.child2.child3 - ERROR - logger5 error message
2014-05-06 12:54:43,249 - mylogger.child1.child2.child3 - ERROR - logger5 error message
2014-05-06 12:54:43,249 - mylogger.child1.child2.child3 - ERROR - logger5 error message
2014-05-06 12:54:43,249 - mylogger.child1.child2.child3 - ERROR - logger5 error message
2014-05-06 12:54:43,250 - mylogger.child1.child2.child3 - CRITICAL - logger5 critical message
2014-05-06 12:54:43,250 - mylogger.child1.child2.child3 - CRITICAL - logger5 critical message
2014-05-06 12:54:43,250 - mylogger.child1.child2.child3 - CRITICAL - logger5 critical message
2014-05-06 12:54:43,250 - mylogger.child1.child2.child3 - CRITICAL - logger5 critical message
2014-05-06 12:54:43,250 - mylogger.child1.child2.child3 - CRITICAL - logger5 critical message

先簡單介紹一下,logging庫提供了多個組件:Logger、Handler、Filter、Formatter。Logger對象提供應用程序可直接使用的接口,Handler發送日誌到適當的目的地,Filter提供了過濾日誌信息的方法,Formatter指定日誌顯示格式

Logger
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()輸出不同級別的日誌,只有日誌等級大於或等於設置的日誌級別的日誌才會被輸出。

我們看到程序中

[python] view plain copy
  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‘)

只輸出了
2014-05-06 12:54:43,222 - root - WARNING - logger warning message
2014-05-06 12:54:43,223 - root - ERROR - logger error message
2014-05-06 12:54:43,224 - root - CRITICAL - logger critical message
從這個輸出可以看出logger = logging.getLogger()返回的Logger名為root。這裏沒有用logger.setLevel()顯示的為logger設置日誌級別,所以使用默認的日誌級別WARNIING,故結果只輸出了大於等於WARNIING級別的信息。

另外,我們明明通過logger1.setLevel(logging.DEBUG)將logger1的日誌級別設置為了DEBUG,為何顯示的時候沒有顯示出DEBUG級別的日誌信息,而是從INFO級別的日誌開始顯示呢?原來logger1和logger2對應的是同一個Logger實例,只要logging.getLogger(name)中名稱參數name相同則返回的Logger實例就是同一個,且僅有一個,也即name與Logger實例一一對應。在logger2實例中通過logger2.setLevel(logging.INFO)設置mylogger的日誌級別為logging.INFO,所以最後logger1的輸出遵從了後來設置的日誌級別。

[python] view plain copy
  1. logger1 = logging.getLogger(‘mylogger‘)
  2. logger1.setLevel(logging.DEBUG)
  3. logger2 = logging.getLogger(‘mylogger‘)
  4. logger2.setLevel(logging.INFO)

為什麽logger1、logger2對應的每個輸出分別顯示兩次,logger3對應的輸出顯示3次,logger4對應的輸出顯示4次......呢?
這是因為我們通過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處理

試著註釋掉如下一行程序,觀察程序輸出

[python] view plain copy
  1. #logger.addHandler(fh)

發現標準輸出中每條記錄對應兩行(因為root Logger默認使用StreamHandler)
2014-05-06 15:10:10,980 - mylogger - INFO - logger1 info message
2014-05-06 15:10:10,980 - mylogger - INFO - logger1 info message
2014-05-06 15:10:10,981 - mylogger - WARNING - logger1 warning message
2014-05-06 15:10:10,981 - mylogger - WARNING - logger1 warning message
2014-05-06 15:10:10,982 - mylogger - ERROR - logger1 error message
2014-05-06 15:10:10,982 - mylogger - ERROR - logger1 error message
2014-05-06 15:10:10,984 - mylogger - CRITICAL - logger1 critical message
2014-05-06 15:10:10,984 - mylogger - CRITICAL - logger1 critical message
……
而在文件輸出中每條記錄對應一行(因為我們註釋掉了logger.addHandler(fh),沒有對root Logger啟用FileHandler)
2014-05-06 15:10:10,980 - mylogger - INFO - logger1 info message
2014-05-06 15:10:10,981 - mylogger - WARNING - logger1 warning message
2014-05-06 15:10:10,982 - mylogger - ERROR - logger1 error message
2014-05-06 15:10:10,984 - mylogger - CRITICAL - logger1 critical message

孩子,孫子,重孫……可逐層繼承來自祖先的日誌級別、Handler、Filter設置,也可以通過Logger.setLevel(lel)、Logger.addHandler(hdlr)、Logger.removeHandler(hdlr)、Logger.addFilter(filt)、Logger.removeFilter(filt)。設置自己特別的日誌級別、Handler、Filter。若不設置則使用繼承來的值。

Handler
上述例子的輸出在標準輸出和指定的日誌文件中均可以看到,這是因為我們定義並使用了兩種Handler。

[python] view plain copy
  1. fh = logging.FileHandler(‘/tmp/test.log‘)
  2. ch = logging.StreamHandler()

Handler對象負責發送相關的信息到指定目的地,有幾個常用的Handler方法:
Handler.setLevel(lel):指定日誌級別,低於lel級別的日誌將被忽略
Handler.setFormatter():給這個handler選擇一個Formatter
Handler.addFilter(filt)、Handler.removeFilter(filt):新增或刪除一個filter對象

可以通過addHandler()方法為Logger添加多個Handler:

[python] view plain copy
  1. logger.addHandler(fh)
  2. 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服務器
各個Handler的具體用法可查看參考書冊:
https://docs.python.org/2/library/logging.handlers.html#module-logging.handlers


Formatter
Formatter對象設置日誌信息最後的規則、結構和內容,默認的時間格式為%Y-%m-%d %H:%M:%S。

[python] view plain copy
  1. #定義Formatter
  2. formatter = logging.Formatter(‘%(asctime)s - %(name)s - %(levelname)s - %(message)s‘)
  3. #為Handler添加Formatter
  4. fh.setFormatter(formatter)
  5. ch.setFormatter(formatter)

Formatter參數中可能用到的格式化串參見上文(logging.basicConfig()函數format參數中可能用到的格式化串:)

Filter
限制只有滿足過濾規則的日誌才會輸出。
比如我們定義了filter = logging.Filter(‘a.b.c‘),並將這個Filter添加到了一個Handler上,則使用該Handler的Logger中只有名字帶a.b.c前綴的Logger才能輸出其日誌。

取消下列兩行程序的註釋

[python] view plain copy
  1. #filter = logging.Filter(‘mylogger.child1.child2‘)
  2. #fh.addFilter(filter)

標準輸出中輸出結果並沒有發生變化,但日誌文件輸出中只顯示了如下內容:
2014-05-06 15:27:36,227 - mylogger.child1.child2 - DEBUG - logger4 debug message
2014-05-06 15:27:36,227 - mylogger.child1.child2 - DEBUG - logger4 debug message
2014-05-06 15:27:36,227 - mylogger.child1.child2 - DEBUG - logger4 debug message
2014-05-06 15:27:36,227 - mylogger.child1.child2 - DEBUG - logger4 debug message
2014-05-06 15:27:36,228 - mylogger.child1.child2 - INFO - logger4 info message
2014-05-06 15:27:36,228 - mylogger.child1.child2 - INFO - logger4 info message
2014-05-06 15:27:36,228 - mylogger.child1.child2 - INFO - logger4 info message
2014-05-06 15:27:36,228 - mylogger.child1.child2 - INFO - logger4 info message
2014-05-06 15:27:36,230 - mylogger.child1.child2 - WARNING - logger4 warning message
2014-05-06 15:27:36,230 - mylogger.child1.child2 - WARNING - logger4 warning message
2014-05-06 15:27:36,230 - mylogger.child1.child2 - WARNING - logger4 warning message
2014-05-06 15:27:36,230 - mylogger.child1.child2 - WARNING - logger4 warning message
2014-05-06 15:27:36,232 - mylogger.child1.child2 - ERROR - logger4 error message
2014-05-06 15:27:36,232 - mylogger.child1.child2 - ERROR - logger4 error message
2014-05-06 15:27:36,232 - mylogger.child1.child2 - ERROR - logger4 error message
2014-05-06 15:27:36,232 - mylogger.child1.child2 - ERROR - logger4 error message
2014-05-06 15:27:36,233 - mylogger.child1.child2 - CRITICAL - logger4 critical message
2014-05-06 15:27:36,233 - mylogger.child1.child2 - CRITICAL - logger4 critical message
2014-05-06 15:27:36,233 - mylogger.child1.child2 - CRITICAL - logger4 critical message
2014-05-06 15:27:36,233 - mylogger.child1.child2 - CRITICAL - logger4 critical message
2014-05-06 15:27:36,235 - mylogger.child1.child2.child3 - DEBUG - logger5 debug message
2014-05-06 15:27:36,235 - mylogger.child1.child2.child3 - DEBUG - logger5 debug message
2014-05-06 15:27:36,235 - mylogger.child1.child2.child3 - DEBUG - logger5 debug message
2014-05-06 15:27:36,235 - mylogger.child1.child2.child3 - DEBUG - logger5 debug message
2014-05-06 15:27:36,235 - mylogger.child1.child2.child3 - DEBUG - logger5 debug message
2014-05-06 15:27:36,236 - mylogger.child1.child2.child3 - INFO - logger5 info message
2014-05-06 15:27:36,236 - mylogger.child1.child2.child3 - INFO - logger5 info message
2014-05-06 15:27:36,236 - mylogger.child1.child2.child3 - INFO - logger5 info message
2014-05-06 15:27:36,236 - mylogger.child1.child2.child3 - INFO - logger5 info message
2014-05-06 15:27:36,236 - mylogger.child1.child2.child3 - INFO - logger5 info message
2014-05-06 15:27:36,238 - mylogger.child1.child2.child3 - WARNING - logger5 warning message
2014-05-06 15:27:36,238 - mylogger.child1.child2.child3 - WARNING - logger5 warning message
2014-05-06 15:27:36,238 - mylogger.child1.child2.child3 - WARNING - logger5 warning message
2014-05-06 15:27:36,238 - mylogger.child1.child2.child3 - WARNING - logger5 warning message
2014-05-06 15:27:36,238 - mylogger.child1.child2.child3 - WARNING - logger5 warning message
2014-05-06 15:27:36,240 - mylogger.child1.child2.child3 - ERROR - logger5 error message
2014-05-06 15:27:36,240 - mylogger.child1.child2.child3 - ERROR - logger5 error message
2014-05-06 15:27:36,240 - mylogger.child1.child2.child3 - ERROR - logger5 error message
2014-05-06 15:27:36,240 - mylogger.child1.child2.child3 - ERROR - logger5 error message
2014-05-06 15:27:36,240 - mylogger.child1.child2.child3 - ERROR - logger5 error message
2014-05-06 15:27:36,242 - mylogger.child1.child2.child3 - CRITICAL - logger5 critical message
2014-05-06 15:27:36,242 - mylogger.child1.child2.child3 - CRITICAL - logger5 critical message
2014-05-06 15:27:36,242 - mylogger.child1.child2.child3 - CRITICAL - logger5 critical message
2014-05-06 15:27:36,242 - mylogger.child1.child2.child3 - CRITICAL - logger5 critical message
2014-05-06 15:27:36,242 - mylogger.child1.child2.child3 - CRITICAL - logger5 critical message

當然也可以直接給Logger加Filter。若為Handler加Filter則所有使用了該Handler的Logger都會受到影響。而為Logger添加Filter只會影響到自身。
註釋掉

[python] view plain copy
  1. #fh.addFilter(filter)

並取消如下幾行的註釋

[python] view plain copy
  1. #logger.addFilter(filter)
  2. #logger1.addFilter(filter)
  3. #logger3.addFilter(filter)
  4. #logger4.addFilter(filter)

輸出結果
2014-05-06 15:32:10,746 - mylogger.child1.child2 - DEBUG - logger4 debug message
2014-05-06 15:32:10,746 - mylogger.child1.child2 - DEBUG - logger4 debug message
2014-05-06 15:32:10,746 - mylogger.child1.child2 - DEBUG - logger4 debug message
2014-05-06 15:32:10,746 - mylogger.child1.child2 - DEBUG - logger4 debug message
2014-05-06 15:32:10,748 - mylogger.child1.child2 - INFO - logger4 info message
2014-05-06 15:32:10,748 - mylogger.child1.child2 - INFO - logger4 info message
2014-05-06 15:32:10,748 - mylogger.child1.child2 - INFO - logger4 info message
2014-05-06 15:32:10,748 - mylogger.child1.child2 - INFO - logger4 info message
2014-05-06 15:32:10,751 - mylogger.child1.child2 - WARNING - logger4 warning message
2014-05-06 15:32:10,751 - mylogger.child1.child2 - WARNING - logger4 warning message
2014-05-06 15:32:10,751 - mylogger.child1.child2 - WARNING - logger4 warning message
2014-05-06 15:32:10,751 - mylogger.child1.child2 - WARNING - logger4 warning message
2014-05-06 15:32:10,753 - mylogger.child1.child2 - ERROR - logger4 error message
2014-05-06 15:32:10,753 - mylogger.child1.child2 - ERROR - logger4 error message
2014-05-06 15:32:10,753 - mylogger.child1.child2 - ERROR - logger4 error message
2014-05-06 15:32:10,753 - mylogger.child1.child2 - ERROR - logger4 error message
2014-05-06 15:32:10,754 - mylogger.child1.child2 - CRITICAL - logger4 critical message
2014-05-06 15:32:10,754 - mylogger.child1.child2 - CRITICAL - logger4 critical message
2014-05-06 15:32:10,754 - mylogger.child1.child2 - CRITICAL - logger4 critical message
2014-05-06 15:32:10,754 - mylogger.child1.child2 - CRITICAL - logger4 critical message
2014-05-06 15:32:10,755 - mylogger.child1.child2.child3 - DEBUG - logger5 debug message
2014-05-06 15:32:10,755 - mylogger.child1.child2.child3 - DEBUG - logger5 debug message
2014-05-06 15:32:10,755 - mylogger.child1.child2.child3 - DEBUG - logger5 debug message
2014-05-06 15:32:10,755 - mylogger.child1.child2.child3 - DEBUG - logger5 debug message
2014-05-06 15:32:10,755 - mylogger.child1.child2.child3 - DEBUG - logger5 debug message
2014-05-06 15:32:10,757 - mylogger.child1.child2.child3 - INFO - logger5 info message
2014-05-06 15:32:10,757 - mylogger.child1.child2.child3 - INFO - logger5 info message
2014-05-06 15:32:10,757 - mylogger.child1.child2.child3 - INFO - logger5 info message
2014-05-06 15:32:10,757 - mylogger.child1.child2.child3 - INFO - logger5 info message
2014-05-06 15:32:10,757 - mylogger.child1.child2.child3 - INFO - logger5 info message
2014-05-06 15:32:10,759 - mylogger.child1.child2.child3 - WARNING - logger5 warning message
2014-05-06 15:32:10,759 - mylogger.child1.child2.child3 - WARNING - logger5 warning message
2014-05-06 15:32:10,759 - mylogger.child1.child2.child3 - WARNING - logger5 warning message
2014-05-06 15:32:10,759 - mylogger.child1.child2.child3 - WARNING - logger5 warning message
2014-05-06 15:32:10,759 - mylogger.child1.child2.child3 - WARNING - logger5 warning message
2014-05-06 15:32:10,761 - mylogger.child1.child2.child3 - ERROR - logger5 error message
2014-05-06 15:32:10,761 - mylogger.child1.child2.child3 - ERROR - logger5 error message
2014-05-06 15:32:10,761 - mylogger.child1.child2.child3 - ERROR - logger5 error message
2014-05-06 15:32:10,761 - mylogger.child1.child2.child3 - ERROR - logger5 error message
2014-05-06 15:32:10,761 - mylogger.child1.child2.child3 - ERROR - logger5 error message
2014-05-06 15:32:10,762 - mylogger.child1.child2.child3 - CRITICAL - logger5 critical message
2014-05-06 15:32:10,762 - mylogger.child1.child2.child3 - CRITICAL - logger5 critical message
2014-05-06 15:32:10,762 - mylogger.child1.child2.child3 - CRITICAL - logger5 critical message
2014-05-06 15:32:10,762 - mylogger.child1.child2.child3 - CRITICAL - logger5 critical message
2014-05-06 15:32:10,762 - mylogger.child1.child2.child3 - CRITICAL - logger5 critical message

發現root、mylogger、mylogger.child1的輸出全部被過濾掉了。

除了直接在程序中設置Logger,Handler,Filter,Formatter外還可以將這些信息寫進配置文件中

例如典型的logging.conf

[python] view plain copy
  1. [loggers]
  2. keys=root,simpleExample
  3. [handlers]
  4. keys=consoleHandler
  5. [formatters]
  6. keys=simpleFormatter
  7. [logger_root]
  8. level=DEBUG
  9. handlers=consoleHandler
  10. [logger_simpleExample]
  11. level=DEBUG
  12. handlers=consoleHandler
  13. qualname=simpleExample
  14. propagate=0
  15. [handler_consoleHandler]
  16. class=StreamHandler
  17. level=DEBUG
  18. formatter=simpleFormatter
  19. args=(sys.stdout,)
  20. [formatter_simpleFormatter]
  21. format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
  22. datefmt=


程序可以這麽寫

[python] view plain copy
  1. import logging
  2. import logging.config
  3. logging.config.fileConfig("logging.conf") # 采用配置文件
  4. # create logger
  5. logger = logging.getLogger("simpleExample")
  6. # "application" code
  7. logger.debug("debug message")
  8. logger.info("info message")
  9. logger.warn("warn message")
  10. logger.error("error message")
  11. logger.critical("critical message")


多模塊使用logging
logging模塊保證在同一個python解釋器內,多次調用logging.getLogger(‘log_name‘)都會返回同一個logger實例,即使是在多個模塊的情況下。所以典型的多模塊場景下使用logging的方式是在main模塊中配置logging,這個配置會作用於多個的子模塊,然後在其他模塊中直接通過getLogger獲取Logger對象即可。

main.py:

[python] view plain copy
  1. import logging
  2. import logging.config
  3. logging.config.fileConfig(‘logging.conf‘)
  4. root_logger = logging.getLogger(‘root‘)
  5. root_logger.debug(‘test root logger...‘)
  6. logger = logging.getLogger(‘main‘)
  7. logger.info(‘test main logger‘)
  8. logger.info(‘start import module \‘mod\‘...‘)
  9. import mod
  10. logger.debug(‘let\‘s test mod.testLogger()‘)
  11. mod.testLogger()
  12. root_logger.info(‘finish test...‘)

子模塊mod.py:

[python] view plain copy
  1. import logging
  2. import submod
  3. logger = logging.getLogger(‘main.mod‘)
  4. logger.info(‘logger of mod say something...‘)
  5. def testLogger():
  6. logger.debug(‘this is mod.testLogger...‘)
  7. submod.tst()

子子模塊submod.py:

[python] view plain copy
    1. import logging
    2. logger = logging.getLogger(‘main.mod.submod‘)
    3. logger.info(‘logger of submod say something...‘)
    4. def tst():
    5. logger.info(‘this is submod.tst()...‘)

[轉載]Python logging模塊詳解