python日志記錄-logging模塊


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不會生效.

增加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/   [簡單]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM