python3 logging日志封裝實(shí)例
一個(gè)完整的程序離不開日志,無(wú)論是開發(fā)階段,還是測(cè)試階段,亦或程序運(yùn)行階段,都可以通過(guò)日志查看程序的運(yùn)行情況,或是定位問(wèn)題。
下面是對(duì) python3 的日志庫(kù) logging 進(jìn)行了封裝,對(duì)于大部分的需求應(yīng)該是能滿足的。(如果有不滿足的地方,歡迎在下方留言)
程序結(jié)構(gòu):
|--logger.py | |--singleton.py | |--demo.py | |--log | | | 2018-10-12.log
logger.py
import os import sys import time import logging from singleton import Singleton @Singleton # 如需打印不同路徑的日志(運(yùn)行日志、審計(jì)日志),則不能使用單例模式(注釋或刪除此行)。此外,還需設(shè)定參數(shù)name。 class Logger: def __init__(self, set_level="INFO", name=os.path.split(os.path.splitext(sys.argv[0])[0])[-1], log_name=time.strftime("%Y-%m-%d.log", time.localtime()), log_path=os.path.join(os.path.dirname(os.path.abspath(__file__)), "log"), use_console=True): """ :param set_level: 日志級(jí)別["NOTSET"|"DEBUG"|"INFO"|"WARNING"|"ERROR"|"CRITICAL"],默認(rèn)為INFO :param name: 日志中打印的name,默認(rèn)為運(yùn)行程序的name :param log_name: 日志文件的名字,默認(rèn)為當(dāng)前時(shí)間(年-月-日.log) :param log_path: 日志文件夾的路徑,默認(rèn)為logger.py同級(jí)目錄中的log文件夾 :param use_console: 是否在控制臺(tái)打印,默認(rèn)為True """ if not set_level: set_level = self._exec_type() # 設(shè)置set_level為None,自動(dòng)獲取當(dāng)前運(yùn)行模式 self.__logger = logging.getLogger(name) self.setLevel(getattr(logging, set_level.upper()) if hasattr(logging, set_level.upper()) else logging.INFO) # 設(shè)置日志級(jí)別 if not os.path.exists(log_path): # 創(chuàng)建日志目錄 os.makedirs(log_path) formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") handler_list = list() handler_list.append(logging.FileHandler(os.path.join(log_path, log_name), encoding="utf-8")) if use_console: handler_list.append(logging.StreamHandler()) for handler in handler_list: handler.setFormatter(formatter) self.addHandler(handler) def __getattr__(self, item): return getattr(self.logger, item) @property def logger(self): return self.__logger @logger.setter def logger(self, func): self.__logger = func def _exec_type(self): return "DEBUG" if os.environ.get("IPYTHONENABLE") else "INFO"
singleton.py
class Singleton: """ 單例裝飾器。 """ __cls = dict() def __init__(self, cls): self.__key = cls def __call__(self, *args, **kwargs): if self.__key not in self.cls: self[self.__key] = self.__key(*args, **kwargs) return self[self.__key] def __setitem__(self, key, value): self.cls[key] = value def __getitem__(self, item): return self.cls[item] @property def cls(self): return self.__cls @cls.setter def cls(self, cls): self.__cls = cls
demo.py
import logger x = logger.Logger("debug") x.critical("這是一個(gè) critical 級(jí)別的問(wèn)題!") x.error("這是一個(gè) error 級(jí)別的問(wèn)題!") x.warning("這是一個(gè) warning 級(jí)別的問(wèn)題!") x.info("這是一個(gè) info 級(jí)別的問(wèn)題!") x.debug("這是一個(gè) debug 級(jí)別的問(wèn)題!") x.log(50, "這是一個(gè) critical 級(jí)別的問(wèn)題的另一種寫法!") x.log(40, "這是一個(gè) error 級(jí)別的問(wèn)題的另一種寫法!") x.log(30, "這是一個(gè) warning 級(jí)別的問(wèn)題的另一種寫法!") x.log(20, "這是一個(gè) info 級(jí)別的問(wèn)題的另一種寫法!") x.log(10, "這是一個(gè) debug 級(jí)別的問(wèn)題的另一種寫法!") x.log(51, "這是一個(gè) Level 51 級(jí)別的問(wèn)題!") x.log(11, "這是一個(gè) Level 11 級(jí)別的問(wèn)題!") x.log(9, "這條日志等級(jí)低于 debug,不會(huì)被打印") x.log(0, "這條日志同樣不會(huì)被打印") """ 運(yùn)行結(jié)果: 2018-10-12 00:18:06,562 - demo - CRITICAL - 這是一個(gè) critical 級(jí)別的問(wèn)題! 2018-10-12 00:18:06,562 - demo - ERROR - 這是一個(gè) error 級(jí)別的問(wèn)題! 2018-10-12 00:18:06,562 - demo - WARNING - 這是一個(gè) warning 級(jí)別的問(wèn)題! 2018-10-12 00:18:06,562 - demo - INFO - 這是一個(gè) info 級(jí)別的問(wèn)題! 2018-10-12 00:18:06,562 - demo - DEBUG - 這是一個(gè) debug 級(jí)別的問(wèn)題! 2018-10-12 00:18:06,562 - demo - CRITICAL - 這是一個(gè) critical 級(jí)別的問(wèn)題的另一種寫法! 2018-10-12 00:18:06,562 - demo - ERROR - 這是一個(gè) error 級(jí)別的問(wèn)題的另一種寫法! 2018-10-12 00:18:06,562 - demo - WARNING - 這是一個(gè) warning 級(jí)別的問(wèn)題的另一種寫法! 2018-10-12 00:18:06,562 - demo - INFO - 這是一個(gè) info 級(jí)別的問(wèn)題的另一種寫法! 2018-10-12 00:18:06,562 - demo - DEBUG - 這是一個(gè) debug 級(jí)別的問(wèn)題的另一種寫法! 2018-10-12 00:18:06,562 - demo - Level 51 - 這是一個(gè) Level 51 級(jí)別的問(wèn)題! 2018-10-12 00:18:06,562 - demo - Level 11 - 這是一個(gè) Level 11 級(jí)別的問(wèn)題! """ 2018-10-12.log 2018-10-12 00:18:06,562 - demo - CRITICAL - 這是一個(gè) critical 級(jí)別的問(wèn)題! 2018-10-12 00:18:06,562 - demo - ERROR - 這是一個(gè) error 級(jí)別的問(wèn)題! 2018-10-12 00:18:06,562 - demo - WARNING - 這是一個(gè) warning 級(jí)別的問(wèn)題! 2018-10-12 00:18:06,562 - demo - INFO - 這是一個(gè) info 級(jí)別的問(wèn)題! 2018-10-12 00:18:06,562 - demo - DEBUG - 這是一個(gè) debug 級(jí)別的問(wèn)題! 2018-10-12 00:18:06,562 - demo - CRITICAL - 這是一個(gè) critical 級(jí)別的問(wèn)題的另一種寫法! 2018-10-12 00:18:06,562 - demo - ERROR - 這是一個(gè) error 級(jí)別的問(wèn)題的另一種寫法! 2018-10-12 00:18:06,562 - demo - WARNING - 這是一個(gè) warning 級(jí)別的問(wèn)題的另一種寫法! 2018-10-12 00:18:06,562 - demo - INFO - 這是一個(gè) info 級(jí)別的問(wèn)題的另一種寫法! 2018-10-12 00:18:06,562 - demo - DEBUG - 這是一個(gè) debug 級(jí)別的問(wèn)題的另一種寫法! 2018-10-12 00:18:06,562 - demo - Level 51 - 這是一個(gè) Level 51 級(jí)別的問(wèn)題! 2018-10-12 00:18:06,562 - demo - Level 11 - 這是一個(gè) Level 11 級(jí)別的問(wèn)題!
以上這篇python3 logging日志封裝實(shí)例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- python3中的logging記錄日志實(shí)現(xiàn)過(guò)程及封裝成類的操作
- Python中l(wèi)ogging日志的四個(gè)等級(jí)和使用
- Python+logging輸出到屏幕將log日志寫入文件
- Python中l(wèi)ogging日志記錄到文件及自動(dòng)分割的操作代碼
- python logging 重復(fù)寫日志問(wèn)題解決辦法詳解
- Python logging日志模塊 配置文件方式
- 詳解python logging日志傳輸
- Python基于yaml文件配置logging日志過(guò)程解析
- Python日志logging模塊功能與用法詳解
- python 日志 logging模塊詳細(xì)解析
- 解決Python logging模塊無(wú)法正常輸出日志的問(wèn)題
- python logging 日志的級(jí)別調(diào)整方式
- python 如何對(duì)logging日志封裝
相關(guān)文章
Python 網(wǎng)頁(yè)解析HTMLParse的實(shí)例詳解
這篇文章主要介紹了Python 網(wǎng)頁(yè)解析HTMLParse的實(shí)例詳解的相關(guān)資料,python里提供了一個(gè)簡(jiǎn)單的解析模塊HTMLParser類,使用起來(lái)也是比較簡(jiǎn)單的,解析語(yǔ)法沒有用到XPath類似的簡(jiǎn)潔模式,需要的朋友可以參考下2017-08-08python holidays獲取中國(guó)節(jié)日的示例
在Python中,holidays庫(kù)是一個(gè)流行的庫(kù),用于處理各種國(guó)家和地區(qū)的公共假期,這篇文章主要介紹了python holidays獲取中國(guó)節(jié)日,需要的朋友可以參考下2024-06-06python實(shí)現(xiàn)批量獲取指定文件夾下的所有文件的廠商信息
這篇文章主要介紹了python實(shí)現(xiàn)批量獲取指定文件夾下的所有文件的廠商信息的方法,是非常實(shí)用的技巧,涉及到文件的讀寫與字典的操作等技巧,需要的朋友可以參考下2014-09-09python topk()函數(shù)求最大和最小值實(shí)例
這篇文章主要介紹了python topk()函數(shù)求最大和最小值實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04在python中利用opencv簡(jiǎn)單做圖片比對(duì)的方法
今天小編就為大家分享一篇在python中利用opencv簡(jiǎn)單做圖片比對(duì)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01Python編寫memcached啟動(dòng)腳本代碼實(shí)例
這篇文章主要介紹了Python編寫memcached啟動(dòng)腳本代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08Python打印scrapy蜘蛛抓取樹結(jié)構(gòu)的方法
這篇文章主要介紹了Python打印scrapy蜘蛛抓取樹結(jié)構(gòu)的方法,實(shí)例分析了打印scrapy蜘蛛抓取樹結(jié)構(gòu)的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04Python面向?qū)ο蟪绦蛟O(shè)計(jì)之靜態(tài)方法、類方法、屬性方法原理與用法分析
這篇文章主要介紹了Python面向?qū)ο蟪绦蛟O(shè)計(jì)之靜態(tài)方法、類方法、屬性方法,結(jié)合實(shí)例形式分析了Python靜態(tài)方法、類方法、屬性方法相關(guān)概念、原理、用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2020-03-03