目录
1.什么是日志?
2.日志有什么用?
3.日志的五个级别
4.logging模块
5.logging日志系统的四大组件
6.logging.getlogger()
7.让每个文件都有专属的日志记录文件
8.日志记录算法
日志是一种可以追踪某些软甲运行时所发生的事情的方法。
程序调试
排错
用户行为分析
日志登记 数值表示 描述 debug 10 最详细的日志信息,用于诊断问题 INFO 20 详细日志信息仅次于DEBUG,记录关键节点的信息 WARNING 30(默认) 当前不期望发生的事情 ERROR 40 发生错误导致某些功能不能正常使用 CRITICAL 50 发生严重错误导致程序不能继续运行时使用
4.1使用logging模块
使用import导入模块logging
日志的默认级别为warning,只有不低于warning级别的日志才会输出
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")
日志器 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操作即可。
#记录的一条日志既输出到屏幕上也输出到文件内。
获取一个日志器
我们查看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)
使用函数包装可以实现,在一个文件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")
轮询记录
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")