python3 logging日誌封裝
阿新 • • 發佈:2022-02-16
一個完整的程式離不開日誌,無論是開發階段,還是測試階段,亦或程式執行階段,都可以通過日誌檢視程式的執行情況,或是定位問題。
下面是對 python3 的日誌庫 logging 進行了封裝,對於大部分的需求應該是能滿足的。
程式結構:
|--logger.py
|
|--singleton.py
|
|--runall.py
|
|--log
| |
| 2022-2-16.log
logger.py
import os import sys import time import logging from .singleton import Singleton @Singleton# 如需列印不同路徑的日誌(執行日誌、審計日誌),則不能使用單例模式(註釋或刪除此行)。此外,還需設定引數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): # 建立日誌目錄 os.makedirs(log_path) formatter = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(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
runall.py
#coding=utf-8 from .logger import Logger log = Logger("debug") log .critical("這是一個 critical 級別的問題!") log .error("這是一個 error 級別的問題!") log .warning("這是一個 warning 級別的問題!") log .info("這是一個 info 級別的問題!") log .debug("這是一個 debug 級別的問題!")
來源:https://www.jb51.net/article/184274.htm