日志回滾
使用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,則在文件的創建過程中
庫會判斷是否有超過這個數,若超過,則會從最先創建的開始刪除。