10.日志,日志格式,处理器,日志器,格式器

一、 日志

是用于记录系统运行时的信息,
对事件的记录(点击事件),也称为log

日志作用

调试程序
根据日志,了解系统程序运行的情况,是否正常
系统程序运行故障分析与问题定位
用来做用户行为分析和数据统计

日志级别

指的是 日志信息的优先级、重要性、或者严重程度

  1. debug # 调试级别
  2. info # 信息级别 —— 突出程序的运行过程
  3. warning # 警告 ——国内一般会忽略,但是国外会更加重视
  4. error # 错误级别 —— 打印错误异常信息,该几倍的错误可能会导致系统的一些功能无法正常使用
  5. critical # 严重 —— 一个严重的错误,这表明系统可能无法继续运行

开发常用以上 debug、info、warning、error
测试常用级别:info、error

日志级别是从上到下一次升高的
当为程序指定一个日志级别后,程序会记录所有日志级别大于或等于指定日志级别的日志信息,而不是仅仅记录指定级别的日志信息

二、日志的用法

python 里面有标准库模块直接记录日志 :logging

默认的日志级别是 warning,所以 info 和 debug 没有 显示
在这里插入图片描述

设置日志级别

默认级别是 logging.WARNING
设置级别时,调用的是 logging 文件夹下面的常量(大写),而不是方法(小写)
日志信息之后记录大于等于此级别的信息

# 导包
import logging


# 设置日志级别
# 常量的情况下才大写,小写的话是调用上面的方法
logging.basicConfig(level=logging.DEBUG)



# 调用 指定级别 ,输入日志信息

logging.debug("this is  a debug...")
logging.info("info")
logging.warning("warning")
logging.error("error")
logging.critical("critical")


在这里插入图片描述

更改日志的输出格式

# 导包
import logging


# 设置日志级别
# 常量的情况下才大写,小写的话是调用上面的方法
# logging.basicConfig(level=logging.DEBUG)

# 设置修改默认的日志输出模式
fm = "%(asctime)s %(levelname)s [%(name)s] [%(filename)s (%(funcName)s:%(lineno)d] - %(message)s"
logging.basicConfig(level=logging.DEBUG,format=fm)



# 调用 指定级别 ,输入日志信息

logging.debug("this is  a debug...")
logging.info("info")
logging.warning("warning")
logging.error("error")
logging.critical("critical")


在这里插入图片描述

设置日志保存到指定的文件

用一个参数 filename
有路径的话在后面加一个路径“…/log/error/log”

logging.basicConfig(filename = "a.log")

三、logging 高级用法

1). 为什么要使用高阶用法???

		1. 中文乱码
		2. 无法同时输入到文件和控制台

2). logging组成

  1. Logger 日志器
  2. handler 处理器
  3. formatter 格式器
  4. filter 过滤器

3). 模块关系

  1. Logger日志器:提供了记录日志的入口,如:log.info("")
  2. handler处理器:真正将日志器内容发送到控制台还是文件或网络,都是处理器干的;每个日志器都可以添加多个不同的处理器
  3. formatter格式器:处理器可以设置不同的格式,就需要使用格式器
  4. filter过滤器:处理器需要过滤日志信息,就需要设置过滤器;

日志器logger:

logging 是包名
在这里插入图片描述

操作:

  1. 导包 import logging
  2. 调用方法获取logger对象 # 如: logging.getlogger()
  3. 设置级别:logger.setlevel=logging.INFO
  4. 调用添加处理器方法 logger.addHandler(处理器)

处理器:

类型:
  1. 控制台处理器 StreamHandler()
  2. 文件处理器 fileHandler() # 文件无限增大
  3. 根据大小切割 RotatingFileHandler() 了解
  4. 根据时间切割 TimedRotatingFileHandler() 掌握

在这里插入图片描述
在这里插入图片描述
log 可以获取多个处理器

控制台处理器

"""
    学习 logging 底层 模块实现
    1. logger
"""
# import logging

# 获取 logger
import logging

logger = logging.getLogger()
# 设置级别
#  大写是常量,这个括号里面不能写字符串,所以应该用logging 调用
logger.setLevel(logging.INFO)

# 获取控制台 处理器

# 这些都是handler的子类,子类加括号就是 实例化,实例化以后需要一个对象接收
sh = logging.StreamHandler()

# 将处理器添加到 logger
logger.addHandler(sh)

# 输入信息
logger.info("info")
logger.debug("debug")

在这里插入图片描述

获取:
sf = logging.StreamHandler()
TimedRotatingFileHandler()应用:
			1. 导包: import logging.handlers
			2. 实例化:th = logging.handers.TimedRotatingFileHandler(filename="日志文件保存的目录及文件名",
																	when='M',
																	interval="1",
																	backupcount=30)
				1). when:时间单位
				2). interval:时间间隔
				3). backupcount:保留的备份数量

格式器:

在这里插入图片描述

获取:
			fmt = "%(asctime)s %(levelname)s [%(name)s] [%(filename)s (%(funcName)s:%(lineno)d] - %(message)s"
			fm = logging.Formatter(fmt)
			
		将格式器添加到处理器中
			控制台处理器.setFormatter(fm)
			文件处理器.setFormatter(fm)
