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')
posted @ 2020-02-12 11:56  TK_tank  阅读(151)  评论(0编辑  收藏  举报