完全なプログラムはログから切り離せません。開発フェーズ、テストフェーズ、またはプログラム操作フェーズのいずれであっても、ログを使用してプログラムの実行ステータスを表示したり、問題を特定したりできます。
以下は、python3のロギングライブラリのカプセル化です。これは、ほとんどの要件を満たすことができるはずです。 (満足できない場合は、以下にメッセージを残してください)
プログラムの構造:
|- - 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 #異なるパスのログ(実行ログ、監査ログ)を印刷する必要がある場合、シングルトンモードを使用することはできません(この行をコメントまたは削除してください)。また、パラメータ名を設定する必要があります。
classLogger:
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:ログに出力される名前。デフォルトは実行中のプログラムの名前です。
: param log_name:ログファイルの名前。デフォルトは現在の時刻(年)です。-月-日.log)
: param log_path:ログフォルダのパス。デフォルトはロガーです。.同じレベルのディレクトリにあるpyログフォルダ
: param use_console:コンソールで印刷するかどうか、デフォルトはTrueです
"""
if not set_level:
set_level = self._exec_type() #セットする_レベルがNoneの場合、現在の動作モードが自動的に取得されます
self.__logger = logging.getLogger(name)
self.setLevel(getattr(logging, set_level.upper())ifhasattr(logging, set_level.upper())else logging.INFO) #ログレベルを設定する
if not os.path.exists(log_path): #ログディレクトリを作成します
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):returngetattr(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
classSingleton:"""
シングルトンデコレータ。
"""
__ 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("これは重要なレベルの質問です!")
x.error("これはエラーレベルの問題です!")
x.warning("これは警告レベルの質問です!")
x.info("これは情報レベルの質問です!")
x.debug("これはデバッグレベルの問題です。")
x.log(50,"これは、クリティカルレベルの質問を書く別の方法です。")
x.log(40,"これは、エラーレベルの問題を記述する別の方法です。")
x.log(30,"これは、警告レベルの質問を書く別の方法です。")
x.log(20,"これは、情報レベルの質問を書く別の方法です。")
x.log(10,"これは、デバッグレベルの問題を記述する別の方法です。")
x.log(51,"これはレベル51の問題です。")
x.log(11,"これはレベル11の質問です!")
x.log(9,"ログレベルはデバッグよりも低く、印刷されません")
x.log(0,"このログも印刷されません")"""
動作結果:
2018- 10- 1200:18:06,562- demo - CRITICAL -これは重要なレベルの質問です!
2018- 10- 1200:18:06,562- demo - ERROR -これはエラーレベルの問題です!
2018- 10- 1200:18:06,562- demo - WARNING -これは警告レベルの質問です!
2018- 10- 1200:18:06,562- demo - INFO -これは情報レベルの質問です!
2018- 10- 1200:18:06,562- demo - DEBUG -これはデバッグレベルの問題です。
2018- 10- 1200:18:06,562- demo - CRITICAL -これは、クリティカルレベルの質問を書く別の方法です。
2018- 10- 1200:18:06,562- demo - ERROR -これは、エラーレベルの問題を記述する別の方法です。
2018- 10- 1200:18:06,562- demo - WARNING -これは、警告レベルの質問を書く別の方法です。
2018- 10- 1200:18:06,562- demo - INFO -これは、情報レベルの質問を書く別の方法です。
2018- 10- 1200:18:06,562- demo - DEBUG -これは、デバッグレベルの問題を記述する別の方法です。
2018- 10- 1200:18:06,562- demo - Level 51-これはレベル51の問題です。
2018- 10- 1200:18:06,562- demo - Level 11-これはレベル11の質問です!
"""
2018- 10- 12. log
2018- 10- 1200:18:06,562- demo - CRITICAL -これは重要なレベルの質問です!
2018- 10- 1200:18:06,562- demo - ERROR -これはエラーレベルの問題です!
2018- 10- 1200:18:06,562- demo - WARNING -これは警告レベルの質問です!
2018- 10- 1200:18:06,562- demo - INFO -これは情報レベルの質問です!
2018- 10- 1200:18:06,562- demo - DEBUG -これはデバッグレベルの問題です。
2018- 10- 1200:18:06,562- demo - CRITICAL -これは、クリティカルレベルの質問を書く別の方法です。
2018- 10- 1200:18:06,562- demo - ERROR -これは、エラーレベルの問題を記述する別の方法です。
2018- 10- 1200:18:06,562- demo - WARNING -これは、警告レベルの質問を書く別の方法です。
2018- 10- 1200:18:06,562- demo - INFO -これは、情報レベルの質問を書く別の方法です。
2018- 10- 1200:18:06,562- demo - DEBUG -これは、デバッグレベルの問題を記述する別の方法です。
2018- 10- 1200:18:06,562- demo - Level 51-これはレベル51の問題です。
2018- 10- 1200:18:06,562- demo - Level 11-これはレベル11の質問です!
上記のpython3ロギングログのカプセル化の例は、エディターによって共有されるすべてのコンテンツです。参照を提供したいと思います。
Recommended Posts