• python3 logging 模块使用教程


    导入 logging 模块

    import logging

    日志级别

    • DEBUG
      • 详细信息,典型地调试问题时会感兴趣
    • INFO
      • 证明事情按预期工作
    • WARNING
      • 表明发生了一些意外
      • 或者不久的将来会发生问题(如‘磁盘满了’)
      • 但是软件还是在正常工作
    • ERROR
      • 由于更严重的问题,软件已不能执行一些功能了
    • CRITICAL
      • 严重错误,表明软件已不能继续运行了
    logging.debug('debug message')
    logging.info('info message')
    logging.warning('warning message')
    logging.error('error message')
    logging.critical('critical message')

    配置

    # 通过下面的方式进行简单配置输出方式与日志级别
    logging.basicConfig(filename='logger.log', level=logging.INFO)

    几个重要的概念

    • Logger,记录器,暴露了应用程序代码能直接使用的接口。
    • Handler,处理器,将(记录器产生的)日志记录发送至合适的目的地。
    • Filter,过滤器,提供了更好的粒度控制,它可以决定输出哪些日志记录。
    • Formatter,格式化器,指明了最终输出中日志记录的布局。

    Logger 记录器

    • Logger 是一个树形层级结构
    • 在使用接口 debug,info,warning,error,critical 之前必须创建 Logger 实例
    • 即创建一个记录器
    • 如果没有显式的进行创建,则默认创建一个 root logger
    • 并应用默认的日志级别(WARNING)
    • 处理器 Handler(StreamHandler,即将日志信息打印输出在标准输出上)
    • 格式化器 Formatter(默认的格式即为第一个简单使用程序中输出的格式)
    logger = logging.getLogger(logger_name)
    # 设置日志级别为ERROR,即只有日志级别大于等于ERROR的日志才会输出
    logger.setLevel(logging.ERROR)
    # 为Logger实例增加一个处理器
    logger.addHandler(handler_name)
    # 为Logger实例删除一个处理器
    logger.removeHandler(handler_name)

    Handler 处理器

    Handler 处理器类型有很多种,比较常用的有三个

    • StreamHandler
    • FileHandler
    • NullHandler
    sh = logging.StreamHandler(stream=None)
    fh = logging.FileHandler(filename, mode='a', encoding=None, delay=False)
    # NullHandler类位于核心logging包,不做任何的格式化或者输出
    # 本质上它是个“什么都不做”的handler,由库开发者使用
    nf = logging.NullHandler()

    创建 StreamHandler 之后

    • 可以通过使用以下方法设置日志级别
    • 设置格式化器 Formatter
    • 增加或删除过滤器 Filter
    # 指定日志级别,低于 WARNING 级别的日志将被忽略
    handler.setLevel(logging.WARNING)
    # 设置一个格式化器 formatter
    handler.setFormatter(formatter_name)
    # 增加一个过滤器,可以增加多个
    handler.addFilter(filter_name)
    # 删除一个过滤器
    handler.removeFilter(filter_name)

    Formatter 格式化器

    • 使用 Formatter 对象设置日志信息最后的规则、结构和内容
    • 默认的时间格式为 %Y-%m-%d %H:%M:%S
    # fmt是消息的格式化字符串,如果不指明fmt,将使用'%(message)s'
    # datefmt是日期字符串,如果不指明datefmt,将使用ISO8601日期格式。
    formatter = logging.Formatter(fmt=None, datefmt=None)

    Filter 过滤器

    • Handlers 和 Loggers 可以使用 Filters 来完成比级别更复杂的过滤
    • Filter 基类只允许特定 Logger 层次以下的事件
    filter = logging.Filter(name='')
    import logging
    
    # create logger
    logger_name = "example"
    logger = logging.getLogger(logger_name)
    logger.setLevel(logging.DEBUG)
    
    # create file handler
    log_path = "demo03.log"
    fh = logging.FileHandler(log_path)
    fh.setLevel(logging.WARNING)
    
    # create formatter
    fmt = "%(asctime)-15s %(levelname)s %(filename)s %(lineno)d %(process)d %(message)s"
    datefmt = "%a %d %b %Y %H:%M:%S"
    formatter = logging.Formatter(fmt, datefmt)
    
    # add handler and formatter to logger
    fh.setFormatter(formatter)
    logger.addHandler(fh)
    
    # print log info
    logger.debug('debug message')
    logger.info('info message')
    logger.warning('warning message')
    logger.error('error message')
    logger.critical('critical message')

    配置方式

    • 显式创建记录器 Logger、处理器 Handler 和格式化器 Formatter,并进行相关设置
    • 通过简单方式进行配置,使用 basicConfig() 函数直接进行配置
    • 通过配置文件进行配置,使用 fileConfig() 函数读取配置文件
    • 通过配置字典进行配置,使用 dictConfig() 函数读取配置信息
    • 通过网络进行配置,使用 listen() 函数进行网络配置

    basicConfig 关键字参数

    • filename
      • 创建一个 FileHandler,使用指定的文件名,而不是使用 StreamHandler
    • filemode
      • 如果指明了文件名,指明打开文件的模式(如果没有指明 filemode,默认为 a
    • format
      • handler 使用指明的格式化字符串
    • datefmt
      • 使用指明的日期/时间格式
    • level
      • 指明根 logger 的级别
    • stream
      • 使用指明的流来初始化 StreamHandler,该参数与 filename 不兼容,
      • 如果两个都有,stream 被忽略

    format 格式

    • %(levelno)s,打印日志级别的数值
    • %(levelname)s,打印日志级别名称
    • %(pathname)s,打印当前执行程序的路径
    • %(filename)s,打印当前执行程序名称
    • %(funcName)s,打印日志的当前函数
    • %(lineno)d,打印日志的当前行号
    • %(asctime)s,打印日志的时间
    • %(thread)d,打印线程 ID
    • %(threadName)s,打印线程名称
    • %(process)d,打印进程 ID
    • %(message)s,打印日志信息

    datefmt 格式

    • %a,本地的缩写工作日名称
    • %A,本地的完整工作日名称
    • %b,本地的缩写月份名称
    • %B,本地的全月名称
    • %c,本地的适当日期和时间表示
    • %d,每月的一天作为小数 [01,31]
    • %H,小时(24 小时时钟)作为小数 [00,23]
    • %I,小时(12 小时时钟)作为小数目 [01,12]
    • %j,一年中的一天作为小数 [001,366]
    • %m,月作为小数 [01,12]
    • %M,分钟作为小数 [00,59]
    • %p,本地相当于上午或下午
    • %S,第二为小数 [00,61]
    • %U,年度周数(星期日为一周的第一天)为小数 [00,53]
      • 第一个星期天前的新年中的所有日子都被认为是在第 0 周
    • %w,平日作为小数 [0 (星期日), 6]
    • %W,年度周数(星期一为一周的第一天)为小数 [00,53]
      • 第一个星期一之前的新年的所有日子都被认为是在第 0 周
    • %x,本地的适当日期表示
    • %X,本地的适当时间表示
    • %y,没有世纪的年份作为小数 [00,99]
    • %Y,以世纪为小数的年份
    • %Z,时区名称(如果没有时区,则不存在字符)
    • %%,字面意思 %
    [loggers]
    keys=root,example01
    
    [logger_root]
    level=DEBUG
    handlers=hand01,hand02
    
    [logger_example01]
    handlers=hand01,hand02
    qualname=example01
    propagate=0
    
    [handlers]
    keys=hand01,hand02
    
    [handler_hand01]
    class=StreamHandler
    level=INFO
    formatter=form01
    args=(sys.stderr,)
    
    [handler_hand02]
    class=FileHandler
    level=DEBUG
    formatter=form02
    args=('demo04.log', 'a')
    
    [formatters]
    keys=form01,form02
    
    [formatter_form01]
    format=%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s
    
    [formatter_form02]
    format=%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s

    log.py文件

    import logging
    import logging.config
    
    logging.config.fileConfig("logging.conf")
    
    # create logger
    logger_name = 'example01'
    logger = logging.getLogger(logger_name)
    
    logger.debug('debug message')
    logger.info('info message')
    logger.warning('warning message')
    logger.error('error message')
    logger.critical('critical message')
    
  • 相关阅读:
    C++内存分配
    扩展哈夫曼编码
    用递归函数和栈操作逆序一个栈
    非递归遍历二叉树
    malloc/free和new/delete
    洗牌算法及其证明
    野指针问题
    计算编辑距离
    数组指针/指针数组的使用
    sizeof/strlen/length
  • 原文地址:https://www.cnblogs.com/yizhipanghu/p/15566983.html
Copyright © 2020-2023  润新知