• python专题logging模块


    一 前言

    本篇内容是logging日志配置基础篇,学完本篇,读者将会理解日志,使用日志,自定义配置日志;

    公众号:知识追寻者

    知识追寻者(Inheriting the spirit of open source, Spreading technology knowledge;)

    二 日志

    2.1 日志级别

    日志级别从高到低顺序(50-10) :critical --> error --> warning --> info --> debug ;

    日志级别越高,打印信息越少;

    1. debug 最详细的日志信息,经常用于开发调试 阶段
    2. info 打印关键信息;
    3. warning 警告信息,提示产生不期望的异常信息
    4. error 错误信息,异常信息;
    5. critical 严重错误信息,会导致程序无法运行;

    2.2 日志函数

    日志模块函数如下

    1. logging.debug(msg, *args, kwargs) debug级别日志
    2. logging.info(msg, *args, kwargs) info级别日志
    3. logging.warning(msg, *args, kwargs) warning级别日志
    4. logging.error(msg, *args, **kwargs) error级别日志
    5. logging.critical(msg, *args, kwargs) critical级别日志
    6. logging.log(level, *args, **kwargs) 指定级别日志
    7. logging.basicConfig(**kwargs) 一次性配置日志

    常用参数如下

    • filename 输出文件日志
    • filemode 文件模式, r , a , w
    • format 日志输出的格式
    • datefat 默认日期格式
    • level 设置日志输出级别

    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 打印日志信息
    • %(module)s:打印模块名称

    简单日志示例如下,无法满足生产需求,最终还是需要自定义日志;

    import logging
    
    logging.basicConfig(filename="test.log", filemode="w", format="%(asctime)s %(name)s:%(levelname)s:%(message)s", datefmt="%d-%m-%Y %H:%M:%S", level=logging.DEBUG)
    logging.debug('debug message')
    logging.info('info message')
    logging.warning('warning message')
    logging.error('error message')
    logging.critical('critical message')
    

    输出至test.log文件内容

    29-04-2020 17:34:44 root:DEBUG:debug message
    29-04-2020 17:34:44 root:INFO:info message
    29-04-2020 17:34:44 root:WARNING:warning message
    29-04-2020 17:34:44 root:ERROR:error message
    29-04-2020 17:34:44 root:CRITICAL:critical message
    

    2.3 自定义Logger

    logger组件如下

    1. 日志器 (Logger) 配置和发送日志消息;
    2. 处理器( Handler ) 日志的输出地方;一个日志器可以拥有多个处理器;
    3. 过滤器 (Filter) 过滤筛选日志,是否丢弃日志;
    4. 格式器( Formatter) 日志的输出格式

    常用的 Handler

    • logging.StreamHandler:日志输出到流,如sys.stderr,sys.stdout 或者文件;
    • logging.FileHandler:日志输出到文件。
    • logging.handlers.TimeRotatingHandler:在一定时间区域内回滚日志文件。
    • logging.handlers.SMTPHandler;远程输出日志到邮件地址。
    • logging.handlers.SocketHandler;远程输出日志到TCP/IP sockets。
    • logging.handlers.HTTPHandler;通过”GET”或者”POST”远程输出到HTTP服务器。

    示例如下

    import logging
    import sys
    
    # 取名为 zszsz 的日志器
    logger = logging.getLogger("zszsz")
    logger.setLevel(level=logging.DEBUG)
    # 设置日志格式
    formatter = logging.Formatter(fmt='%(asctime)s - %(name)s - %(levelname)s - %(message)s',datefmt="%d-%m-%Y %H:%M:%S")
    """ 处理器1 """
    # 输出到控制台
    stream_handler = logging.StreamHandler(sys.stdout)
    # 设置日志级别
    stream_handler.setLevel(level=logging.DEBUG)
    # 添加日志格式
    stream_handler.setFormatter(formatter)
    # 添加处理器
    logger.addHandler(stream_handler)
    """ 处理器2 """
    # 输出到文件
    file_handler = logging.FileHandler('zszsz.log')
    # 设置日志级别
    file_handler.setLevel(level=logging.INFO)
    # 添加日志格式
    file_handler.setFormatter(formatter)
    # 添加处理器
    logger.addHandler(file_handler)
    
    # 日志
    logger.debug('-------------知识追寻者!!!')
    logger.info('-------------info级别!!!')
    

    控制台输出

    07-05-2020 10:59:27 - zszsz - DEBUG - -------------知识追寻者!!!
    07-05-2020 10:59:27 - zszsz - INFO - -------------info级别!!!
    

    文件输出

    07-05-2020 10:59:27 - zszsz - INFO - -------------info级别!!!
    

    2.4 日志配置

    logging.conf 配置示例如下,根据自定义Logger的逻辑进行配置理解;

    [loggers]
    keys=root,simpleExample
    
    [handlers]
    keys=consoleHandler
    
    [formatters]
    keys=simpleFormatter
    
    [logger_root]
    level=DEBUG
    handlers=consoleHandler
    
    [logger_simpleExample]
    level=DEBUG
    handlers=consoleHandler
    qualname=simpleExample
    propagate=0
    
    [handler_consoleHandler]
    class=StreamHandler
    level=DEBUG
    formatter=simpleFormatter
    args=(sys.stdout,)
    
    [formatter_simpleFormatter]
    format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
    datefmt=
    

    调用示例

    # -*- encoding:utf-8 -*-
    
    import logging
    from logging import config
    
    # 获取配置
    config.fileConfig(fname='logging.conf', disable_existing_loggers=False)
    logger = logging.getLogger('simpleExample')
    logger.debug('debug message')
    logger.info('info message')
    logger.error('error message')
    logger.critical('critical message')
    
    

    输出

    2020-05-07 13:28:26,391 - simpleExample - DEBUG - debug message
    2020-05-07 13:28:26,391 - simpleExample - INFO - info message
    2020-05-07 13:28:26,391 - simpleExample - ERROR - error message
    2020-05-07 13:28:26,391 - simpleExample - CRITICAL - critical message
    

    更多内容参考官网

    https://docs.python.org/3.3/howto/logging.html#configuring-logging

  • 相关阅读:
    课后作业03-以淘宝网为例从质量的六个属性描述分析
    软件体系架构课后作业02-架构漫谈阅读笔记
    java中怎样跳出当前的多层循环嵌套
    redis二级缓存的五种数据类型的常用命令
    递归算法 菲波那切数列 (一个楼梯有n阶,每一次可以走一个台阶或者二个台阶请问总共有几种走法)
    restful代码风格
    java开发工程师面试题总结(适用于1-2年工作经验的人)
    Java中HashMap与HashTable的联系与区别
    HashMap扩容因子默认是0.75?底层数据结构? hash函数处理冲突的集中方式?
    设计模式
  • 原文地址:https://www.cnblogs.com/zszxz/p/12852985.html
Copyright © 2020-2023  润新知