zoukankan      html  css  js  c++  java
  • 101.logging

    参考资料

    logging常用函数

    • logging.debug(msg, *args, **kwargs) 创建一条严重级别为DEBUG的日志记录
    • logging.info(msg, *args, **kwargs) 创建一条严重级别为INFO的日志记录
    • logging.warning(msg, *args, **kwargs) 创建一条严重级别为WARNING的日志记录
    • logging.error(msg, *args, **kwargs) 创建一条严重级别为ERROR的日志记录
    • logging.critical(msg, *args, **kwargs) 创建一条严重级别为CRITICAL的日志记录
    • logging.log(level, *args, **kwargs) 创建一条严重级别为level的日志记录
    • logging.basicConfig(**kwargs) 对root logger进行一次性配置

    logging.basicConfig(**kwargs)参数

    • 参数filename:指定信息输出的文件,默认输出控制台
    • 参数filemode:指定信息的写入模式,默认"a"
    • 参数format:指定日志格式字符串
    • 参数datefmt:指定日期/时间格式
    • 参数level:指定日志器的日志级别
    • 参数stream:指定日志输出目标,stream和filename不能同时提供,否则会引发 ValueError异常
    • 参数style:指定format格式字符串的风格

    format格式字符串

    • %(asctime)s 时间
    • %(created)f 时间戳
    • %(msecs)d 日志时间的毫秒部分
    • %(levelname)s 文本形式的日志级别
    • %(levelno)s 数字形式的日志级别
    • %(name)s 使用的日志其名称
    • %(message)s 日志的文本内容
    • %(pathname)s 调用日志记录函数的源码文件的全路径
    • %(filename)s pathname的文件名部分,包含文件后缀
    • %(module)s filename的名称部分,不包含后缀
    • %(lineno)d 调用日志记录函数的源代码所在的行号
    • %(funcName)s调用日志记录函数的函数名
    • %(process)d 进程ID
    • %(processName)s 进程名称
    • %(thread)d 线程ID
    • %(thread)s 线程名称

    案例

    import logging
    
    logging.basicConfig(filename="./t.txt",
                        level=logging.DEBUG,
                        format="%(asctime)s : %(levelname)s : %(message)s")
    
    logging.debug("这是一个bug")
    logging.info("这是一个info")
    logging.warning("这是一个warning")
    logging.error("这是一个error")
    logging.critical("这是一个critical")  
    

    logging模块的处理流程

    logging四大组件

    • logger:提供应用程序代码直接使用的接口
    • handler:用于将日志记录发送到指定的目的位置,不同级别不同处理
    • filter:更细致的筛选日志内容,决定哪部分内容输出,那部分丢弃
    • fromatter:控制日志信息的最终输出格式

    日志模块的常用方法

    Logger

    • 可以直接实例化logger,使用logging.getlog()方法
    • 设置
      • logger.setLevel()设置日志处理器处理日志的最低等级
      • logger.addHandler()和logger.removeHandler()为logger添加或删除一个handler对象
      • logger.addFilter()和logger.removeFilter()为logger添加或删除一个filter对象
    • 方法
      • logger.debug()产生一天bug级别的日志,同info,warning等
      • logger.exception()创建一个类似与logger.error()的日志
      • logger.log()需要获取一个明确的日志level参数来创建一个日志记录

    Handler

    • handler是一个基类,不要实例化或使用它,值需要配置几个方法,需要使用的去使用子类
    • 方法
      • Handler.setLevel() 设置handler将会处理的日志消息的最低严重级别
      • Handler.setFormatter() 为handler设置一个格式器对象
      • Handler.addFilter() 和 Handler.removeFilter() 为handler添加 和 删除一个过滤器对象
    • 子类
      • logging.StreamHandler 将日志消息发送到输出到Stream,如std.out, std.err或任何file-like对象。
      • logging.FileHandler 将日志消息发送到磁盘文件,默认情况下文件大小会无限增长
      • logging.handlers.RotatingFileHandler 将日志消息发送到磁盘文件,并支持日志文件按大小切割
      • logging.hanlders.TimedRotatingFileHandler 将日志消息发送到磁盘文件,并支持日志文件按时间切割
      • logging.handlers.HTTPHandler 将日志消息以GET或POST的方式发送给一个HTTP服务器
      • logging.handlers.SMTPHandler 将日志消息发送给一个指定的email地址
      • logging.NullHandler 该Handler实例会忽略error messages,通常被想使用 logging的library开发者使用来避免'No handlers could be found for logger XXX'信息的出现

    Formater

    • 直接实例化
    • 参数
      • fmt:指定消息格式化字符串,如果不指定该参数则默认使用message的原始值
      • datefmt:指定日期格式字符串,如果不指定该参数则默认使用"%Y-%m-%d %H:%M:%S"
      • style:可取值为 '%', '{'和 '$',如果不指定该参数则默认使用'%'

    Filter

    • 日志过滤功能
    • Filter是一个过滤器基类,它只允许某个logger层级下的日志事件通过过滤

    案例

    • 需求
      • 1)要求将所有级别的所有日志都写入磁盘文件中
      • 2)all.log文件中记录所有的日志信息,日志格式为:日期和时间 - 日志级别 - 日志信息
      • 3)error.log文件中单独记录error及以上级别的日志信息,日志格式为:日期和时间 - 日志级别 - 文件名[:行号] - 日志信息
      • 4)要求all.
    • 分析
      • 1)要记录所有级别的日志,因此日志器的有效level需要设置为最低级别--DEBUG;
      • 2)日志需要被发送到两个不同的目的地,因此需要为日志器设置两个handler;另外,两个目的地都是磁盘文件,因此这两个handler都是与FileHandler相关的;
      • 3)all.log要求按照时间进行日志切割,因此他需要用logging.handlers.TimedRotatingFileHandler; 而error.log没有要求日志切割,因此可以使用FileHandler;
      • 4)两个日志文件的格式不同,因此需要对这两个handler分别设置格式器;
    import logging
    import logging.handlers
    import datetime
    
    logger = logging.getLogger('mylogger')
    logger.setLevel(logging.DEBUG)
    
    rf_handler = logging.handlers.TimedRotatingFileHandler('all.log', when='midnight', interval=1, backupCount=7, atTime=datetime.time(0, 0, 0, 0))
    rf_handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s"))
    
    f_handler = logging.FileHandler('error.log')
    f_handler.setLevel(logging.ERROR)
    f_handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(filename)s[:%(lineno)d] - %(message)s"))
    
    logger.addHandler(rf_handler)
    logger.addHandler(f_handler)
    
    logger.debug('debug message')
    logger.info('info message')
    logger.warning('warning message')
    logger.error('error message')
    logger.critical('critical message')
    
  • 相关阅读:
    Eclipse复制或修改项目后,把项目部署后发现还是原来的项目名称
    eclipse设置新建jsp文件默认字符编码为utf-8
    mysql数据库无法插入中文字符
    Dos中查看mysql数据时 中文乱码
    spring 解决中文乱码问题
    mysql再次安装问题
    The import javax.servlet cannot be resolved
    eclipse快捷键补全
    eclipse自动补全
    hibernate运行常见错误
  • 原文地址:https://www.cnblogs.com/TK-tank/p/12298450.html
Copyright © 2011-2022 走看看