101.logging
Posted tk-tank
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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')
以上是关于101.logging的主要内容,如果未能解决你的问题,请参考以下文章