zoukankan      html  css  js  c++  java
  • logging日志模块

    一.logging模块日志级别介绍

    日志一共分为5个等级,从低到高分别是:

    级别说明
    DEBUG 输出详细的运行情况,主要用于调试。
    INFO 确认一切按预期运行,一般用于输出重要运行情况。
    WARNING 系统运行时出现未知的事情(如:警告内存空间不足),但是软件还可以继续运行,可能以后运行时会出现问题。
    ERROR 系统运行时发生了错误,但是还可以继续运行。
    CRITICAL 一个严重的错误,表明程序本身可能无法继续运行。

    这5个等级,也分别对应5种打印日志的方法:debug、info、warning、error、critical。默认的日志收集器是收集WARNING以上等级的日志。

    import logging
    #日志收集器
    #默认的日志收集器是root,默认收集WARNING以上等级的日志。
    logging.debug("这是debug等级的日志信息")
    logging.info("这是info等级的日志信息")
    logging.warning("这是warning等级的日志信息")
    logging.error("这是error等级的日志信息")
    logging.critical("这是critical等级的日志信息")

     二、日志收集器

    import logging
    #创建自己的日志收集器
    my_log = logging.getLogger("my_log")
    #设置收集的日志等级,设置为DEBUG等级
    my_log.setLevel("DEBUG")
    #日志输出
    my_log.debug("--my_log_debug--")
    my_log.info("--my_log_info--")
    my_log.warning("--my_log_warning--")
    my_log.error("--my_log_error")

    三、日志输出渠道

    有两种方式记录跟踪,一种是输出到控制台,另一种是记录到文件中,如日志文件。

    1.日志输出到控制台

    #创建一个日志输出渠道,输出到控制台
    l_s = logging.StreamHandler()
    #设置输出的日志等级为INFO以上
    l_s.setLevel("INFO")
    #将日志输出渠道添加到日志收集器中
    my_log.addHandler(l_s)

    2.将日志输出到文件中

    #创建一个日志输出渠道,输入到文件中
    l_f = logging.FileHandler("login.log",encoding='utf8')
    # 设置输出的日志等级为DEBUG以上
    l_f.setLevel("DEBUG")
    #将日志输出渠道添加到日志收集器中
    my_log.addHandler(l_f)

    3.将日志同时输出到控制台和文件中

    import logging
    # 创建自己的日志收集器
    my_log = logging.getLogger("my_log")
    # 设置收集的日志等级,设置为DEBUG等级
    my_log.setLevel("DEBUG")
    # 日志输出渠道
    # 创建一个日志输出渠道(输出到控制台),并且设置输出的日志等级为INFO以上
    l_s = logging.StreamHandler()
    l_s.setLevel("INFO")
    # 创构建一个日志输出渠道(输出到文件),并且设置输出的日志等级为DEBUG以上
    l_f = logging.FileHandler("login.log",encoding='utf8')
    l_f.setLevel("DEBUG")
    #将日志输出渠道添加到日志收集器中
    my_log.addHandler(l_s)
    my_log.addHandler(l_f)
    #日志输出
    my_log.debug("--my_log_debug--")
    my_log.info("--my_log_info--")
    my_log.warning("--my_log_warning--")
    my_log.error("--my_log_error")
    my_log.error("--my_log_critical")

    控制台输出结果为:

     日志文件的输出结果为:

     四、日志输出格式

    可以通过logging.Formatter指定日志的输出格式,这个参数可以输出很多有用的信息,如下:

    • %(name)s:收集器名称
    • %(levelno)s:打印日志级别的数值
    • %(levelname)s:打印日志级别名称
    • %(pathname)s:打印当前执行程序的路径,其实就是sys.argv()
    • %(filename)s:打印当前执行程序名
    • %(funcName)s:打印日志的当前函数
    • %(lineno)d:打印日志的当前行号
    • %(asctime)s:打印日志的时间
    • %(thread)d:打印线程ID %(threadName)s:打印线程名称
    • %(process)d:打印进程ID
    • %(message)s:打印日志信息

    工作中常用格式如下:

    ft = "%(asctime)s - [%(filename)s -->line:%(lineno)d] - %(levelname)s: %(message)s"

    这个格式可以输出日志的打印时间,是哪个模块的哪一行输出的,输出的日志级别是什么,以及输出的日志内容。

     

    import logging
    # 创建自己的日志收集器
    my_log = logging.getLogger("my_log")
    # 设置收集的日志等级,设置为DEBUG等级
    my_log.setLevel("DEBUG")
    # 日志输出渠道
    # 创建一个日志输出渠道(输出到控制台),并且设置输出的日志等级为INFO以上
    l_s = logging.StreamHandler()
    l_s.setLevel("INFO")
    # 创构建一个日志输出渠道(输出到文件),并且设置输出的日志等级为DEBUG以上
    l_f = logging.FileHandler("login.log",encoding='utf8')
    l_f.setLevel("DEBUG")
    #将日志输出渠道添加到日志收集器中
    my_log.addHandler(l_s)
    my_log.addHandler(l_f)
    # 设置日志输出的格式
    ft = "%(asctime)s - [%(filename)s -->line:%(lineno)d] - %(levelname)s: %(message)s"
    ft = logging.Formatter(ft)
    # 设置控制台和日志文件输出日志的格式
    l_s.setFormatter(ft)
    l_f.setFormatter(ft)
    #日志输出
    my_log.debug("--my_log_debug--")
    my_log.info("--my_log_info--")
    my_log.warning("--my_log_warning--")
    my_log.error("--my_log_error")
    my_log.error("--my_log_critical")

    控制台输出结果为:

     日志文件的输出结果为:

    封装一个日志的类(在接口测试时可直接使用)

    第一种方法:__init__方法(此方法打印出来的日志行数显示不对,不建议使用)

    import logging
    class MyLogging(object):
        def __init__(self):
            # 创建自己的日志收集器
            self.my_log = logging.getLogger("my_log")
            # 设置收集的日志等级,设置为DEBUG等级
            self.my_log.setLevel("DEBUG")
            # 日志输出渠道
            # 创建一个日志输出渠道(输出到控制台),并且设置输出的日志等级为INFO以上
            l_s = logging.StreamHandler()
            l_s.setLevel("INFO")
            # 创构建一个日志输出渠道(输出到文件),并且设置输出的日志等级为DEBUG以上
            l_f = logging.FileHandler("login.log",encoding='utf8')
            l_f.setLevel("DEBUG")
            #将日志输出渠道添加到日志收集器中
            self.my_log.addHandler(l_s)
            self.my_log.addHandler(l_f)
            # 设置日志输出的格式
            ft = "%(asctime)s - [%(filename)s -->line:%(lineno)d] - %(levelname)s: %(message)s"
            ft = logging.Formatter(ft)
            # 设置控制台和日志文件输出日志的格式
            l_s.setFormatter(ft)
            l_f.setFormatter(ft)
    
        def debug(self,msg):
            self.my_log.debug(msg)
    
        def info(self,msg):
            self.my_log.info(msg)
    
        def warning(self,msg):
            self.my_log.warning(msg)
    
        def error(self,msg):
            self.my_log.error(msg)
    
        def critical(self,msg):
            self.my_log.critical(msg)
    
    #日志输出
    m_log = MyLogging()
    m_log.debug("--my_log_debug--")
    m_log.info("--my_log_info--")
    m_log.warning("--my_log_warning--")
    m_log.error("--my_log_error")
    m_log.critical("--my_log_critical")

    输出结果为:

    第二种方法:普通方法

    import logging
    class MyLogging(object):
        def create_logger(*args,**kwargs):
            # 创建自己的日志收集器
            my_log = logging.getLogger("my_log")
            # 设置收集的日志等级,设置为DEBUG等级
            my_log.setLevel("DEBUG")
            # 日志输出渠道
            # 创建一个日志输出渠道(输出到控制台),并且设置输出的日志等级为INFO以上
            l_s = logging.StreamHandler()
            l_s.setLevel("INFO")
            # 创构建一个日志输出渠道(输出到文件),并且设置输出的日志等级为DEBUG以上
            l_f = logging.FileHandler("login.log",encoding='utf8')
            l_f.setLevel("DEBUG")
            #将日志输出渠道添加到日志收集器中
            my_log.addHandler(l_s)
            my_log.addHandler(l_f)
            # 设置日志输出的格式
            ft = "%(asctime)s - [%(filename)s -->line:%(lineno)d] - %(levelname)s: %(message)s"
            ft = logging.Formatter(ft)
            # 设置控制台和日志文件输出日志的格式
            l_s.setFormatter(ft)
            l_f.setFormatter(ft)
            return my_log
    
        def debug(self,msg):
            self.my_log.debug(msg)
    
        def info(self,msg):
            self.my_log.info(msg)
    
        def warning(self,msg):
            self.my_log.warning(msg)
    
        def error(self,msg):
            self.my_log.error(msg)
    
        def critical(self,msg):
            self.my_log.critical(msg)
    
    
    #日志输出
    m_log = MyLogging()
    logger = m_log.create_logger()
    logger.debug("--my_log_debug--")
    logger.info("--my_log_info--")
    logger.warning("--my_log_warning--")
    logger.error("--my_log_error")
    logger.critical("--my_log_critical")

    输出结果为:

     第三种方法:直接使用__new__方法

    import logging
    class MyLogging(object):
        def __new__(cls,*args,**kwargs):
            # 创建自己的日志收集器
            my_log = logging.getLogger("my_log")
            # 设置收集的日志等级,设置为DEBUG等级
            my_log.setLevel("DEBUG")
            # 日志输出渠道
            # 创建一个日志输出渠道(输出到控制台),并且设置输出的日志等级为INFO以上
            l_s = logging.StreamHandler()
            l_s.setLevel("INFO")
            # 创构建一个日志输出渠道(输出到文件),并且设置输出的日志等级为DEBUG以上
            l_f = logging.FileHandler("login.log",encoding='utf8')
            l_f.setLevel("DEBUG")
            #将日志输出渠道添加到日志收集器中
            my_log.addHandler(l_s)
            my_log.addHandler(l_f)
            # 设置日志输出的格式
            ft = "%(asctime)s - [%(filename)s -->line:%(lineno)d] - %(levelname)s: %(message)s"
            ft = logging.Formatter(ft)
            # 设置控制台和日志文件输出日志的格式
            l_s.setFormatter(ft)
            l_f.setFormatter(ft)
            return my_log
        def debug(self,msg):
            my_log.debug(msg)
    
        def info(self,msg):
            my_log.info(msg)
    
        def warning(self,msg):
            my_log.warning(msg)
    
        def error(self,msg):
            my_log.error(msg)
    
        def critical(self,msg):
            my_log.critical(msg)
    
    #日志输出
    m_log = MyLogging()
    m_log.debug("--my_log_debug--")
    m_log.info("--my_log_info--")
    m_log.warning("--my_log_warning--")
    m_log.error("--my_log_error")
    m_log.critical("--my_log_critical")

    输出结果为:

     扩展:设置日志名称、最大字节数、最多能存在的文件数,日志格式

    import logging
    from logging.handlers import RotatingFileHandler
    
    # 创建自己的日志收集器
    logger = logging.getLogger("my_log")
    # 设置收集的日志等级,设置为DEBUG等级
    logger.setLevel("DEBUG")
    # 设置日志名称为test.log,日志最大字节数为1024,最多只能存在3个文件,设置日志格式为utf8
    rf = RotatingFileHandler(filename="test.log",
                             maxBytes=1024,
                             backupCount=3,
                             encoding="utf8")
    # 将日志输出渠道添加到日志收集器中
    logger.addHandler(rf)
    for i in range(200):
        logger.debug("--my_log_debug--")
        logger.info("--my_log_info--")
        logger.warning("--my_log_warning--")
        logger.error("--my_log_error")
        logger.critical("--my_log_critical")

     

     

  • 相关阅读:
    kvm添加磁盘
    python学习1
    ubuntu使sudo不需要密码
    磁盘挂载
    github/gitlab添加多个ssh key
    生成SSH key
    git 删除追踪状态
    angular2+ 初理解
    本地项目上传到GitHub
    new Date()之参数传递
  • 原文地址:https://www.cnblogs.com/wanglle/p/11503390.html
Copyright © 2011-2022 走看看