• python学习笔记(二十八)日志模块


    我们在写程序的时候经常会打一些日志来帮助我们查找问题,这次学习一下logging模块,在python里面如何操作日志。
    介绍一下logging模块,logging模块就是python里面用来操作日志的模块,logging模块中主要有4个类,分别负责不同的工作:

    Logger 记录器,暴露了应用程序代码能直接使用的接口;简单点说就是一个创建一个办公室,让人在里头工作 

    Handler 处理器,将(记录器产生的)日志记录发送至合适的目的地;这个简单点说就是办事的人,你可以指定是让在控制输出日志,还是在文件里面打印日志,常用的有4种: 

                    StreamHandler 控制台输出 

                    FileHandler 文件输出

                    下面两种需要导入

                            handlers
                            from logging import handlers 

                            TimedRotatingFileHandler 按照时间自动分割日志文件 

                            RotatingFileHandler 按照大小自动分割日志文件,一旦达到指定的大小重新生成文件 

                            Filter过滤器,提供了更好的粒度控制,它可以决定输出哪些日志记录。(不常用) 

                            Formatter格式化器,指明了最终输出中日志记录的布局。指定输出日志的格式

    import logging
    from logging import handlers
    #只在控制台打印日志
    logging.basicConfig(level=logging.ERROR,#控制台打印的日志级别
                        format=
                        '%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'
                        #日志格式
                        )
    logging.debug('debug级别,最低级别,一般开发人员用来打印一些调试信息')
    logging.info('info级别,正常输出信息,一般用来打印一些正常的操作')
    logging.warning('waring级别,一般用来打印警信息')
    logging.error('error级别,一般用来打印一些错误信息')
    logging.critical('critical级别,一般用来打印一些致命的错误信息')

    日志级别 debug < info < warning < error < critical
    设置了日志级别之后,会打印该级别以及比该级别高的所有日志,举个例子,如果日志级别是warning,那么就会打印warning、error、critical,这三个级别的日志,不会打印debug和info级别的,如果是debug,最低级别的日志,那么所有的日志都会打印。
    上面的只是在控制台打印日志,并没有把日志写在文件里面,一般我们都会把日志写在日志文件里面,也很简单,只需要加个参数指定文件名就行了。

    logging.basicConfig(level=logging.ERROR,#控制台打印的日志级别
                        filename='log.txt',#文件名
                        filemode='a',#模式,有w和a,w就是写模式,每次都会重新写日志,覆盖之前的日志
                        #a是追加模式,默认如果不写的话,就是追加模式
                        format=
                        '%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'
                        #工作中常用的日志格式
                        )
    logging.debug('debug级别,最低级别,一般开发人员用来打印一些调试信息')
    logging.info('info级别,正常输出信息,一般用来打印一些正常的操作')
    logging.warning('waring级别,一般用来打印警信息')
    logging.error('error级别,一般用来打印一些错误信息')
    logging.critical('critical级别,一般用来打印一些致命的错误信息')

    加上文件名之后就会发现控制台不会输出日志了,日志文件也产生了,那么如何既在控制台输出日志,也在文件中写入呢?

    怎么实现呢,就得有个办公室,里面塞俩人,一个给负责往控制台输出日志,一个负责写文件,你把他俩往办公室一塞,他俩就能干活了。

    import logging
    from logging import handlers
    logger = logging.getLogger('my_log')
    #先创建一个logger对象,相当于这个办公室,也就是上面说的Logger
    logger.setLevel(logging.INFO)#设置日志的总级别
    fh = logging.FileHandler('test.log',mode='a',encoding='utf-8')#创建一个文件处理器,也就是把日志写到文件里头
    fh.setLevel(logging.INFO)#设置文件输出的级别
    sh = logging.StreamHandler()#创建一个控制台输出的处理器,这两个就是上面说的Handler
    sh.setLevel(logging.INFO)
    #设置控制台输出的日志级别,这两个级别都可以单独设置,他们俩和logger的级别区别是如果logger设置的级别比里面的handler级别设置的高,那么就以logger的级别为准
    th = handlers.TimedRotatingFileHandler('time',when='S',interval=1,backupCount=2)
    #指定间隔时间自动生成文件的处理器
    #interval是时间间隔,backupCount是备份文件的个数,如果超过这个超过这个个数,就会自动删除,when是间隔的时间单位,单位有以下几种:
                # S 秒
                # M 分
                # H 小时、
                # D 天、
                # W 每星期(interval==0时代表星期一)
                # midnight 每天凌晨
    th.setLevel(logging.INFO)
    formater = logging.Formatter('%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s')
    #指定日志格式,上面咱们写了常用的格式,直接指定了就行了,这也就是咱们上面说的Formatter
    sh.setFormatter(formater)
    fh.setFormatter(formater)
    th.setFormatter(formater)
    #设置两个处理器的日志格式
     
    logger.addHandler(sh)
    logger.addHandler(fh)
    logger.addHandler(th)
    #把两个handler加入容器里头,相当于把工作人员培训完了,你们可以上班了
    logger.debug('debug级别,最低级别,一般开发人员用来打印一些调试信息')
    logger.info('info级别,正常输出信息,一般用来打印一些正常的操作')
    logger.warning('waring级别,一般用来打印警信息')
    logger.error('error级别,一般用来打印一些错误信息')
    logger.critical('critical级别,一般用来打印一些致命的错误信息')

    这样logger这个日志办公室已经搞好了,咱们就可以直接用了,运行完发现文件也产生了,控制台也有日志。如果不设置日志级别的话,默认级别是waring。
    下面我们自己封装一个类来使用logging模块,方便使用,默认加一些配置

    import logging
    from logging import handlers
    class MyLogger():
        def __init__(self,file_name,level='info',backCount=5,when='M'):
            logger = logging.getLogger()  # 先实例化一个logger对象,先创建一个办公室
            logger.setLevel(self.get_level(level))  # 设置日志的级别的人
            cl = logging.StreamHandler()  # 负责往控制台输出的人
            bl = handlers.TimedRotatingFileHandler(filename=file_name, when=when, interval=1, backupCount=backCount, encoding='utf-8')
            fmt = logging.Formatter('%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s')  #时间  #打印哪个python文件的第几行  #日志级别  #打印的信息
            cl.setFormatter(fmt)  # 设置控制台输出的日志格式
            bl.setFormatter(fmt)  # 设置文件里面写入的日志格式
            logger.addHandler(cl)
            logger.addHandler(bl)
            self.logger = logger
    
        def get_level(self,str):
            level = {
                'debug':logging.DEBUG,
                'info':logging.INFO,
                'warn':logging.WARNING,
                'error':logging.ERROR
            }
            str = str.lower()
            return level.get(str)
    if __name__ == '__main__':
        lw_log = MyLogger('lw.log','debug',when='M')
        lw_log.logger.warning('哈哈哈')

    由于logging模块用起来实在是费劲,所以牛教授自己封装了一个日志模块供大家使用,非常方便,只需要直接pip install nnlog即可

    使用例子如下代码:

    import nnlog
    log = nnlog.Logger(file_name='my.log',level='debug',when='D',backCount=5,interval=1)
    #file_name是日志文件名
    #level是日志级别,如果不传的话默认是debug级别
    #when是日志文件多久生成一个,默认是按天,S 秒、M 分、 H 小时、 D 天、 W 每星期
    #backCount是备份几个日志文件,默认保留5天的
    #interval是间隔多久生成一个日志文件,默认是1天
    log.debug('默认日志级别是debug')
    log.info('info级别')
    log.warning('waring级别')
    log.error('error级别')
     
    log2 = nnlog.Logger(file_name='nn.log') #直接传入文件名也是ok的,其他的就取默认值了
    log2.debug('test')
  • 相关阅读:
    关于++i和i++的左值、右值问题
    运算符优先级
    计算机中的数及其编码
    递归函数
    PHP读取excel(4)
    替换元素节点replaceChild()
    子结点childNodes
    插入节点insertBefore()
    创建节点createElement
    插入节点appendChild()
  • 原文地址:https://www.cnblogs.com/mululu/p/9121770.html
Copyright © 2020-2023  润新知