目录
1.什么是日志?
日志是一种可以追踪某些软甲运行时所发生的事情的方法。
2.日志有什么用?
程序调试
排错
用户行为分析
3.日志的五个级别
日志登记 数值表示 描述 debug 10 最详细的日志信息,用于诊断问题 INFO 20 详细日志信息仅次于DEBUG,记录关键节点的信息 WARNING 30(默认) 当前不期望发生的事情 ERROR 40 发生错误导致某些功能不能正常使用 CRITICAL 50 发生严重错误导致程序不能继续运行时使用
4.logging模块
4.1使用logging模块
4.2修改日志配置
import logging
logging.basicConfig(level=logging.DEBUG, format = " %(asctime)s - %(levelname)s -%(message)s", filename = "test.txt")
#level参数可以调整日志记录级别,这里调整为debug,即五种日志都会记录
#format参数调整日志的格式,这里调整为显示当前时间+日志级别+日志信息
#filename参数为调整为输出到文件,不输出到屏幕
logging.debug("This is a debug")
logging.info("This is a info")
logging.warning("This is a warning")
logging.error("This is a error")
logging.critical("This is a critical")
5.logging日志系统的四大组件
日志器 logger
处理器 Handler
过滤器 Filter
格式器 Formatter
import logging
# 获取logger对象,用于记录日志
logger = logging.getLogger()
# 设置一个日志记录级别
logger.setLevel(logging.DEBUG)
# 创建一个handler,用于写入日志,输出到文件
fh = logging.FileHandler(filename)
# 创建一个handler,用于输出到屏幕
ch = logging.StreamHandler()
# 创建一个formatter,用于处理日志格式
formatter = logging.Formatter('%(asctime)s - %(levelname)s -%(message)s')
# 绑定formatter 到handler上
fh.setFormatter(formatter)
ch.setFormatter(formatter)
# 绑定handler到logger对象上
logger.addHandler(fh)
logger.addHandler(ch)
# 定义好函数,我们直接调用就可以了
# 记录一条日志
logger.debug("This is a debug")
#我创建了一个格式器formatter,两个处理器fh和ch。
#将格式器绑定到处理器上,然后将处理器绑定到logger对象,接下来我们对logger操作即可。
#记录的一条日志既输出到屏幕上也输出到文件内。
6.logging.getlogger()
获取一个日志器
我们查看getlogger函数定义可知,如果有传入指定名称,会返回一个root.name的日志器。
如果没有指定名称,则会返回一个root日志器。
root相当于linux中的/,指定名称相当于在root下一级创建。
def getLogger(name=None):
"""
Return a logger with the specified name, creating it if necessary.
If no name is specified, return the root logger.
"""
if not name or isinstance(name, str) and name == root.name:
return root
return Logger.manager.getLogger(name)
7.让每个文件都有专属的日志记录文件
使用函数包装可以实现,在一个文件logset中创建一个产生日志文件的函数
import logging
def set_log(filename):
# 获取logger对象,用于记录日志
logger = logging.getLogger()
#设置日志记录级别
logger.setLevel(logging.DEBUG)
# 创建一个handler,用于写入日志,输出到文件
fh = logging.FileHandler(filename)
# 创建一个handler,用于输出到屏幕
ch = logging.StreamHandler()
# 创建一个formatter,用于处理日志格式
formatter = logging.Formatter('%(asctime)s - %(levelname)s -%(message)s')
# 绑定formatter 到handler上
fh.setFormatter(formatter)
ch.setFormatter(formatter)
# 绑定handler到logger对象上
logger.addHandler(fh)
logger.addHandler(ch)
#在其余文件中导入logset函数的set_log方法,调用即可产生自定义的日志文件
import logging
from logset import set_log
set_log("logchild.txt")
8.日志记录算法
轮询记录
import logging
from logging.handlers import TimedRotatingFileHandler,RotatingFileHandler
# 获取logger对象,用于记录日志
def set_log(filename):
logger = logging.getLogger()
# 创建一个handler,用于写入日志,输出到文件
fh = TimedRotatingFileHandler(filename, when = "S", interval = 1, backupCount = 3)
# 文件名 秒 1 3个日志
#fh = RotatingFileHandler(filename, maxBytes=500, backupCount=2)
#写入500个字节就轮转一次
# 创建一个handler,用于输出到屏幕
# fh = logging.FileHandler(filename)
ch = logging.StreamHandler()
# 创建一个formatter,用于处理日志格式
formatter = logging.Formatter('%(asctime)s - %(levelname)s -%(message)s')
# 绑定formatter 到handler上
fh.setFormatter(formatter)
ch.setFormatter(formatter)
# 绑定handler到logger对象上
logger.addHandler(fh)
logger.addHandler(ch)
logger.setLevel(logging.DEBUG)
import time
set_log("RR.txt")
logger = logging.getLogger(__name__)
for i in range(5):
time.sleep(0.5)
logger.warning("this is rotate time")