• logging模块详解


    logging模块

    import logging
    
    # 1.生成一个logger对象
    logger = logging.getLogger()
    
    # 2.设置日志格式
    formatter = logging.Formatter(fmt="%(asctime)s - %(levelname)s :  %(message)s", datefmt='%Y-%m-%d %H:%M:%S')
    
    # 3.生成Handler对象
    handler = logging.FileHandler('log_test.log', encoding='utf-8')  # FileHandler表示将日志保存到文件中
    
    # 4.为Handler对象设置日志格式
    handler.setFormatter(formatter)
    
    # 5.为logger对象添加Handler处理器
    logger.addHandler(handler)
    
    # 6.设置日志级别
    logger.setLevel(logging.INFO)
    
    # 设置需要的日志信息
    logger.info('good')
    logger.debug('debug')   # 级别低于info,不会输出
    
    
    # 结果在log_test.log中
    # 2020-06-08 17:26:52 - INFO :  good
    

    一、Logger对象

    logging.getLogger('区分logger属于那个功能的日志')

    区分日志是属于那个功能的日志

    二、Level日志级别

    CRITICAL > ERROR > WARNING > INFO > DEBUG

    日志错误程度越高,级别越高

    • critical :日志设为该等级,只打印critical级别的日志,一个严重的错误,这表明程序本身可能无法继续运行

    • error : 日志设为该等级,打印errorcritical级别的日志,更严重的问题,软件没能执行一些功能

    • warning : 日志设为该等级,打印warningerrorcritical级别的日志,一个迹象表明,一些意想不到的事情发生了,或表明一些问题在不久的将来(例如。磁盘空间低”),这个软件还能按预期工作

    • info : 日志设为该等级,打印infowarningerrorcritical级别的日志,确认一切按预期运行

    • debug : 日志设为该等级,打印全部的日志,详细的信息,通常只出现在诊断问题上

    三、Handler处理器

    handler对象负责发送相关的信息到指定目的地

    1、StreamHandler

    logging.StreamHandler()

    输出日志到控制台,使用StreamHandler可以类似与sys.stdout或者sys.stderr的任何文件对象(file object)输出信息。

    2、FileHandler

    logging.FileHandler(filename, encoding='UTF-8', mode='a')

    输出日志在文件中,FileHandler会自动打开filename文件。

    filename是文件名字,mode是文件打开方式,默认以a方式打开,encoding指定编码格式。

    3、handlers.RotatingFileHandler

    logging.handlers.RotaingFileHandler(filename[, mode[, maxBytes[, backupCount]]])

    可以管理文件大小,当文件达到一定大小之后,它会自动将当前日志文件改名,然后创建 一个新的同名日志文件继续输出。

    • filename指定文件名字

    • mode指定文件打开方式

    • maxBytes指定日志文件的最大文件大小(如果为0,表示无限大,就不存在重命名)。例如,日志名字为log.log,当log.log达到指定的大小之后,会自动将名字改为log.log.1,如果log.log.1已存在,会先把log.log.1改为log.log.2,再log.log重命名为log.log.1,然后创建log.log继续输出日志。

    • backupCount用于指定保留的日志文件的个数。例如,如果指定为2,表示只保留两个日志文件,当上面描述的重命名过程发生时,原有的chat.log.2并不会被更名,而是被删除

    4、handlers.TimedRotatingFileHandler

    logging.handlers.TimedRotatingFileHandler(filename [,when [,interval [,backupCount]]])

    间隔一定时间就自动创建新的日志文件。重命名的过程与RotatingFileHandler类似,不过新的文件不是附加数字,而是当前时间

    • filename指定文件名字

    • interval指定时间间隔

    • when指定时间间隔单位

      • S 秒
      • M 分
      • H 小时
      • D 天
    • backupCount用于指定保留的日志文件的个数。例如,如果指定为2,表示只保留两个日志文件,当上面描述的重命名过程发生时,原有的chat.log.2并不会被更名,而是被删除

    5、处理器的level

    sh.setLevel(),fh.setLevel()

    除了logger,handler也可以设置级别,只有两个级别都通过时,才会输出日志。

    四、Formatter日志格式

    %(asctime)s 打印日志的时间
    %(filename)s 打印当前执行程序名称
    %(levelname)s 打印日志级别名称
    %(message)s 打印日志信息
    %(levelno)s 打印日志级别的数值
    %(pathname)s 打印当前执行程序的路径
    %(funcName)s 打印日志的当前函数
    %(lineno)d 打印日志的当前行号
    %(thread)d 打印线程id
    %(threadName)s 打印线程名称
    %(process)d 打印进程ID
    logging.Formatter(ftm, dateftm)
    
    • ftm日志格式,例如%(asctime)s-%(filename)s-%(levelname)s: %(message)s
    • dateftm时间格式,例如:%Y-%m-%d %H:%M:%S

    五、日志封装成类

    #! /usr/bin/python3
    # -*-coding:utf-8-*-
    
    import logging
    
    
    class Logger:
        def __init__(self, path, clevel=logging.DEBUG, Flevel=logging.DEBUG):
            self.logger = logging.getLogger(path)
            self.logger.setLevel(logging.DEBUG)   # 设置logger级别
            fmt = logging.Formatter('[%(asctime)s] [%(levelname)s] %(message)s', '%Y-%m-%d %H:%M:%S')
    
            # 设置CMD日志
            sh = logging.StreamHandler()
            sh.setFormatter(fmt)
            sh.setLevel(clevel)   # 设置处理器的Level
    
            # 设置文件日志
            fh = logging.FileHandler(path)
            fh.setFormatter(fmt)
            fh.setLevel(Flevel)		# 设置处理器的Level
            
            self.logger.addHandler(sh)
            self.logger.addHandler(fh)
    
        def debug(self, message):
            self.logger.debug(message)
    
        def info(self, message):
            self.logger.info(message)
    
        def war(self, message):
            self.logger.warn(message)
    
        def error(self, message):
            self.logger.error(message)
    
        def cri(self, message):
            self.logger.critical(message)
    
    
    if __name__ == '__main__':
        logyyx = Logger('yyx.log', logging.ERROR, logging.DEBUG)
        logyyx.debug('一个debug信息')
        logyyx.info('一个info信息')
        logyyx.war('一个warning信息')
        logyyx.error('一个error信息')
        logyyx.cri('一个致命critical信息')
    

    上篇logging:https://www.cnblogs.com/linagcheng/p/9456885.html

  • 相关阅读:
    linux里终端安转视频播放器的操作及显示
    String字符串操作
    普通类 抽象类 接口
    java基础
    关于window的端口查看及tomcat的端口修改问题
    eclipse的应用和整理
    mysql学习
    echarts的使用
    Failed to read candidate component class
    oracle学习笔记2
  • 原文地址:https://www.cnblogs.com/linagcheng/p/13067901.html
Copyright © 2020-2023  润新知