python logging 模塊
日誌模塊
python的logging模塊提供了標準的日誌接口,你可以通過它存儲各種格式的日誌,logging的日誌可以分為 debug(), info(), warning(), error() and critical() 5個級別。
同時將日誌輸出到文件和stdout。
import logging #create logger object. logger = logging.getLogger() #創建logger對象,用來記錄日誌 logger.setLevel(logging.DEBUG) # create console handler and set level to debugconsole_handler = logging.StreamHandler() #創建控制臺日誌對象 console_handler.setLevel(logging.DEBUG) #設置控制臺日誌級別 # create file handler and set level to warning file_handler = logging.FileHandler("test.log",‘a‘,encoding=‘utf8‘) #創建file日誌對象 file_handler.setLevel(logging.WARNING) #創建file日誌對象級別 # create log format.formatter = logging.Formatter(‘%(asctime)s || %(filename)s || [line:%(lineno)d] || %(levelname)s || %(message)s‘) #創建日誌格式 formatter.datefmt = ‘%a,%d %b %Y %H:%M:%S‘ # add formatter to ch and file_handler console_handler.setFormatter(formatter) #這裏都調用相同的日誌級別 file_handler.setFormatter(formatter) # add ch and file_handler to loggerlogger.addHandler(console_handler) #記錄控制臺日誌 logger.addHandler(file_handler) #記錄file日誌 # 調用logger生成測試日誌 logger.debug(‘debug message‘) logger.info(‘info message‘) logger.warn(‘warn message‘) logger.error(‘error message‘) logger.critical(‘critical message‘)
日誌級別:
Level | When it’s used |
---|---|
DEBUG |
Detailed information, typically of interest only when diagnosing problems. |
INFO |
Confirmation that things are working as expected. |
WARNING |
An indication that something unexpected happened, or indicative of some problem in the near future (e.g. ‘disk space low’). The software is still working as expected. |
ERROR |
Due to a more serious problem, the software has not been able to perform some function. |
CRITICAL |
A serious error, indicating that the program itself may be unable to continue running. |
日誌格式:
%(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 | 用戶輸出的消息 |
Python 使用logging模塊記錄日誌涉及四個主要類:
logger 提供了應用程序可以直接使用的接口;
handler 將(logger創建的)日誌記錄發送到合適的目的輸出;
filter 提供了細度設備來決定輸出哪條日誌記錄;
formatter 決定日誌記錄的最終輸出格式。
logger
每個程序在輸出信息之前都要獲得一個Logger。
Logger通常對應了程序的模塊名,比如聊天工具的圖形界面模塊可以這樣獲得它的Logger:
LOG=logging.getLogger(”chat.gui”)
而核心模塊可以這樣:
LOG=logging.getLogger(”chat.kernel”)
Logger.setLevel(lel):
指定最低的日誌級別,低於lel的級別將被忽略。debug是最低的內置級別,critical為最高
Logger.addFilter(filt)、Logger.removeFilter(filt):
添加或刪除指定的filter
Logger.addHandler(hdlr)、Logger.removeHandler(hdlr):
增加或刪除指定的handler
Logger.debug()、Logger.info()、Logger.warning()、Logger.error()、Logger.critical():
可以設置的日誌級別
handler
handler對象負責發送相關的信息到指定目的地。Python的日誌系統有多種Handler可以使用。有些Handler可以把信息輸出到控制臺,有些Logger可以把信息輸出到文件,還有些 Handler可以把信息發送到網絡上。如果覺得不夠用,還可以編寫自己的Handler。可以通過addHandler()方法添加多個多handler。
Handler.setLevel(lel):
指定被處理的信息級別,低於lel級別的信息將被忽略
Handler.setFormatter():
給這個handler選擇一個格式
Handler.addFilter(filt)、Handler.removeFilter(filt):
新增或刪除一個filter對象
常用的Handler:
1) logging.StreamHandler
它的構造函數是:StreamHandler([strm])。
使用這個Handler可以向類似與sys.stdout或者sys.stderr的任何文件對象(file object)輸出信息。其中strm參數是一個文件對象。默認是sys.stderr。
2) logging.FileHandler
它的構造函數是:FileHandler(filename[,mode])。
與StreamHandler類似,用於向一個文件輸出日誌信息。不過FileHandler會幫你打開這個文件。filename是文件名,必須指定一個文件名。mode是文件的打開方式。參見Python內置函數open()的用法。默認是’a‘,即添加到文件末尾。
3) logging.handlers.RotatingFileHandler
它的構造函數是:RotatingFileHandler( filename[, mode[, maxBytes[, backupCount]]])。
這個Handler類似於上面的FileHandler,但是它可以管理文件大小。當文件達到一定大小之後,它會自動將當前日誌文件改名,然後創建 一個新的同名日誌文件繼續輸出。比如日誌文件是chat.log。當chat.log達到指定的大小之後,RotatingFileHandler自動把 文件改名為chat.log.1。不過,如果chat.log.1已經存在,會先把chat.log.1重命名為chat.log.2。。。最後重新創建 chat.log,繼續輸出日誌信息。
其中filename和mode兩個參數和FileHandler一樣。
maxBytes用於指定日誌文件的最大文件大小。如果maxBytes為0,意味著日誌文件可以無限大,這時上面描述的重命名過程就不會發生。
backupCount用於指定保留的備份文件的個數。比如,如果指定為2,當上面描述的重命名過程發生時,原有的chat.log.2並不會被更名,而是被刪除。
4) logging.handlers.TimedRotatingFileHandler
它的構造函數是:TimedRotatingFileHandler( filename [,when [,interval [,backupCount]]])
這個Handler和RotatingFileHandler類似,不過,它沒有通過判斷文件大小來決定何時重新創建日誌文件,而是間隔一定時間就 自動創建新的日誌文件。重命名的過程與RotatingFileHandler類似,不過新的文件不是附加數字,而是當前時間。
其中filename參數和backupCount參數和RotatingFileHandler具有相同的意義。
interval是時間間隔。
when參數是一個字符串。表示時間間隔的單位,不區分大小寫。它有以下取值:
S 秒
M 分
H 小時
D 天
W 每星期 (interval==0時代表星期一)
midnight 每天淩晨
實現一個每天晚上rotate一個日誌文件
import logging from logging import handlers import time logger = logging.getLogger(__name__,level=logging.DEBUG)
# logger 名字是__name__,就是運行程序的名字。 # logger.setLevel(logging.DEBUG) #設置日誌級別 log_filename = "test_rotate" #設置日誌的文件名 # file_handler = handlers.RotatingFileHandler(filename=log_file,maxBytes=10,backupCount=3) # 每10bytes一個日誌文件,保留最新3份日誌文件 # file_handler = handlers.TimedRotatingFileHandler(filename=log_file,when="S",interval=5,backupCount=3) #每5秒一個日誌文件,保留最新3份日誌文件 file_handler = handlers.TimedRotatingFileHandler(filename=log_filename,when="S",interval=1,backupCount=3,encoding=‘utf-8‘) # 每1秒一個日誌文件,保留三份。 # file_handler.suffix = "%Y-%m-%d_%H_%M_%S.log" # 設置日誌文件名後綴 %Y-%m-%d_%H_%M_%S.log # file_handler = handlers.TimedRotatingFileHandler(filename=log_file,when="midnight",interval=1) # 設置淩晨開始一個新文件 # formatter = logging.Formatter( "{‘date‘:‘%(asctime)s‘,‘filename‘:‘%(filename)s‘,line‘:‘%(lineno)d‘,‘level‘:‘%(levelname)s‘,‘message‘:‘%(message)s‘}" ) file_handler.setFormatter(formatter) logger.addHandler(file_handler) # 生成日誌 for i in range(13): # 生成13秒的日誌 logger.debug(‘debug message‘) logger.info(‘info message‘) logger.warn(‘warn message‘) logger.error(‘error message‘) logger.critical(‘critical message‘) time.sleep(1) #每秒一次日誌記錄
python logging 模塊