Python之日志处理(logging模块)详解
?
logging模塊簡介
logging模塊是Python內置的標準模塊,主要用于輸出運行日志,可以設置輸出日志的等級、日志保存路徑、日志文件回滾等;相比print,具備如下優點
1、可以通過設置不同的日志等級,在release版本中只輸出重要信息,而不必顯示大量的調試信息
2、print將所有信息都輸出到標準輸出中,嚴重影響開發者從標準輸出中查看其它數據;logging則可以由開發者決定將信息輸出到什么地方,以及怎么輸出
日志等級(level)
DEBUG < INFO < WARNING < ERROR < CRITICAL
DEBUG?最詳細的日志信息,典型應用場景是 問題診斷
INFO?信息詳細程度僅次于DEBUG,通常只記錄關鍵節點信息,用于確認一切都是按照我們預期的那樣進行工作
WARNING?當某些不期望的事情發生時記錄的信息(如,磁盤可用空間較低),但是此時應用程序還是正常運行的
ERROR?由于一個更嚴重的問題導致某些功能不能正常運行時記錄的信息
CRITICAL?當發生嚴重錯誤,導致應用程序不能繼續運行時記錄的信息
logging模塊可以指定日志記錄器的日志級別,只有級別大于或等于該指定日志級別的日志記錄才會被輸出,小于該等級的日志記錄將會被丟棄
logger
logger:日志對象,logging模塊中最基礎的對象,用logging.getLogger(name)方法進行初始化,name可以不填。通常logger的名字我們對應模塊名,如聊天模塊、數據庫模塊、驗證模塊等
1. 為程序提供記錄日志的接口
2. 判斷日志所處級別,并判斷是否要過濾
3. 根據其日志級別將該條日志分發給不同handler
其常用函數有:
Logger.setLevel() 設置日志級別
Logger.addHandler() 和 Logger.removeHandler() 添加和刪除一個Handler
Logger.addFilter() 添加一個Filter
?
setLevel:設置日志等級
logger=logging.getLogger()
logger.setLevel(logging.DEBUG) #設置日志等級
logging
1、Formatter用于控制日志信息的最終輸出格式
logging.Formatter(參數)
formatter=logging.Formatter('[%(asctime)s]-%(filename)s]-%(levelname)s:%(message)s')
?
%(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??用戶輸出的消息
?
2、Handler基于日志級別對日志進行分發,如設置為WARNING級別的Handler只會處理WARNING及以上級別的日志。具體的應用如一個應用要把所有的日志打在文件中,并把ERROR以上級別的日志打印到屏幕,把CRITICAL級別的日志發郵件
常用函數有:
setLevel() 設置級別
setFormatter() 設置Formatter
logging.FileHandler(參數)創建一個FileHandler
logger.addHandler(fh)添加
logging.StreamHandler()創建一個 StreamHandler
logger.addHandler(ch)添加
?
# 創建一個FileHandler,用于寫到本地
fh=logging.FileHandler(logname,'a',"utf-8")
fh.setLevel(logging.DEBUG)
fh.setFormatter(formatter)
logger.addHandler(fh)
# 創建一個 StreamHandler,用于輸出到控制臺
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
ch.setFormatter(formatter)
logger.addHandler(ch)
?
import os,time,logging #日志存放路徑 log_path=os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))),'logs') # 如果不存在這個logs文件夾,就自動創建一個 if not os.path.exists(log_path):os.mkdir(log_path) class Log():def __init__(self):#再日志路徑下添加日志文件名self.logname=os.path.join(log_path,'%s.log'%time.strftime('%Y_%m_%d'))#logger日志對象初始化self.logger=logging.getLogger()#設置日志等級self.logger.setLevel(logging.DEBUG)#日志輸出格式self.formatter=logging.Formatter('[%(asctime)s]-%(filename)s]-%(levelname)s:%(message)s')def __console(self,level,message):# 創建一個 FileHandler,用于寫到本地fh=logging.FileHandler(self.logname,'a',"utf-8")fh.setLevel(logging.DEBUG)fh.setFormatter(self.formatter)self.logger.addHandler(fh)# 創建一個 StreamHandler,用于輸出到控制臺ch = logging.StreamHandler()ch.setLevel(logging.DEBUG)ch.setFormatter(self.formatter)self.logger.addHandler(ch)if level=='info':self.logger.info(message)elif level=='debug':self.logger.debug(message)elif level=='warning':self.logger.warning(message)elif level=='error':self.logger.error(message)# 這兩行代碼是為了避免日志輸出重復問題self.logger.removeHandler(ch)self.logger.removeHandler(fh)# 關閉打開的文件fh.close()def debug(self, message):self.__console('debug', message)def info(self, message):self.__console('info', message)def warning(self, message):self.__console('warning', message)def error(self, message):self.__console('error', message) if __name__ == "__main__":log=Log()log.info("---測試開始---")log.info("操作步驟1,2,3")log.warning("---測試結束---")C:\Users\wangli\PycharmProjects\AutoMation\venv\Scripts\python.exe C:/Users/wangli/PycharmProjects/AutoMation/case/test.py [2019-04-10 17:17:18,025]-test.py]-INFO:---測試開始--- [2019-04-10 17:17:18,026]-test.py]-INFO:操作步驟1,2,3 [2019-04-10 17:17:18,028]-test.py]-WARNING:---測試結束---Process finished with exit code 0 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Python之日志处理(logging模块)详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Python】time内置模块处理时间
- 下一篇: java 井字棋 人机_一个井字棋tic