python使用logger實現日志回滾和異常捕捉


日志回滾

使用logger模塊設置日志輸出到文件中,使用TimedRotatingFileHandler

import time import logging import logging.handlers def loghandler(name): #初始化logging
 logging.basicConfig() mylog=logging.getLogger(name) #設置日志級別
 mylog.setLevel(logging.INFO) #添加TimeRoatingFileHandler
    #定義一個1天換一次log文件的handler
    #保留7個舊log文件
    timefilehandler=logging.handlers.TimedRotatingFileHandler("log1/log.log",when='D',interval=1,backupCount=7) timefilehandler.suffix="%Y-%m-%d.log"

    #設置log記錄輸出的格式
    formatter=logging.Formatter('%(asctime)s-%(name)s-%(levelname)s-%(filename)s-%(lineno)d-%(message)s') timefilehandler.setFormatter(formatter) #添加到logger中
 mylog.addHandler(timefilehandler) return mylog

 

 程序異常捕捉

使用traceback statck追蹤記錄代碼異常,格式為:

try: do-something-block except: logger.exception("Exception Logged")

 

最終代碼:

import time import logging import logging.handlers def loghandler(name): #初始化logging
 logging.basicConfig() mylog=logging.getLogger(name) #設置日志級別
 mylog.setLevel(logging.INFO) #添加TimeRoatingFileHandler
    #定義一個1天換一次log文件的handler
    #保留7個舊log文件
    timefilehandler=logging.handlers.TimedRotatingFileHandler("log1/log.log",when='D',interval=1,backupCount=7) timefilehandler.suffix="%Y-%m-%d.log"

    #設置log記錄輸出的格式
    formatter=logging.Formatter('%(asctime)s-%(name)s-%(levelname)s-%(filename)s-%(lineno)d-%(message)s') timefilehandler.setFormatter(formatter) #添加到logger中
 mylog.addHandler(timefilehandler) return mylog #調用函數,實現日志輸出
log=loghandler('mylog') try: assert 1==2 log.info('hello') except: #實現追蹤異常返回信息
    log.exception("Failed to assert 1==2")

實現捕獲異常效果如下:

小結知識點:

1、日志記錄輸出的格式,實例化Formatter類

屬性名稱
    格式  
                                       說明  
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、日志級別

FATAL(致命錯誤,一般不用)>CRITICAL(嚴重錯誤,級別數值50)>ERROR(錯誤,級別數值40)>WARNING(警告信息,級別數值30)>INFO(日常信息,級別數值20)>DEBUG(調式信息,級別數值10)

格式為:

setlevel(logging.INFO)

3、按照時間日志回滾

格式:

TimedRotatingFileHandler(filename [,when [,interval [,backupCount]]])

filename :是輸出日志文件名的前綴,比如log/myapp.log
when 是一個字符串的定義如下:
“S”: Seconds
“M”: Minutes
“H”: Hours
“D”: Days
“W”: Week day (0=Monday)
“midnight”: Roll over at midnight
interval: 是指等待多少個單位when的時間后,Logger會自動重建文件,當然,這個文件的創建
取決於filename+suffix,若這個文件跟之前的文件有重名,則會自動覆蓋掉以前的文件,所以
有些情況suffix要定義的不能因為when而重復。
backupCount :是保留日志個數。默認的0是不會自動刪除掉日志。若設7,則在文件的創建過程中
庫會判斷是否有超過這個7,若超過,則會從最先創建的開始刪除。

 

4、按照文件大小回滾日志

logging.handlers.RotatingFileHandler('log-day/myDemo.log', maxBytes=1*1024, backupCount=5)

maxBytes:每個日志文件最大的大小(這里設置1K)

backupCount: 是保留日志個數。默認的0是不會自動刪除掉日志。若設7,則在文件的創建過程中

庫會判斷是否有超過這個數,若超過,則會從最先創建的開始刪除。


免責聲明!

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



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