1、logging模塊日志級別
使用logging模塊簡單示例:
>>>import logging >>>logging.debug("this's a test logging") >>>loggin.info("still a test logging") # 默認情況下以上兩行沒有輸出,需要指定日志級別才行 >>>logging.warn("it's waring!!!")
logging模塊日志級別:
日志級別 | 值 |
---|---|
CRITICAL | 50 |
ERROR | 40 |
WARNING | 30 |
INFO | 20 |
DEBUG | 10 |
UNSET | 0 |
對於某個級別的日志消息,只有當處理器和日志記錄器配置為可以發布該級別(或者更高級別的消息時),才會發布這個日志消息。例如,如果一個消息的級別是CRITICAL,日志配置的級別是ERROR,這個消息就會發出(50>40)。如果這個消息是WARNING,而日志記錄器設置為的是ERROR,這個消息就不會發出(30<40).
2、logging模塊基本理解使用
-
不同的優先級對應不同的函數:logging.debug,logging.warn等等
-
一個或多個Logger對象,主要通過它們使用模塊
-
把消息寫入終端或文件、數據庫或其他地方的handler
-
創建輸出的formatter
-
基於輸入進行篩選的過濾器
一、設置logging日志默認優先級:
默認級別是WARNING,設置日志默認優先級為DEBUG
>>>import logging >>>logging.basicConfig(level=logging.DEBUG)
二、創建logger對象
每個logger對象都有一個名稱,比如創建一個test的logger
>>>import logging >>>logging.basicConfig(level='DEBUG') >>>logger = longgin.getLogger('test') >>>logger.debug('the great gates!') DEBUG:test:the great gates!
三、使用Handler把消息輸出到日志文件
>>>import logging >>>logging.basicConfig(level='DEBUG', filename='test.log') >>>logger = logging.getLogger('tx') >>>logger.war('xxxxssss')
日志寫入了文件test.log,調用basicConfig()時使用的filename參數會創建一個FileHandler並對logger進行設置,logging模塊至少包含15種handler,比如電子郵件、web服務器、屏幕和文件
四、控制消息的格式
>>>import logging >>>fmt = '%(asctime)s %(levelname)s %(lineno)s %(message)s' >>>logging.basicConfig(lebel='DEBUG', filename='test.log', format=fmt) >>>logger = logging.getLogger('xx') >>>logger.warn('where is loggggg') 2016-5-5 23:22:11,877 WARN 1 where is loggggg
logging模塊可以識別出fmt格式化字符串中的變量名,asctime、levelname、lineo、message,都是內置變量,也可以創建自定義變量。
3、日志文件旋轉
-
要想每次運行程序的時候創建一個新文件,可以向basicConfig()的參數filemode傳入值"w"。不過最好不要采用這種方式管理日志文件,更好的做法是使用一個RotatingFileHandler,它會自動創建新文件,同時保留原來的文件.
>>>import glob >>>import logging >>>import logging.handlers >>>logger = logging.getLogger('mylogger') >>>logger.setLevel(logging.DEBUG) >>>log_filename='test.log' >>>handler = logging.handlers.RotatingFileHandler(log_filename, maxBytes=100, backupCount=5) >>>logger.addHandler(handler) # 查看滾動生成的日志文件 for i in range(100): logger.debug('i = %d' % i) # 查看那些文件被創建 logfiles = glob.glob('%s *' % log_filename) for filename in logfiles: print filename 結果: test.log test.log.1 test.log.2 ... test.log.5 最新的文件總是test.log,每次達到大小限制時,就會后綴加.1重命名。現有的各個備份文件也會重命名,使后綴遞增(.1變成.2,等等),.5文件會被刪除
4、logging模塊使用問題和實例
1、logging模塊中子類繼承父類過程中,父類使用logging.basicConfig()進行的配置,會覆蓋掉子類中的配置.所以子類中用logging.basicConfig()進行的配置不會生效.
2、另外使用logger=logging.getLogger()進行實例化對象過程中,如果是繼承父類的,仍然不會生效,由於logging.getLogger()是以"."作為不同層級的區分.當子類需要另外設置logging的配置時,要另外通過設置handler的方式,來避免父類的logging配置掩蓋子類.
3、具體首先配置logger = logging.getLogger(__name__) "__name__"不能為空,為其他的參數也可以,如果為logger=logging.getLogger(),似乎子類配置的logger不會生效.
2、另外使用logger=logging.getLogger()進行實例化對象過程中,如果是繼承父類的,仍然不會生效,由於logging.getLogger()是以"."作為不同層級的區分.當子類需要另外設置logging的配置時,要另外通過設置handler的方式,來避免父類的logging配置掩蓋子類.
3、具體首先配置logger = logging.getLogger(__name__) "__name__"不能為空,為其他的參數也可以,如果為logger=logging.getLogger(),似乎子類配置的logger不會生效.
增加handler: log_file = './test.log' fmt = fmt = '%(asctime)s %(filename)s %(funcName)s %(levelname)s Line:%(lineno)s :%(message)s' logger = logging.getLogger(__name__) logger.level = logging.DEBUG handlers = logging.FileHandler(log_file) formatter = logging.Formatter(fmt) handlers.formatter = formatter loggers.addHandler(handlers)
使用logger:
logger.info('it's a test')
4、其logging模塊參考文檔:
http://python.jobbole.com/84092/ [必看,深入淺出]
http://python.jobbole.com/82221/ [基礎全面]
http://python.jobbole.com/81521/ [簡單]
http://python.jobbole.com/81666/ [簡單]