一,日志的作用
展现当前程序的活动情况,记录程序的运行轨迹,规范稳定的日志可以帮助开发者迅速定位程序的问题.
二,日志的内容
正常情况下,一条完整的日志应该包含调用日志的时间戳,数字形式的日志级别,调用日志的实例化函数的路径,线程名,抛出的活动信息。
三,日志等级
日志级别名称 |
日志级别数值 |
DEBUG |
10 |
INFO |
20 |
WARNING |
30 |
ERROR |
40 |
CRITICAL |
50 |
四,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 |
打印日志信息 |
五,基本使用
#导入loogging日志模块
import logging
#创建日志对象,默认用户为Admin
logger = logging.getLogger('Admin')
#定义处理器
ConsoleHandler = logging.StreamHandler()
FileHandler = logging.FileHandler("log/all.log")
#设置处理器输出格式
ConsoleHandler = "[%(name)s][%(levelname)s][%(asctime)s][%(lineno)s][%(message)s]"
FileHandler = "[%(name)s][%(levelname)s][%(asctime)s][%(lineno)s][%(message)s]"
#日志格式
Format_ConsoleHandler = logging.Formatter(fmt=ConsoleHandler)
Format_FileHandler = logging.Formatter(fmt=FileHandler)
#添加处理格式
ConsoleHandler .setFormatter(Format_ConsoleHandler)
FileHandler.setFormatter(Format_FileHandler)
#日志等级
ConsoleHandler.setLevel(level="WARNING")
FileHandler.setLevel(level="INFO")
logger.addHandler(ConsoleHandler)
logger.addHandler(FileHandler)
logger.debug("这是DEBUG")
logger.info("这是INFO")
logger.warning("这是warning")
logger.error("这是warning")
logger.critical("这是critical")
六,基本封装
控制日志输出格式:
logging.Formatter(fmt = '%(asctime)s') 日志输出日志打印时间
控制日志输出等级:
控制台只输出等级在WARNING以及之上的日志console_handler.setLeave('WARNING') 日志文件只输出等级在INFO以及之上的日志file_handler.setLeave('INFO')
控制输出日志路径以及文件名:
log = Logging()
logger = log.get_log('./test.log')
import logging
class Logging():
def __init__(self,username=None,level="DEBUG"):
#创建日志对象
self.log = logging.getLogger(username)
self.log.setLevel(level)
def ConsoleHandle(self,level="WARNING"):
#创建控制台处理器
console_handler = logging.StreamHandler()
console_handler.setLevel(level)
console_handler.setFormatter(self.get_formatter()[0])
return console_handler
def FileHandle(self,path,level="INFO"):
#创建文件处理器
file_handler = logging.FileHandler(path,encoding='gbk')
file_handler.setLevel(level)
file_handler.setFormatter(self.get_formatter()[1])
return file_handler
def get_formatter(self):
#日志文本格式
ConsoleHandle = logging.Formatter(fmt="[%(name)s][%(levelname)s][%(asctime)s][%(lineno)s][%(message)s]")
FileHandle = logging.Formatter(fmt="[%(name)s][%(levelname)s][%(asctime)s][%(lineno)s][%(message)s]")
return ConsoleHandle,FileHandle
def get_log(self,path):
self.log.addHandler(self.ConsoleHandle())
self.log.addHandler(self.FileHandle(path))
return self.log
if __name__ == '__main__':
log = Logging()
#可以配置all.log存放的路径
logger = log.get_log('./all.log')
logger.debug("debug开始执行")
logger.info("info开始执行")
logger.warning("warning结束执行")
logger.error("error结束执行")
logger.critical("critical结束执行")
运行结果如下:
![](https://img-blog.csdnimg.cn/155bd97d973149c28971d43ccf4c00f9.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5biF5YaS,size_20,color_FFFFFF,t_70,g_se,x_16)
![](https://img-blog.csdnimg.cn/e61345766aff411193bc21b8c14a413b.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5biF5YaS,size_20,color_FFFFFF,t_70,g_se,x_16)