首页 > 编程学习 > python中log的使用以及日志打印的介绍

python中log的使用以及日志打印的介绍

发布时间:2022/11/15 11:30:18

1、logger模块的基本使用

logging模块的四大组件:
1、日志器:logger 给所有的应用程序提供入口
2、处理器:handler 决定在不同端实现输出
3、格式器:formater 决定日志内容(日志包含什么样的信息(时间、某行、信息描述、信息级别))
4、过滤器:filter 信息进行筛选,保留感兴趣的信息
四大组件之间的关系:
1个日志器可以有多个处理器,每个处理器可以有各自的格式和过滤器
日志输出端:日志文件 控制台

 # 创建一个日志器,日志器的名字就是logger
logger = logging.getLogger('logger')

# 创建一个处理器, StreamHandler() 控制台实现日志输出
sh = logging.StreamHandler()

# 创建处理器,FileHandler() 将日志输出到文件保存
# time.strftime("%Y_%m_%d_%H_%M_%S", time.localtime()) 
#将当前时间的时间戳转化为日期格式作为日志文件的文件名,防止重名,encoding设置保存日志的编码
fh = logging.FileHandler(f'{time.strftime("%Y_%m_%d_%H_%M_%S", time.localtime())}_log.txt', encoding='utf-8')

# 创建一个格式器(fmt是日志包含内容:时间         运行文件:     运行**行       日志级别         日志描述信息     
#%()s 是固定格式,s表示字符串的信息,d表示数字型,()中的值:如asctime、filename等是程序固定好的参数,具体如下表,datefmt 表示输出日期的格式)
lf = logging.Formatter(fmt='%(asctime)s | %(filename)s:%(lineno)d 行 | %(levelname)s | %(message)s', datefmt='%Y_%m_%d %H:%M:%S') 

# 实现日志输出的方式(控制台)
# 在日志器中加入处理器
logger.addHandler(sh)

# 处理器中设置日志输出格式
sh.setFormatter(lf)

# 实现日志输出的方式(保存到文件)
logger.addHandler(fh)
fh.setFormatter(lf)

格式器fmt参数表

FormatDescription
%(asctime)s执行时间,默认情况下,格式为“2022-07-08 16:49:45,896”(逗号后面的数字是时间的毫秒部分)
%(created)f执行时间,以时间戳的方式返回
%(filename)s执行的文件名
%(funcName)s日志调用的函数名
%(levelname)s日志返回级别
%(levelno)s日志返回级别的数值
%(lineno)d日志执行的行数
%(message)s日志描述信息
%(module)s日志记录模块名
%(msecs)d执行时间毫秒部分
%(name)s当前记录日志的,日志器名称
%(pathname)s执行py文件的绝对路径

2、日志的级别

日志级别优先级从低到高分别为:
DEBUG:调试信息
INFO:关键事件描述
WARNING:警告信息
ERROR:错误信息
CRITICAL:严重错误
设定日志器(logger)的日志级别(如果不设定,默认输出WARNING级别以上的日志)
logger日志级别和handler日志级别的关系:
可以使用logger设置输出日志级别,也可以使用handler设置日志级别,可实现控制台和文件输出不同级别的日志
1、logger设置级别、handler未设置级别,会输出logger设置的级别及以上的日志
2、logger设置error级别,handler设置info级别,会输出logger设置的error及以上的日志
3、logger设置debug级别,handler设置info级别,会输出info级别的日志,debug不输出
综上,程序会先拿到logger设置的级别及以上的日志,最终输出符合handler设置的日志级别及以上的日志,如果logger设置的级别比handler设置的级别高,那么handler设置的级别不生效。

3、示例代码

以下为日志器收集日志的应用代码示例:

import logging
import time

class logFrame:
    def logg(self):
        # 创建一个日志器
        logger = logging.getLogger('logger')
        # 判断处理器是否存在,如果有处理器就不添加,如果不存在处理器就添加处理器
        if not logger.handlers:
            # 设定日志器的日志级别(如果不设定,默认展示WARNING级别以上的日志)
            logger.setLevel(logging.DEBUG)
            # 创建一个处理器, StreamHandler(),在控制台实现日志输出
            sh = logging.StreamHandler()
            # 创建处理器,FileHandler() 将日志输出到文件进行保存
            fh = logging.FileHandler(f'{time.strftime("%Y_%m_%d_%H_%M_%S", time.localtime())}_log.txt', encoding='utf-8')
            # 创建一个格式器(fmt是日志包含的内容:时间  运行文件:运行**行 日志级别  日志描述信息 %()s 是固定格式,s表示字符串的信息,d表示数字型,()中的值:如asctime、filename等是程序固定好的参数)
            # datefmt 表示输出日期的格式
            lf = logging.Formatter(fmt='%(asctime)s | %(filename)s:%(lineno)d 行 | %(levelname)s | %(message)s', datefmt='%Y_%m_%d %H:%M:%S')

            # 控制台输出日志
            # 在日志器中加入处理器
            logger.addHandler(sh)
            # 处理器中设置日志输出格式
            sh.setFormatter(lf)
            # 设置处理器级别
            sh.setLevel(logging.INFO)

            # 保存日志
            logger.addHandler(fh)
            fh.setFormatter(lf)
        return logger

if __name__ == '__main__':
    log = logFrame()
    logger = log.logg()
    try:
        input_info = int(input('请输入你的除数:'))
        sum = 4/input_info
        # 一般正常返回值或提示信息使用 debug或info级别信息
        logger.info(f'计算完成!4/{input_info}={sum}')
        logger.debug('debug级别信息')
    except Exception as es:
        # 功能错误或代码错误,返回错误日志,用error级别记录
        logger.error(str(es))

Copyright © 2010-2022 dgrt.cn 版权所有 |关于我们| 联系方式