一,日志的作用
展现当前程序的活动情况,记录程序的运行轨迹,规范稳定的日志可以帮助开发者迅速定位程序的问题.
二,日志的内容
正常情况下,一条完整的日志应该包含调用日志的时间戳,数字形式的日志级别,调用日志的实例化函数的路径,线程名,抛出的活动信息。
三,日志等级
日志级别名称 | 日志级别数值 |
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结束执行")
运行结果如下: