python3 logging日志封裝實例
更新時間:2020年04月08日 09:09:02 作者:偽善者
這篇文章主要介紹了python3 logging日志封裝實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
一個完整的程序離不開日志,無論是開發(fā)階段,還是測試階段,亦或程序運行階段,都可以通過日志查看程序的運行情況,或是定位問題。
下面是對 python3 的日志庫 logging 進行了封裝,對于大部分的需求應該是能滿足的。(如果有不滿足的地方,歡迎在下方留言)
程序結構:
|--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, "這條日志同樣不會被打印")
"""
運行結果:
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日志封裝實例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
您可能感興趣的文章:
- 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 日志的級別調整方式
- python 如何對logging日志封裝
相關文章
Appium+python+unittest搭建UI自動化框架的實現(xiàn)
本文主要介紹了Appium+python+unittest搭建UI自動化框架的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-03-03
Django使用uwsgi部署時的配置以及django日志文件的處理方法
今天小編就為大家分享一篇Django使用uwsgi部署時的配置以及django日志文件的處理方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08
Python自動化辦公Excel模塊openpyxl原理及用法解析
這篇文章主要介紹了Python自動化辦公Excel模塊openpyxl原理及用法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-11-11
python算法與數(shù)據(jù)結構之冒泡排序實例詳解
冒泡排序(英語:Bubble Sort)是一種簡單的排序算法。它重復地遍歷要排序的數(shù)列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。這篇文章主要介紹了python算法與數(shù)據(jù)結構-冒泡排序(32)的相關資料,需要的朋友可以參考下2019-06-06

