logging模組簡介python
1 logging模組簡介
logging模組是Python內建的標準模組,主要用於輸出執行日誌,可以設定輸出日誌的等級、日誌儲存路徑、日誌檔案回滾等;相比print,具備如下優點:
- 可以通過設定不同的日誌等級,在release版本中只輸出重要資訊,而不必顯示大量的除錯資訊;
- print將所有資訊都輸出到標準輸出中,嚴重影響開發者從標準輸出中檢視其它資料;logging則可以由開發者決定將資訊輸出到什麼地方,以及怎麼輸出;
2 logging模組使用
2.1 基本使用
配置logging基本的設定,然後在控制檯輸出日誌,
import logging
logging.basicConfig(level = logging.INFO, format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s' )
logger = logging.getLogger(__name__)
logger.info( "Start print log" )
logger.debug( "Do something" )
logger.warning( "Something maybe fail." )
logger.info( "Finish" )
|
執行時,控制檯輸出,
1 2016-10-09 19:11:19,434 - __main__ - INFO - Start print log 2 2016-10-09 19:11:19,434 - __main__ - WARNING - Something maybe fail. 3 2016-10-09 19:11:19,434 - __main__ - INFO - Finish
logging中可以選擇很多訊息級別,如:DEBUG,INFO,WARNING,ERROR,CRITICAL,通過賦予logger或者handler不同的級別,開發者就可以只輸出錯誤資訊到特定的記錄檔案,或者在除錯時只記錄除錯資訊。
將logger的級別改為DEBUG,再觀察一下輸出結果
1 |
logging.basicConfig(level = logging.DEBUG, format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s' )
|
從輸出結果可以看到,輸出了debug的日誌記錄
1 2 3 4 |
2016 - 10 - 09 19 : 12 : 08 , 289 - __main__ - INFO - Start print log
2016 - 10 - 09 19 : 12 : 08 , 289 - __main__ - DEBUG - Do something
2016 - 10 - 09 19 : 12 : 08 , 289 - __main__ - WARNING - Something maybe fail.
2016 - 10 - 09 19 : 12 : 08 , 289 - __main__ - INFO - Finish
|
1 |
logging.basicConfig函式各引數:
|
1 2 3 4 5 6 7 8 9 10 11 |
filename:指定日誌檔名;
filemode:和 file 函式意義相同,指定日誌檔案的開啟模式, 'w' 或者 'a' ;
format :指定輸出的格式和內容, format 可以輸出很多有用的資訊,
datefmt:指定時間格式,同time.strftime();
level:設定日誌級別,預設為logging.WARNNING;
stream:指定將日誌的輸出流,可以指定輸出到sys.stderr,sys.stdout或者檔案,預設輸出到sys.stderr,當stream和filename同時指定時,stream被忽略;
|
Formatters定義了Logger記錄的輸出格式。 定義了最終log資訊的內容格式,應用可以直接例項化Foamatter類。資訊格式字串用%(<dictionary key>)s風格的字串做替換。
屬性名稱 | 格式 | 說明 |
name | %(name)s | 日誌的名稱 |
asctime | %(asctime)s | 可讀時間,預設格式‘2003-07-08 16:49:45,896’,逗號之後是毫秒 |
filename | %(filename)s | 檔名,pathname的一部分 |
pathname | %(pathname)s | 檔案的全路徑名稱 |
funcName | %(funcName)s | 呼叫日誌多對應的方法名 |
levelname | %(levelname)s | 日誌的等級 |
levelno | %(levelno)s | 數字化的日誌等級 |
lineno | %(lineno)d | 被記錄日誌在原始碼中的行數 |
module | %(module)s | 模組名 |
msecs | %(msecs)d | 時間中的毫秒部分 |
process | %(process)d | 程序的ID |
processName | %(processName)s | 程序的名稱 |
thread | %(thread)d | 執行緒的ID |
threadName | %(threadName)s | 執行緒的名稱 |
relativeCreated | %(relativeCreated)d | 日誌被建立的相對時間,以毫秒為單位 |
2.2 將日誌寫入到檔案
2.2.1 將日誌寫入到檔案
設定logging,建立一個FileHandler,並對輸出訊息的格式進行設定,將其新增到logger,然後將日誌寫入到指定的檔案中,
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import logging
logger = logging.getLogger(__name__)
logger.setLevel(level = logging.INFO)
handler = logging.FileHandler( "log.txt" )
handler.setLevel(logging.INFO)
formatter = logging.Formatter( '%(asctime)s - %(name)s - %(levelname)s - %(message)s' )
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.info( "Start print log" )
logger.debug( "Do something" )
logger.warning( "Something maybe fail." )
logger.info( "Finish" )
|
log.txt中日誌資料為:
2017-07-25 15:02:09,905 - __main__ - INFO - Start print log
2017-07-25 15:02:09,905 - __main__ - WARNING - Something maybe fail.
2017-07-25 15:02:09,905 - __main__ - INFO - Finish
2.2.2 將日誌同時輸出到螢幕和日誌檔案
logger中新增StreamHandler,可以將日誌輸出到螢幕上,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import logging
logger = logging.getLogger(__name__)
logger.setLevel(level = logging.INFO)
handler = logging.FileHandler( "log.txt" )
handler.setLevel(logging.INFO)
formatter = logging.Formatter( '%(asctime)s - %(name)s - %(levelname)s - %(message)s' )
handler.setFormatter(formatter)
console = logging.StreamHandler()
console.setLevel(logging.INFO)
logger.addHandler(handler)
logger.addHandler(console)
logger.info( "Start print log" )
logger.debug( "Do something" )
logger.warning( "Something maybe fail." )
logger.info( "Finish" )
|
可以在log.txt檔案和控制檯中看到
2017-07-25 15:03:05,075 - __main__ - INFO - Start print log
2017-07-25 15:03:05,075 - __main__ - WARNING - Something maybe fail.
2017-07-25 15:03:05,075 - __main__ - INFO - Finish
可以發現,logging有一個日誌處理的主物件,其他處理方式都是通過addHandler新增進去,logging中包含的handler主要有如下幾種,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
handler名稱:位置;作用
StreamHandler:logging.StreamHandler;日誌輸出到流,可以是sys.stderr,sys.stdout或者檔案
FileHandler:logging.FileHandler;日誌輸出到檔案
BaseRotatingHandler:logging.handlers.BaseRotatingHandler;基本的日誌回滾方式
RotatingHandler:logging.handlers.RotatingHandler;日誌回滾方式,支援日誌檔案最大數量和日誌檔案回滾
TimeRotatingHandler:logging.handlers.TimeRotatingHandler;日誌回滾方式,在一定時間區域內回滾日誌檔案
SocketHandler:logging.handlers.SocketHandler;遠端輸出日誌到TCP / IP sockets
DatagramHandler:logging.handlers.DatagramHandler;遠端輸出日誌到UDP sockets
SMTPHandler:logging.handlers.SMTPHandler;遠端輸出日誌到郵件地址
SysLogHandler:logging.handlers.SysLogHandler;日誌輸出到syslog
NTEventLogHandler:logging.handlers.NTEventLogHandler;遠端輸出日誌到Windows NT / 2000 / XP的事件日誌
MemoryHandler:logging.handlers.MemoryHandler;日誌輸出到記憶體中的指定 buffer
HTTPHandler:logging.handlers.HTTPHandler;通過 "GET" 或者 "POST" 遠端輸出到HTTP伺服器
|