1. 程式人生 > >[python標準庫]Logging模塊

[python標準庫]Logging模塊

post 日誌信息 tin 方式 asc dha event 如果 bytes

1.模塊簡介

  logging模塊是Python內置的標準模塊,主要用於輸出運行日誌,可以設置輸出日誌的等級、日誌保存路徑、日誌文件回滾等;相比print,具備如下優點:

  1. 可以通過設置不同的日誌等級,在release版本中只輸出重要信息,而不必顯示大量的調試信息;
  2. print將所有信息都輸出到標準輸出中,嚴重影響開發者從標準輸出中查看其它數據;logging則可以由開發者決定將信息輸出到什麽地方,以及怎麽輸出;

  模塊提供logger,handler,filter,formatter。

  • logger:提供日誌接口,供應用代碼使用。logger最長用的操作有兩類:配置和發送日誌消息。可以通過logging.getLogger(name)獲取logger對象,如果不指定name則返回root對象,多次使用相同的name調用getLogger方法返回同一個logger對象。
  • handler:將日誌記錄(log record)發送到合適的目的地(destination),比如文件,socket等。一個logger對象可以通過addHandler方法添加0到多個handler,每個handler又可以定義不同日誌級別,以實現日誌分級過濾顯示。
  • filter:提供一種優雅的方式決定一個日誌記錄是否發送到handler。
  • formatter:指定日誌記錄輸出的具體格式。formatter的構造方法需要兩個參數:消息的格式字符串和日期字符串,這兩個參數都是可選的。

2.模塊的使用

 a.簡單的將日誌打印到屏幕

import logging

logging.debug(
This is debug message) logging.info(This is info message) logging.warning(This is warning message) #輸出結果: WARNING:root:This is warning message

  默認情況下,logging將日誌打印到屏幕,日誌級別為WARNING;
  日誌級別大小關系為:CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET,當然也可以自己定義日誌級別。

  b.通過logging.basicConfig函數對日誌的輸出格式及方式做相關配置

import logging

logging.basicConfig(level=logging.DEBUG,
                format=%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s,
                datefmt=%a, %d %b %Y %H:%M:%S,
                filename=LOG.log,
                filemode=w)
    
logging.debug(This is debug message)
logging.info(This is info message)
logging.warning(This is warning message)

#輸出到LOG.log
Mon, 12 Jun 2017 18:31:10 log.py[line:14] DEBUG This is debug message
Mon, 12 Jun 2017 18:31:10 log.py[line:15] INFO This is info message
Mon, 12 Jun 2017 18:31:10 log.py[line:16] WARNING This is warning message
技術分享logging.basicConfig函數各參數:

  c.將日誌同時輸出到文件和屏幕

技術分享
import logging

logging.basicConfig(level=logging.DEBUG,
                format=%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s,
                datefmt=%a, %d %b %Y %H:%M:%S,
                filename=myapp.log,
                filemode=w)

#################################################################################################
#定義一個StreamHandler,將INFO級別或更高的日誌信息打印到標準錯誤,並將其添加到當前的日誌處理對象#
console = logging.StreamHandler()
console.setLevel(logging.INFO)
formatter = logging.Formatter(%(name)-12s: %(levelname)-8s %(message)s)
console.setFormatter(formatter)
logging.getLogger(‘‘).addHandler(console)
#################################################################################################

logging.debug(This is debug message)
logging.info(This is info message)
logging.warning(This is warning message)
View Code

  d.logging之日誌回滾

import logging
from logging.handlers import RotatingFileHandler

#定義一個RotatingFileHandler,最多備份5個日誌文件,每個日誌文件最大10M
Rthandler = RotatingFileHandler(myapp.log, maxBytes=10*1024*1024,backupCount=5)
Rthandler.setLevel(logging.INFO)
formatter = logging.Formatter(%(name)-12s: %(levelname)-8s %(message)s)
Rthandler.setFormatter(formatter)
logging.getLogger(‘‘).addHandler(Rthandler)

  logging有一個日誌處理的主對象,其它處理方式都是通過addHandler添加進去的。logging的幾種handle方式如下:

