乙個完整的程式離不開日誌,無論是開發階段,還是測試階段,亦或程式執行階段,都可以通過日誌檢視程式的運**況,或是定位問題。
下面是對 python3 的日誌庫 logging 進行了封裝,對於大部分的需求應該是能滿足的。
程式結構:
|--logger.py
||--singleton.py
||--demo.py
||--log
| |
| 2019-07-01.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.ar**[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
"""ifnot set_level:
set_level = self._exec_type(
)# 設定set_level為none,自動獲取當前執行模式
self.__logger = logging.getlogger(name)
self.setlevel(
getattr
(logging, set_level.upper())
ifhasattr
(logging, set_level.upper())
else logging.info)
# 設定日誌級別
ifnot os.path.exists(log_path)
:# 建立日誌目錄
os.makedirs(log_path)
formatter = logging.formatter(
"%(asctime)s - %(name)s - %(levelname)s - %(message)s"
) handler_list =
list()
, encoding=
"utf-8"))
if use_console:))
for handler in handler_list:
handler.setformatter(formatter)
self.addhandler(handler)
def__getattr__
(self, item)
:return
getattr
(self.logger, item)
@property
deflogger
(self)
:return self.__logger
@logger.setter
deflogger
(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
defcls
(self)
:return self.__cls
@cls.setter
defcls(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,
"這條日誌同樣不會被列印"
)
2019-07-01.log
2019-07-01 11:48:38,802 - demo - critical - 這是乙個 critical 級別的問題!
2019-07-01 11:48:38,802 - demo - error - 這是乙個 error 級別的問題!
2019-07-01 11:48:38,802 - demo - warning - 這是乙個 warning 級別的問題!
2019-07-01 11:48:38,802 - demo - info - 這是乙個 info 級別的問題!
2019-07-01 11:48:38,802 - demo - debug - 這是乙個 debug 級別的問題!
2019-07-01 11:48:38,802 - demo - critical - 這是乙個 critical 級別的問題的另一種寫法!
2019-07-01 11:48:38,802 - demo - error - 這是乙個 error 級別的問題的另一種寫法!
2019-07-01 11:48:38,803 - demo - warning - 這是乙個 warning 級別的問題的另一種寫法!
2019-07-01 11:48:38,803 - demo - info - 這是乙個 info 級別的問題的另一種寫法!
2019-07-01 11:48:38,803 - demo - debug - 這是乙個 debug 級別的問題的另一種寫法!
2019-07-01 11:48:38,803 - demo - level 51 - 這是乙個 level 51 級別的問題!
2019-07-01 11:48:38,803 - demo - level 11 - 這是乙個 level 11 級別的問題!
2019-07-01 11:48:54,207 - demo - critical - 這是乙個 critical 級別的問題!
python3 logging 模組使用教程
import logging info warning error critical logging.debug debug message logging.info info message logging.warning warning message logging.error error m...
Python3日誌記錄模組logging
日誌等級 等級描述 debug 最詳細的日誌資訊,典型應用場景是問題診斷 info 資訊詳細程度僅次於debug,通常只記錄關鍵節點資訊,用於確認一切都是按照我們預期的那樣進行工作 warning 當某些不期望的事情發生時記錄的資訊 如,磁碟可用空間較低 但是此時應用程式還是正常執行的 error ...
Python模組 logging模組列印日誌
python模組 logging 一 簡單日誌列印 直接使用logging模組,列印日誌到螢幕 預設輸出日誌的格式 日誌級別 logger名稱 使用者輸出訊息 預設的日誌級別設定為warning,logging模組將日誌列印到標準輸出中,且只顯示大於等於warning級別的日誌 日誌級別等級crit...