Python基础之日志封装一、日志等级Debug : 打印全部的日志,详细的信息,通常只出现在诊断问题上Info : 打印info,warning,error,critical级别的日志,确认一切按预期运行Warning : 打印warning,error,critical级别的日志,一个迹象表明,一些意想不到的事情发生了,或表明一些问题在不久的将来(例如磁盘空间低),这个软件还能按预期工作Error : 打印error,critical级别的日志,更严重的问题,软件没能执行一些功能Critical : 打印critical级别,一个严重的错误,这表明程序本身可能无法继续运行级别排序CRITICAL ERROR WARNING INFO DEBUG在控制台输出日志import logging logging.basicConfig(levellogging.INFO) # 通过basicConfig设置日志级别 logging.debug(这是一条 debug 等级的日志) logging.info(这是一条 info 等级的日志) logging.warning(这是一条 warning 等级的日志) logging.error(这是一条 error 等级的日志) logging.critical(这是一条 critical 等级的日志) INFO:root:这是一条 info 等级的日志 WARNING:root:这是一条 warning 等级的日志 ERROR:root:这是一条 error 等级的日志 CRITICAL:root:这是一条 critical 等级的日志运行上述代码在控制台分别回显了 INFO 、WARNING、ERROR、CRITICAL级别的日志是因为在日志配置函数basicConfig( ) 中 level logging.INFO等级低于 INFO 的 DEBUG 日志不会被记录而等级等于或高于 INFO 的日志都会被记录二、logging中常用方法1、logging.Formatter 这是一个配置日志格式的类自定义日志按何种样式记录和展示2、logger logging.getLogger( ): 生成一个logging模块的主体为程序提供记录日志的接口并根据日志级别把对应日志分发给不同 handler3、logging.FileHandler( ): 把日志记录输出到文件4、logging.StreamHandler( ): 把日志记录输出出控制台5、logger.setLevel( ): 设置总的日志级别6、logger.addHandler( ): 添加一个Handler (FileHandler、StreamHandler7、Handler.setLevel( ): 设置handler 的日志级别8、Handler.setFormatter( ): 设置handler 的输出格式三、Formatter常用格式%(levelno)s: 打印日志级别的数值 %(levelname)s: 打印日志级别名称 %(pathname)s: 打印当前执行程序的路径 %(filename)s: 打印当前执行程序名 %(funcName)s: 打印日志的当前函数 %(lineno)d: 打印日志的当前行号 %(asctime)s: 打印日志的时间 %(thread)d: 打印线程ID %(threadName)s: 打印线程名称 %(process)d: 打印进程ID %(message)s: 打印日志信息四、把日志输出到控制台import logging logger logging.getLogger() logger.setLevel(logging.INFO) ch logging.StreamHandler() # 输出日志到控制台 ch.setLevel(logging.INFO) # 输出到控制台的日志等级 # 定义日志handler的输出格式 fmt logging.Formatter(%(asctime)s - %(filename)s:[%(lineno)s] - [%(levelname)s] - %(message)s) ch.setFormatter(fmt) logger.addHandler(ch) logger.info(这是一个 INFO 日志) # 2021-06-30 10:29:46,043 - study02.py:[15] - [INFO] - 这是一个 INFO 日志1、首先通过getLogger( ) 创建一个logging的主体对象logger供程序调用2、通过 setLevel( ) 设置日志总的等级3、创建一个Handler对象chstreamHandler 为输出日志到控制台4、为这个Handler实例ch 通过setLevel 设定输出到控制台的日志等级5、通过Formatter定义日志的输出格式fmt6、通过调用Handler的setFormatter把fmt对象作为参数传入来定义输出到控制台的日志格式7、调用logger.addHandler把Handler对象ch添加到logger主体中五、把日志输出到文件import logging import time import os logger logging.getLogger() logger.setLevel(logging.INFO) currTime time.strftime(%Y-%m-%d) log_py_path os.path.abspath(__file__) # 当前py文件的绝对路径,会定位到对应py文件 log_dir_path os.path.split(log_py_path)[0] # 当前py文件的文件夹路径 pro_path os.path.dirname(log_dir_path) # 当前py文件对应文件夹的上层目录路径 Log_path pro_path /Logs/ log_name Log_path currTime .log fh logging.FileHandler(file_path, modea) # mode a 为在原日志上追加w为覆盖 输出日志到文件 fh.setLevel(logging.INFO) # 输出到 file 的日志等级 # 定义日志handler的输出格式 fmt logging.Formatter(%(asctime)s - %(filename)s:[%(lineno)s] - [%(levelname)s] - %(message)s) fh.setFormatter(fmt) logger.addHandler(fh) logger.info(这是一个 INFO 日志)1、首先通过getLogger( ) 创建一个logging的对象主体logger供程序调用2、通过 setLevel( ) 设置日志总的等级3、time.strftime(%Y-%m-%d) 获取当地时间按年-月-日4、os.path.abspath(os.getcwd( )) 获取当前工作目录的绝对路径5、创建一个Handler对象fhFileHandler 为输出日志到文件6、为这个Handler对象fh 通过setLevel 设定输出到文件的日志等级7、通过Formatter定义日志的输出格式fmt8、通过调用Handler的setFormatter把fmt对象作为参数传入来定义输出到控制台的日志格式9、调用logger.addHandler把Handler对象ch添加到logger主体中封装一个日志类import logging import time import os class Logger: def __init__(self, name, logger_levelINFO, stream_levelINFO, file_levelINFO): # 创建一个 logger self.__logger logging.getLogger(name) # 设置Log等级总开关 self.__logger.setLevel(logger_level) # 创建 handler用于日志写入 currTime time.strftime(%Y-%m-%d-%H) # 获取日期年-月-日-时 log_py_path os.path.abspath(__file__) # 当前py文件的绝对路径,会定位到对应py文件 log_dir_path os.path.split(log_py_path)[0] # 当前py文件的文件夹路径 pro_path os.path.dirname(log_dir_path) # 当前py文件对应文件夹的上层目录路径 Log_path pro_path \\Logs\\ log_name Log_path currTime .log fh logging.FileHandler(log_name, modea) # mode a 为在原日志上追加w为覆盖 输出日志到文件 fh.setLevel(file_level) # 输出到 file 的日志等级 ch logging.StreamHandler() # 输出日志到控制台 ch.setLevel(stream_level) # 输出到控制台的日志等级 # 定义日志handler的输出格式 fmt logging.Formatter(%(asctime)s - %(filename)s:[%(lineno)s] - [%(levelname)s] - %(message)s) fh.setFormatter(fmt) ch.setFormatter(fmt) # 添加 logger 到 handler里面 self.__logger.addHandler(fh) self.__logger.addHandler(ch) def get_logger(self): return self.__logger