技術分享
logging.StreamHandler: 日誌輸出到流,可以是sys.stderr、sys.stdout或者文件
logging.FileHandler: 日誌輸出到文件
日誌回滾方式,實際使用時用RotatingFileHandler和TimedRotatingFileHandler
logging.handlers.BaseRotatingHandler
logging.handlers.RotatingFileHandler
logging.handlers.TimedRotatingFileHandler
logging.handlers.SocketHandler: 遠程輸出日誌到TCP/IP sockets
logging.handlers.DatagramHandler:  遠程輸出日誌到UDP sockets
logging.handlers.SMTPHandler:  遠程輸出日誌到郵件地址
logging.handlers.SysLogHandler: 日誌輸出到syslog
logging.handlers.NTEventLogHandler: 遠程輸出日誌到Windows NT/2000/XP的事件日誌
logging.handlers.MemoryHandler: 日誌輸出到內存中的制定buffer
logging.handlers.HTTPHandler: 通過"GET""POST"遠程輸出到HTTP服務器
View Code

  由於StreamHandler和FileHandler是常用的日誌處理方式,所以直接包含在logging模塊中,而其他方式則包含在logging.handlers模塊中.

  e.單文件日誌

import logging
  
  
logging.basicConfig(filename=log.log,
                    format=%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s,
                    datefmt=%Y-%m-%d %H:%M:%S %p,
                    level=10)
  
logging.debug(debug)
logging.info(info)
logging.warning(warning)
logging.error(error)
logging.critical(critical)
logging.log(10,log)
技術分享
CRITICAL = 50
FATAL = CRITICAL
ERROR = 40
WARNING = 30
WARN = WARNING
INFO = 20
DEBUG = 10
NOTSET = 0
日誌等級  

  註:只有【當前寫等級】大於【日誌等級】時,日誌文件才被記錄。

  f.多文件日誌

技術分享
# 定義文件
file_1_1 = logging.FileHandler(l1_1.log, a, encoding=utf-8)
fmt = logging.Formatter(fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s")
file_1_1.setFormatter(fmt)

file_1_2 = logging.FileHandler(l1_2.log, a, encoding=utf-8)
fmt = logging.Formatter()
file_1_2.setFormatter(fmt)

# 定義日誌
logger1 = logging.Logger(s1, level=logging.ERROR)
logger1.addHandler(file_1_1)
logger1.addHandler(file_1_2)


# 寫日誌
logger1.critical(1111)
日誌一 技術分享
# 定義文件
file_2_1 = logging.FileHandler(l2_1.log, a)
fmt = logging.Formatter()
file_2_1.setFormatter(fmt)

# 定義日誌
logger2 = logging.Logger(s2, level=logging.INFO)
logger2.addHandler(file_2_1)
日誌二

如上述創建的兩個日誌對象

  • 當使用【logger1】寫日誌時,會將相應的內容寫入 l1_1.log 和 l1_2.log 文件中
  • 當使用【logger2】寫日誌時,會將相應的內容寫入 l2_1.log 文件中

3.日誌小實例

技術分享
#在CMD窗口上只打出error以上級別的日誌,但是在日誌中打出debug以上的信息
import logging
logger = logging.getLogger("simple_example")
logger.setLevel(logging.DEBUG)
# 建立一個filehandler來把日誌記錄在文件裏,級別為debug以上
fh = logging.FileHandler("spam.log")
fh.setLevel(logging.DEBUG)
# 建立一個streamhandler來把日誌打在CMD窗口上,級別為error以上
ch = logging.StreamHandler()
ch.setLevel(logging.ERROR)
# 設置日誌格式
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
ch.setFormatter(formatter)
fh.setFormatter(formatter)
#將相應的handler添加在logger對象中
logger.addHandler(ch)
logger.addHandler(fh)
# 開始打日誌
logger.debug("debug message")
logger.info("info message")
logger.warn("warn message")
logger.error("error message")
logger.critical("critical message")
View Code

參考資料:

每個 Python 程序員都要知道的日誌實踐

 

[python標準庫]Logging模塊