印刷機能は通常、コンソールで印刷するときに使用されますが、通常は統一フォーマットが含まれている進行状況情報を印刷する必要がある場合は、印刷機能を使用する方が面倒です。さらに、情報をファイルに書き込む必要がある場合は、ファイルを作成して書き込みます情報、ファイル管理、頻繁な開閉はそれほど危険ではありません。Python言語の場合、ロギングモジュールは上記の問題を解決できます。
1.フォーマット設定
印刷する必要がある場所ではなく、直接ログを使用します。ログは、デバッグ、情報、警告、エラー、およびクリティカルの5つのレベルに分けられます(レベルは順次増加します)。デフォルトでは、警告より上のレベル(警告、エラー、およびクリティカル)のみが出力されます。上記のログをデバッグして印刷し、印刷形式を変更する必要がある場合は、basicConfig関数を使用してロギングを設定する必要があります。
logging.basicConfig(format='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s',
level=logging.DEBUG)
印刷形式を設定するためのそれらの形式の中で、特定の意味はhttps://blog.csdn.net/orca123456/article/details/84864785を参照できます
levelは印刷の最小レベルです。debug<info <warning <error <criticalなので、debugに設定すると、すべてのレベルのログが印刷されます。
次に、ファイルを保存します
デフォルトでは、ロギングはコンソールにのみ出力され、ファイルシステムには保存されません。ログを保存する必要がある場合は、getLogger()メソッドを使用してログオブジェクトを取得して設定する必要があります。https://www.cnblogs.com/nancyzhu/p/8551506.htmlを参照してください
import logging
from logging import handlers
class Logger(object):
level_relations = {
'debug':logging.DEBUG,
'info':logging.INFO,
'warning':logging.WARNING,
'error':logging.ERROR,
'crit':logging.CRITICAL
}#日志级别关系映射
def __init__(self,filename,level='info',when='D',backCount=3,fmt='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'):
self.logger = logging.getLogger(filename)
format_str = logging.Formatter(fmt)#设置日志格式
self.logger.setLevel(self.level_relations.get(level))#设置日志级别
sh = logging.StreamHandler()#往屏幕上输出
sh.setFormatter(format_str) #设置屏幕上显示的格式
th = handlers.TimedRotatingFileHandler(filename=filename,when=when,backupCount=backCount,encoding='utf-8')#往文件里写入#指定间隔时间自动生成文件的处理器
#实例化TimedRotatingFileHandler
#interval是时间间隔,backupCount是备份文件的个数,如果超过这个个数,就会自动删除,when是间隔的时间单位,单位有以下几种:
# S 秒
# M 分
# H 小时、
# D 天、
# W 每星期(interval==0时代表星期一)
# midnight 每天凌晨
th.setFormatter(format_str)#设置文件里写入的格式
self.logger.addHandler(sh) #把对象加到logger里
self.logger.addHandler(th)
if __name__ == '__main__':
log = Logger('all.log',level='debug')
log.logger.debug('debug')
log.logger.info('info')
log.logger.warning('警告')
log.logger.error('报错')
log.logger.critical('严重')
Logger('error.log', level='error').logger.error('error')
3、カラーログ付き
通常の状況では、色付きのログが必要です。通常、エラーとクリティカルは赤で示され、警告はオレンジで示され、情報は緑で示されます。また、log.loggerをそれほど長期間使用したくありません。また、アプリケーションの前に毎回オブジェクトを再生成したくありません。以下は特定の実装です。
import logging
from colorma import Fore,style
# 获取对象
def get_logger():
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
if not logger.handlers:
ch = logging.StreamHandler(sys.stdout)
ch.setLevel(logging.DEBUG)
formatter = logging.Formatter(
" %(message)s")
ch.setFormatter(formatter)
logger.addHandler(ch)
return logger
#通过静态成员方法来调用
class Log:
logger = get_logger()
@staticmethod
def debug(msg):
Log.logger.debug(Fore.WHITE + "[DEBUG]: " + str(msg) + Style.RESET_ALL)
@staticmethod
def info(msg):
Log.logger.info(Fore.GREEN + "[INFO]: " + str(msg) + Style.RESET_ALL)
@staticmethod
def warning(msg):
Log.logger.warning("\033[38;5;214m" + "[WARNING]: " + str(msg) + "\033[m")
@staticmethod
def error(msg):
Log.logger.error(Fore.RED + "[ERROR]: " + str(msg) + Style.RESET_ALL)
@staticmethod
def critical(msg):
Log.logger.critical(Fore.RED + "[CRITICAL]: " + str(msg) + Style.RESET_ALL)
これを使用すると、ログをインポートするだけでよく、特定の場所(Log.info( "I am green")など)で直接使用でき、ログの色が変更されたことがわかります。
しかし、ファイルを書き込む必要がある場合、ファイル名をカプセル化によってどのように渡すことができますか?このコンテンツは後で更新されます