zoukankan      html  css  js  c++  java
  • Python学习笔记二十三_日志模块

      日志模块是python自带的标准模块,但并不是非常好用,先来了解一下这个logging模块,之后可以自行封装一个log模块,方便在后续自动化框架中使用。

    一、Logging模块

    1、控制台输出日志信息,若level为INFO级别,则不输出debug log。

    import logging
    logging.basicConfig(level=logging.DEBUG,#控制台打印的日志级别,需要大写
                        format='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'
                        #日志格式(时间,在python文件第几行出错,级别)
                        )
    logging.debug('debug级别,最低级别,一般开发人员用来打印一些调试信息')
    logging.info('info级别,正常输出信息,一般用来打印一些正常的操作')
    logging.warning('waring级别,一般用来打印警信息')
    logging.error('error级别,一般用来打印一些错误信息')

    2、将打印的日志存入log文件,但是这里会发现log文件中中文乱码,并且控制台不在打印log

    import logging
    logging.basicConfig(level=logging.DEBUG,
                        filename='my.log', #加上文件名后,控制台不再输出日志
                        filemode='w', #清空以前的日志,重新写入,'a'在文件里追加写入
                        format='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'
                        #日志格式(时间,在python文件第几行出错,级别)
                        )
    logging.debug('debug级别,最低级别,一般开发人员用来打印一些调试信息')

    3、如何让log不仅在控制台输出,并且不乱码地写入log文件呢

    两件事需要找两个实例来做,一个用于控制台输出一个用于写文件

    import logging
    from logging import handlers
    logger = logging.getLogger() #先实例化一个logger对象
    logger.setLevel(logging.DEBUG) #设置日志的级别
    cl = logging.StreamHandler() #负责往控制台输出的
    bl = handlers.TimedRotatingFileHandler(filename='my.log',when='D',interval=1,backupCount=5,encoding='utf-8')
    #负责写文件的
    #when='S'以秒为时间间隔单位,S:秒,M:分,H:小时,D天,W星期,interval==0代表星期一
    #interval=1时间间隔,以when为单位,即1s
    #backupCount最多几个备份
    fmt=logging.Formatter('%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s')
    #指定日志的格式
    cl.setFormatter(fmt)#设置控制台输出的日志格式
    bl.setFormatter(fmt)#设置文件里面写入的格式
    logger.addHandler(cl)#把用于控制台输出的实例放入logger
    logger.addHandler(bl)#把用于写文件的实例放入logger
    
    logger.debug('我是debug')

    二、封装写日志的类

    下面将能够既在控制台可以输出,又可以写入文件的这个方法封装成写日志的类

    import logging
    from logging import handlers
    class MyLoger():
        def __init__(self,file_name,level='info',when='D',interval=1,backupCount=5):
            logger = logging.getLogger() #先实例化一个logger对象
            logger.setLevel(self.get_level(level)) #设置日志的级别
            cl = logging.StreamHandler() #负责往控制台输出的
            bl = handlers.TimedRotatingFileHandler(filename=file_name,when=when,interval=interval,backupCount=backupCount,encoding='utf-8')
            fmt=logging.Formatter('%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s')
            cl.setFormatter(fmt)#设置控制台输出的日志格式
            bl.setFormatter(fmt)#设置文件里面写入的格式
            logger.addHandler(cl)#把用于控制台输出的实例放入logger
            logger.addHandler(bl)#把用于写文件的实例放入logger
            self.logger = logger #这样实例可以调用
        def get_level(self,str): #只传级别即可,不用level=logging.INFO
            level= {
                'debug':logging.DEBUG,
                'info':logging.INFO,
                'warn':logging.WARNING,
                'error':logging.ERROR
            }
            str = str.lower()
            return level.get(str)
    
    mylog = MyLoger('my.log')
    mylog.logger.warning('我是warning')
  • 相关阅读:
    递归函数
    js原生代码添加表格(行,列用户选择)
    Vue列表数组检测及列表过滤
    字符,图片及视频存储
    小程序js-api简介及操作
    小程序开发-了解
    外购入库单审核可以,删除失败,提示采购单据严格按照数量控制,收料通知单关联数量不能大或负数
    PDO基础应用之异常处理
    进程池用法
    [转]解决Error: That port is already in use.
  • 原文地址:https://www.cnblogs.com/dongrui624/p/9144857.html
Copyright © 2011-2022 走看看