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


    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)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    格式器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))
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
  • 相关阅读:
    从零开始学数据结构系列之第三章《二叉排序树基础了解》
    Synopsys Sentaurus TCAD系列教程之-- Sdevice《5》Plot模块
    14:00面试,14:06就出来了,问的问题有点变态。。。
    交易履约之结算平台实践 | 京东云技术团队
    测试用例设计方法之正交法
    【编程题】【Scratch四级】2021.12 聪明的小猫
    C++中public、protected及private用法
    Python基础入门例程18-NP18 生成数字列表(列表)
    论文解读:《DeepKla:一种基于注意力机制的深度神经网络,用于蛋白质赖氨酸乳酸化位点预测》
    [Js进阶]axios简要全局封装
  • 原文地址:https://blog.csdn.net/weixin_44025103/article/details/127859516