python3 logging日志封裝實例
一個完整的程序離不開日志,無論是開發(fā)階段,還是測試階段,亦或程序運(yùn)行階段,都可以通過日志查看程序的運(yùn)行情況,或是定位問題。
下面是對 python3 的日志庫 logging 進(jìn)行了封裝,對于大部分的需求應(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)行日志、審計日志),則不能使用單例模式(注釋或刪除此行)。此外,還需設(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: 日志級別["NOTSET"|"DEBUG"|"INFO"|"WARNING"|"ERROR"|"CRITICAL"],默認(rèn)為INFO
:param name: 日志中打印的name,默認(rèn)為運(yùn)行程序的name
:param log_name: 日志文件的名字,默認(rèn)為當(dāng)前時間(年-月-日.log)
:param log_path: 日志文件夾的路徑,默認(rèn)為logger.py同級目錄中的log文件夾
:param use_console: 是否在控制臺打印,默認(rèn)為True
"""
if not set_level:
set_level = self._exec_type() # 設(shè)置set_level為None,自動獲取當(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è)置日志級別
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, "這條日志同樣不會被打印")
"""
運(yùn)行結(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 重復(fù)寫日志問題解決辦法詳解
- Python logging日志模塊 配置文件方式
- 詳解python logging日志傳輸
- Python基于yaml文件配置logging日志過程解析
- Python日志logging模塊功能與用法詳解
- python 日志 logging模塊詳細(xì)解析
- 解決Python logging模塊無法正常輸出日志的問題
- python logging 日志的級別調(diào)整方式
- python 如何對logging日志封裝
相關(guān)文章
從零學(xué)Python之入門(五)縮進(jìn)和選擇
空白在Python中是重要的。事實上行首的空白是重要的。它稱為縮進(jìn)。在邏輯行首的空白(空格和制表符)用來決定邏輯行的縮進(jìn)層次,從而用來決定語句的分組。2014-05-05
Python?OpenCV的基本使用及相關(guān)函數(shù)
這篇文章主要介紹了Python-OpenCV的基本使用和相關(guān)函數(shù)介紹,主要包括圖像的讀取保存圖像展示問題,結(jié)合實例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05
Appium+python+unittest搭建UI自動化框架的實現(xiàn)
本文主要介紹了Appium+python+unittest搭建UI自動化框架的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-03-03
Django使用uwsgi部署時的配置以及django日志文件的處理方法
今天小編就為大家分享一篇Django使用uwsgi部署時的配置以及django日志文件的處理方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08
Python自動化辦公Excel模塊openpyxl原理及用法解析
這篇文章主要介紹了Python自動化辦公Excel模塊openpyxl原理及用法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-11-11