应用:
		logger.info("日志信息")
		logger.error("日志信息")
"""
    学习 logging 底层 模块实现
    1. logger
"""
# import logging

# 获取 logger
# import logging  # 注意 ,以后导入 logging 包不使用此方式


# 注意:导包的时候,导入 import logging.handlers
# 这么导入 是因为 logging 本身不是模块,是一个包名,
# 导入包名的时候会自动执行包下面的 _init_ 文件,所以这样导入,相当于导入logging
# 包名就这样调用 handlers 是一个模块
import logging.handlers

# 获取 logger
# logger = logging.getLogger()

# 修改名称
logger = logging.getLogger("admin")

# 设置级别
#  大写是常量,这个括号里面不能写字符串,所以应该用logging 调用
logger.setLevel(logging.INFO)

# 获取控制台 处理器

# 这些都是handler的子类,子类加括号就是 实例化,实例化以后需要一个对象接收
sh = logging.StreamHandler()

# 将处理器添加到 logger
logger.addHandler(sh)

# 到文件,根据事件切割
tf = logging.handlers.TimedRotatingFileHandler(filename="./logtime.log",
                                          when="M",
                                          interval=1,
                                          backupCount=3)
# 将控制台处理器添加到 logger
logger.addHandler(tf)

# 添加格式器
fmt = "%(asctime)s %(levelname)s [%(name)s] [%(filename)s (%(funcName)s:%(lineno)d] - %(message)s"
fm = logging.Formatter(fmt)

# 将格式器添加到 处理器中
sh.setFormatter(fm)
tf.setFormatter(fm)

# 输入信息
logger.info("info")
logger.debug("debug")

在这里插入图片描述
在这里插入图片描述

日志封装

# 导包

# 获取 日志器 —— 日志器里面可以添加多个处理器

# 设置日志器 级别

# 获取处理器 —— 控制台 

# 获取处理器 —— 文件,以时间分割

# 设置格式器

# 将格式器 添加到处理器(控制台)中

# 将格式器 添加到处理器(文件)中

# 将处理器添加到日志器

# 导包
import logging.handlers

# 获取 日志器 —— 日志器里面可以添加多个处理器
logger = logging.getLogger()

# 设置日志器 级别  —— 在工作中,最常用的级别是 INFO ,注意是常量,要大写
logger.setLevel(logging.INFO)

# 获取处理器 —— 控制台
sh = logging.StreamHandler()

# 获取处理器 —— 文件,以时间分割
th = logging.handlers.TimedRotatingFileHandler(filename="./FengZhuang.log",
                                               when="midnight",
                                               interval=1,
                                               backupCount=30,
                                               encoding="utf-8")
# 设置格式器
fmt = "%(asctime)s %(levelname)s [%(name)s] [%(filename)s (%(funcName)s:%(lineno)d] - %(message)s"
fm = logging.Formatter(fmt)

# 将格式器 添加到处理器(控制台)中
sh.setFormatter(fm)
# 将格式器 添加到处理器(文件)中
th.setFormatter(fm)

# 将处理器添加到日志器
logger.addHandler(sh)
logger.addHandler(th)

logger.info("info信息被执行")

在这里插入图片描述
封装之后

# 导包
import logging.handlers


def get_logger():
    # 获取 日志器 —— 日志器里面可以添加多个处理器
    logger = logging.getLogger()

    # 设置日志器 级别  —— 在工作中,最常用的级别是 INFO ,注意是常量,要大写
    logger.setLevel(logging.INFO)

    # 获取处理器 —— 控制台
    sh = logging.StreamHandler()

    # 获取处理器 —— 文件,以时间分割
    th = logging.handlers.TimedRotatingFileHandler(filename="./FengZhuang.log",
                                                   when="midnight",
                                                   interval=1,
                                                   backupCount=30,
                                                   encoding="utf-8")
    # 设置格式器
    fmt = "%(asctime)s %(levelname)s [%(name)s] [%(filename)s (%(funcName)s:%(lineno)d] - %(message)s"
    fm = logging.Formatter(fmt)

    # 将格式器 添加到处理器(控制台)中
    sh.setFormatter(fm)
    # 将格式器 添加到处理器(文件)中
    th.setFormatter(fm)

    # 将处理器添加到日志器
    logger.addHandler(sh)
    logger.addHandler(th)
    return logger

if __name__ == '__main__':
    logger = get_logger()
    logger.error("error信息被执行")
    logger.info("info信息被执行")

在这里插入图片描述

		# 定义获取日之类
			# 定义类属性 logger = None
			
			@classemethod
			# 定义获取logger日志器的类方法
				if cls.logger is None: # 判断类属性logger是否还是为空,如果为空,就执行以下操作
					# 获取 日志器对象
					# 设置日志器级别
					# 获取控制台处理器
					# 获取文件处理器
					# 获取格式器
					# 将格式器添加到处理器中
					# 将处理器添加到日志器中
				return 类属性logger
				
			注意:
				1. 以上条件无论是否成立,最后都会返回类属性logger;
				2. 当第一次调用时,条件一定成立,将类属性logger设置不为空;
				3. 当第二次以上调用时,永远返回第一次设置的类属性对象;
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值