python3 logging日志封裝實例
一個完整的程序離不開日志,無論是開發(fā)階段,還是測試階段,亦或程序運行階段,都可以通過日志查看程序的運行情況,或是定位問題。
下面是對 python3 的日志庫 logging 進行了封裝,對于大部分的需求應該是能滿足的。(如果有不滿足的地方,歡迎在下方留言)
程序結(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 # 如需打印不同路徑的日志(運行日志、審計日志),則不能使用單例模式(注釋或刪除此行)。此外,還需設定參數(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: 日志級別["NOTSET"|"DEBUG"|"INFO"|"WARNING"|"ERROR"|"CRITICAL"],默認為INFO :param name: 日志中打印的name,默認為運行程序的name :param log_name: 日志文件的名字,默認為當前時間(年-月-日.log) :param log_path: 日志文件夾的路徑,默認為logger.py同級目錄中的log文件夾 :param use_console: 是否在控制臺打印,默認為True """ if not set_level: set_level = self._exec_type() # 設置set_level為None,自動獲取當前運行模式 self.__logger = logging.getLogger(name) self.setLevel(getattr(logging, set_level.upper()) if hasattr(logging, set_level.upper()) else logging.INFO) # 設置日志級別 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("這是一個 critical 級別的問題!") x.error("這是一個 error 級別的問題!") x.warning("這是一個 warning 級別的問題!") x.info("這是一個 info 級別的問題!") x.debug("這是一個 debug 級別的問題!") x.log(50, "這是一個 critical 級別的問題的另一種寫法!") x.log(40, "這是一個 error 級別的問題的另一種寫法!") x.log(30, "這是一個 warning 級別的問題的另一種寫法!") x.log(20, "這是一個 info 級別的問題的另一種寫法!") x.log(10, "這是一個 debug 級別的問題的另一種寫法!") x.log(51, "這是一個 Level 51 級別的問題!") x.log(11, "這是一個 Level 11 級別的問題!") x.log(9, "這條日志等級低于 debug,不會被打印") x.log(0, "這條日志同樣不會被打印") """ 運行結(jié)果: 2018-10-12 00:18:06,562 - demo - CRITICAL - 這是一個 critical 級別的問題! 2018-10-12 00:18:06,562 - demo - ERROR - 這是一個 error 級別的問題! 2018-10-12 00:18:06,562 - demo - WARNING - 這是一個 warning 級別的問題! 2018-10-12 00:18:06,562 - demo - INFO - 這是一個 info 級別的問題! 2018-10-12 00:18:06,562 - demo - DEBUG - 這是一個 debug 級別的問題! 2018-10-12 00:18:06,562 - demo - CRITICAL - 這是一個 critical 級別的問題的另一種寫法! 2018-10-12 00:18:06,562 - demo - ERROR - 這是一個 error 級別的問題的另一種寫法! 2018-10-12 00:18:06,562 - demo - WARNING - 這是一個 warning 級別的問題的另一種寫法! 2018-10-12 00:18:06,562 - demo - INFO - 這是一個 info 級別的問題的另一種寫法! 2018-10-12 00:18:06,562 - demo - DEBUG - 這是一個 debug 級別的問題的另一種寫法! 2018-10-12 00:18:06,562 - demo - Level 51 - 這是一個 Level 51 級別的問題! 2018-10-12 00:18:06,562 - demo - Level 11 - 這是一個 Level 11 級別的問題! """ 2018-10-12.log 2018-10-12 00:18:06,562 - demo - CRITICAL - 這是一個 critical 級別的問題! 2018-10-12 00:18:06,562 - demo - ERROR - 這是一個 error 級別的問題! 2018-10-12 00:18:06,562 - demo - WARNING - 這是一個 warning 級別的問題! 2018-10-12 00:18:06,562 - demo - INFO - 這是一個 info 級別的問題! 2018-10-12 00:18:06,562 - demo - DEBUG - 這是一個 debug 級別的問題! 2018-10-12 00:18:06,562 - demo - CRITICAL - 這是一個 critical 級別的問題的另一種寫法! 2018-10-12 00:18:06,562 - demo - ERROR - 這是一個 error 級別的問題的另一種寫法! 2018-10-12 00:18:06,562 - demo - WARNING - 這是一個 warning 級別的問題的另一種寫法! 2018-10-12 00:18:06,562 - demo - INFO - 這是一個 info 級別的問題的另一種寫法! 2018-10-12 00:18:06,562 - demo - DEBUG - 這是一個 debug 級別的問題的另一種寫法! 2018-10-12 00:18:06,562 - demo - Level 51 - 這是一個 Level 51 級別的問題! 2018-10-12 00:18:06,562 - demo - Level 11 - 這是一個 Level 11 級別的問題!
以上這篇python3 logging日志封裝實例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
- python3中的logging記錄日志實現(xiàn)過程及封裝成類的操作
- Python中l(wèi)ogging日志的四個等級和使用
- Python+logging輸出到屏幕將log日志寫入文件
- Python中l(wèi)ogging日志記錄到文件及自動分割的操作代碼
- python logging 重復寫日志問題解決辦法詳解
- Python logging日志模塊 配置文件方式
- 詳解python logging日志傳輸
- Python基于yaml文件配置logging日志過程解析
- Python日志logging模塊功能與用法詳解
- python 日志 logging模塊詳細解析
- 解決Python logging模塊無法正常輸出日志的問題
- python logging 日志的級別調(diào)整方式
- python 如何對logging日志封裝
相關文章
Python 網(wǎng)頁解析HTMLParse的實例詳解
這篇文章主要介紹了Python 網(wǎng)頁解析HTMLParse的實例詳解的相關資料,python里提供了一個簡單的解析模塊HTMLParser類,使用起來也是比較簡單的,解析語法沒有用到XPath類似的簡潔模式,需要的朋友可以參考下2017-08-08python實現(xiàn)批量獲取指定文件夾下的所有文件的廠商信息
這篇文章主要介紹了python實現(xiàn)批量獲取指定文件夾下的所有文件的廠商信息的方法,是非常實用的技巧,涉及到文件的讀寫與字典的操作等技巧,需要的朋友可以參考下2014-09-09Python打印scrapy蜘蛛抓取樹結(jié)構(gòu)的方法
這篇文章主要介紹了Python打印scrapy蜘蛛抓取樹結(jié)構(gòu)的方法,實例分析了打印scrapy蜘蛛抓取樹結(jié)構(gòu)的技巧,非常具有實用價值,需要的朋友可以參考下2015-04-04Python面向?qū)ο蟪绦蛟O計之靜態(tài)方法、類方法、屬性方法原理與用法分析
這篇文章主要介紹了Python面向?qū)ο蟪绦蛟O計之靜態(tài)方法、類方法、屬性方法,結(jié)合實例形式分析了Python靜態(tài)方法、類方法、屬性方法相關概念、原理、用法及相關操作注意事項,需要的朋友可以參考下2020-03-03