欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python3 logging日志封裝實(shí)例

 更新時(shí)間:2020年04月08日 09:09:02   作者:偽善者  
這篇文章主要介紹了python3 logging日志封裝實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

一個(gè)完整的程序離不開日志,無(wú)論是開發(fā)階段,還是測(cè)試階段,亦或程序運(yùn)行階段,都可以通過(guò)日志查看程序的運(yùn)行情況,或是定位問(wèn)題。

下面是對(duì) python3 的日志庫(kù) logging 進(jìn)行了封裝,對(duì)于大部分的需求應(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)行日志、審計(jì)日志),則不能使用單例模式(注釋或刪除此行)。此外,還需設(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: 日志級(jí)別["NOTSET"|"DEBUG"|"INFO"|"WARNING"|"ERROR"|"CRITICAL"],默認(rèn)為INFO
    :param name: 日志中打印的name,默認(rèn)為運(yùn)行程序的name
    :param log_name: 日志文件的名字,默認(rèn)為當(dāng)前時(shí)間(年-月-日.log)
    :param log_path: 日志文件夾的路徑,默認(rèn)為logger.py同級(jí)目錄中的log文件夾
    :param use_console: 是否在控制臺(tái)打印,默認(rèn)為True
    """
    if not set_level:
      set_level = self._exec_type() # 設(shè)置set_level為None,自動(dòng)獲取當(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è)置日志級(jí)別
    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("這是一個(gè) critical 級(jí)別的問(wèn)題!")
x.error("這是一個(gè) error 級(jí)別的問(wèn)題!")
x.warning("這是一個(gè) warning 級(jí)別的問(wèn)題!")
x.info("這是一個(gè) info 級(jí)別的問(wèn)題!")
x.debug("這是一個(gè) debug 級(jí)別的問(wèn)題!")
 
x.log(50, "這是一個(gè) critical 級(jí)別的問(wèn)題的另一種寫法!")
x.log(40, "這是一個(gè) error 級(jí)別的問(wèn)題的另一種寫法!")
x.log(30, "這是一個(gè) warning 級(jí)別的問(wèn)題的另一種寫法!")
x.log(20, "這是一個(gè) info 級(jí)別的問(wèn)題的另一種寫法!")
x.log(10, "這是一個(gè) debug 級(jí)別的問(wèn)題的另一種寫法!")
 
x.log(51, "這是一個(gè) Level 51 級(jí)別的問(wèn)題!")
x.log(11, "這是一個(gè) Level 11 級(jí)別的問(wèn)題!")
x.log(9, "這條日志等級(jí)低于 debug,不會(huì)被打印")
x.log(0, "這條日志同樣不會(huì)被打印")
 
 
"""
運(yùn)行結(jié)果:
2018-10-12 00:18:06,562 - demo - CRITICAL - 這是一個(gè) critical 級(jí)別的問(wèn)題!
2018-10-12 00:18:06,562 - demo - ERROR - 這是一個(gè) error 級(jí)別的問(wèn)題!
2018-10-12 00:18:06,562 - demo - WARNING - 這是一個(gè) warning 級(jí)別的問(wèn)題!
2018-10-12 00:18:06,562 - demo - INFO - 這是一個(gè) info 級(jí)別的問(wèn)題!
2018-10-12 00:18:06,562 - demo - DEBUG - 這是一個(gè) debug 級(jí)別的問(wèn)題!
2018-10-12 00:18:06,562 - demo - CRITICAL - 這是一個(gè) critical 級(jí)別的問(wèn)題的另一種寫法!
2018-10-12 00:18:06,562 - demo - ERROR - 這是一個(gè) error 級(jí)別的問(wèn)題的另一種寫法!
2018-10-12 00:18:06,562 - demo - WARNING - 這是一個(gè) warning 級(jí)別的問(wèn)題的另一種寫法!
2018-10-12 00:18:06,562 - demo - INFO - 這是一個(gè) info 級(jí)別的問(wèn)題的另一種寫法!
2018-10-12 00:18:06,562 - demo - DEBUG - 這是一個(gè) debug 級(jí)別的問(wèn)題的另一種寫法!
2018-10-12 00:18:06,562 - demo - Level 51 - 這是一個(gè) Level 51 級(jí)別的問(wèn)題!
2018-10-12 00:18:06,562 - demo - Level 11 - 這是一個(gè) Level 11 級(jí)別的問(wèn)題!
"""
2018-10-12.log

2018-10-12 00:18:06,562 - demo - CRITICAL - 這是一個(gè) critical 級(jí)別的問(wèn)題!
2018-10-12 00:18:06,562 - demo - ERROR - 這是一個(gè) error 級(jí)別的問(wèn)題!
2018-10-12 00:18:06,562 - demo - WARNING - 這是一個(gè) warning 級(jí)別的問(wèn)題!
2018-10-12 00:18:06,562 - demo - INFO - 這是一個(gè) info 級(jí)別的問(wèn)題!
2018-10-12 00:18:06,562 - demo - DEBUG - 這是一個(gè) debug 級(jí)別的問(wèn)題!
2018-10-12 00:18:06,562 - demo - CRITICAL - 這是一個(gè) critical 級(jí)別的問(wèn)題的另一種寫法!
2018-10-12 00:18:06,562 - demo - ERROR - 這是一個(gè) error 級(jí)別的問(wèn)題的另一種寫法!
2018-10-12 00:18:06,562 - demo - WARNING - 這是一個(gè) warning 級(jí)別的問(wèn)題的另一種寫法!
2018-10-12 00:18:06,562 - demo - INFO - 這是一個(gè) info 級(jí)別的問(wèn)題的另一種寫法!
2018-10-12 00:18:06,562 - demo - DEBUG - 這是一個(gè) debug 級(jí)別的問(wèn)題的另一種寫法!
2018-10-12 00:18:06,562 - demo - Level 51 - 這是一個(gè) Level 51 級(jí)別的問(wèn)題!
2018-10-12 00:18:06,562 - demo - Level 11 - 這是一個(gè) Level 11 級(jí)別的問(wèn)題!

以上這篇python3 logging日志封裝實(shí)例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論