IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Python 之 logging日志 -> 正文阅读

[Python知识库]Python 之 logging日志

Python 之 logging日志

日志的作用是记录信息,便于查看问题,定位问题

logging是Python中的一个标准库,在编码过程中,需要记录程序的运行,这时候,就需要用到 logging模块。

日志级别

日志类型权重说明
noset0等于没写,相当于注释
debug10调试,记录一些额外信息,往往与主体内容无关,起到备注的作用
info20记录主体信息,例如程序的运行、数据及代码逻辑的走向
warning30警告,程序下次运行可能要出错,或已有内容进行修改,将不再适用
error40产生了报错,影响部分功能
critical50产生了严重报错,影响系统功能

test1.py

# 导入logging
import logging

logging.debug("这里是调试信息")
logging.info("这是一条记录程序运行的信息")
logging.warning("警告:该方法在2.2版本后将不再适用")
logging.error("程序运行产生报错")
logging.critical("系统运行错误")

运行该py文件

WARNING:root:警告:该方法在2.2版本后将不再适用
ERROR:root:程序运行产生报错
CRITICAL:root:系统运行错误

可以发现,debuginfo级别的日志,并没有在控制台打印出来
这里的root是收集器的名字,后面会具体介绍

日志的级别,是自己定义的,为的就是在程序运行过程中,记录相应的信息,方便我们查看系统的运行情况

test2.py

import logging

def testfunc():
	logging.info("调用了testfunc方法")
	
    logging.warning("该方法在2.3版本将废弃,请使用新方法")

    try:
        1 / 0
    except Exception as e:
        logging.error(e)



if __name__ == '__main__':
    testfunc()

运行结果

WARNING:root:该方法在2.3版本将废弃,请使用新方法
ERROR:root:division by zero

info级别的日志,不会在控制台打印出来,打印了warningerror级别的日志。
1 / 0产生了报错,e 是相应的报错信息,所以 logging.error(e) 将报错信息 division by zero除数为0,打印了出来

收集与处理日志

在此之前,需要先了解以下几个概念:

  • 日志收集器 logger
  • 日志收集器level级别
  • 日志处理器 handler
  • 日志处理器级别设置
  • 设置日志格式 fomat
  • 添加日志处理器
import logging

# 初始化logger收集器
logger = logging.getLogger('tester_logger')

# 设置日志收集器level级别
logger.setLevel('DEBUG')

# 设置日志处理器 handler
# (handler默认为warning级别,默认是使用控制台输出)

console_output_handler = logging.StreamHandler() #输出到控制台
file_output_handler = logging.FileHandler("log.txt",encoding='utf-8') # 出到file文件中

console_output_handler.setLevel('DEBUG')
file_output_handler.setLevel('INFO')

# 添加handler

logger.addHandler(file_output_handler)
logger.addHandler(console_output_handler)


# handler 设置格式

fmt = logging.Formatter("%(asctime)s-%(filename)s-%(lineno)d-%(message)s")

console_output_handler.setFormatter(fmt)
file_output_handler.setFormatter(fmt)


logger.debug("hello")
logger.info("world")
logger.warning("!")

通过 logging.getLogger() 初始化logger收集器,这里 tester_logger是收集器的名字,然后将 tester_logger用变量 logger接收。
日志收集器相当于一本笔记本,就比如上学的时候,不同的科目,需要用不同的笔记本,tester_logger就是不同笔记本的名字。

通过logger.setLevel() 设置日志收集器level级别
就比如一些简单的笔记 1+1=2,这种就不需要记录了,需要记录的是公式、解题思路。
一般情况下,日志收集器level级别会设置为 infodebuglogger.setLevel('INFO'),这样设置后,低于 debug级别 的日志内容,将不会进行收集(debug级别在收集范围内)

日志处理器 handler,handler的作用是定义处理日志的规则。
就相当于记笔记的笔,例如错题会用红色的笔记录,公式会用蓝色的笔记录,知识点会用黑色的笔记录。

  • 输出方式
    handler默认输出到控制台
    logging.StreamHandler()表示输出到控制台,logging.FileHandler()表示输出到file文件中。一般情况下,都需要通过输出到文件中记录日志
    定义了输出方式之后,通过 logger.addHandler() 将规则添加到 handler中

  • 输出级别
    handler默认为warning级别
    通过 file_output_handler.setLevel('INFO') 设置handler的级别为 info,低于 info级别 的日志内容,将不会进行处理(info级别在处理范围内)

可以发现,log.txt文件夹中,只记录了 world! 。虽然日志收集器level级别debug,但是日志处理器handler级别info,所以,文件中只输出了info级别 的日志内容。这两者是一个交集的关系,只选择级别最高的。
而控制台打印的,是 helloworld! 。因为日志收集器level级别debug,但是日志处理器handler级别也为debug

通过 logging.Formatter() 输出指定的日志格式,需要严格按照%()s%()d%()f 的规则定义格式的内容,内容与内容之间,可用 :- 隔开

常用内容:

  • asctime:代码执行时的时间
  • funcName:执行函数的名字
  • filename:模块(py文件)名字
  • lineno:运行代码的行号
  • levelname:日志处理器 handler名称
  • message:提示的信息
2021-07-27 00:20:32,117-test3.py-32-hello
2021-07-27 00:20:32,118-test3.py-33-world
2021-07-27 00:20:32,119-test3.py-34-!

封装

logging日志功能,可以将其封装成一个独立的模块,这样,在需要使用到日志功能的地方,导入这个模块即可以使用

my_logger.py

import logging

class LoggerHandler():

    # 初始化 Logger
    def __init__(self,
                 name='root',
                 logger_level= 'DEBUG',
                 file=None,
                 logger_format = '%(asctime)s-%(filename)s-%(lineno)d-%(message)s'
                 ):

        # 1、初始化logger收集器
        logger = logging.getLogger(name)


        # 2、设置日志收集器level级别
        logger.setLevel(logger_level)

        # 5、初始化 handler 格式
        fmt = logging.Formatter(logger_format)

        # 3、初始化日志处理器

        # 如果传递了文件,就会输出到file文件中
        if file:
            file_handler = logging.FileHandler(file)
            # 4、设置 file_handler 级别
            file_handler.setLevel(logger_level)
            # 6、设置handler格式
            file_handler.setFormatter(fmt)
            # 7、添加handler
            logger.addHandler(file_handler)

        # 默认都输出到控制台
        stream_handler = logging.StreamHandler()
        # 4、设置 stream_handler 级别
        stream_handler.setLevel(logger_level)
        # 6、设置handler格式
        stream_handler.setFormatter(fmt)
        # 7、添加handler
        logger.addHandler(stream_handler)

        # 设置成实例属性
        self.logger = logger

    # 返回日志信息

    def debug(self,msg):
        return self.logger.debug(msg)

    def info(self,msg):
        return self.logger.info(msg)

    def warning(self,msg):
        return self.logger.warning(msg)

    def error(self,msg):
        return self.logger.error(msg)

    def critical(self,msg):
        return self.logger.critical(msg)

这样,需要用到日志的时候,通过导入 my_logger 模块,使用 LoggerHandler 类里的 debuginfo函数即可

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-08-01 14:27:47  更:2021-08-01 14:30:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/25 13:53:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计