标签:输出 logging 文件 测试 自动化 日志 级别 logger
1、概念
日志就是用于记录系统运行时的信息,对一个事件的记录;也称为Log。2、作用
调试程序
了解系统程序运行的情况,是否正常
系统程序运行故障分析与问题定位
用来做用户行为分析和数据统计
3、日志级别
日志级别是指日志信息的优先级、重要性或者严重程度。
常见的日志级别:
DEBUG → 调试级别,打印非常详细的日志信息,通常用于对代码的调试
INFO → 信息级别,打印一般的日志信息,突出强调程序的运行过程
WARNING → 警告级别,打印警告日志信息,表明会出现潜在错误的情形,一般不影响软件的正常使用
ERROR → 错误级别,打印错误异常信息,该级别的错误可能会导致系统的一些功能无法正常使用
CRITICAL → 严重错误级别,一个严重的错误,这表明系统可能无法继续运行、
DEBUG < INFO < WARNING < ERROR< CRITICAL
当为程序指定一个日志级别后,程序会记录所有日志级别大于或等于指定日志级别的日志信息,而不是仅仅记录指定级别的日志信息。
4、日志的基本用法
1. logging模块
Python中有一个标准库模块logging可以直接记录日志。
import logging logging.debug("这是一条调试信息") logging.info("这是一条普通信息") logging.warning("这是一条警告信息") logging.error("这是一条错误信息") logging.critical("这是一条严重错误信息")
2. 设置日志级别
logging中默认的日志级别为WARNING,程序中大于等于该级别的日志才能输出,小于该级别的日志不会被打印出来。
logging.basicConfig(level=logging.DEBUG)
如何选择日志级别:
1)开发环境和测试环境
为了尽可能详细的查看程序的运行状态来保证上线后的稳定性,可以使用DEBUG或INFO级别的日志获取详细的日志信息。2)生产环境
通常只记录程序的异常信息、错误信息等,可以设置成WARNING或ERROR级别。
3. 设置日志格式
logging.basicConfig(format="%(levelname)s:%(name)s:%(message)s")
format参数中可能用到的格式化信息:
%(name)s → Logger的名字
%(levelno)s → 数字形式的日志级别
%(levelname)s → 文本形式的日志级别
%(pathname)s → 调用日志输出函数的模块的完整路径名,可能没有
%(filename)s → 调用日志输出函数的模块的文件名
%(module)s → 调用日志输出函数的模块名
%(funcName)s → 调用日志输出函数的函数名
%(lineno)d → 调用日志输出函数的语句所在的代码行
%(created)f → 当前时间,用UNIX标准的表示时间的浮 点数表示
%(relativeCreated)d → 输出日志信息时的,自Logger创建以来的毫秒数
%(asctime)s → 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”
%(thread)d → 线程ID。可能没有
%(threadName)s → 线程名。可能没有
%(process)d → 进程ID。可能没有
%(message)s → 用户输出的消息
示例代码:
import logging fmt = '%(asctime)s %(levelname)s [%(name)s] [%(filename)s(%(funcName)s:%(lineno)d)] - % (message)s' logging.basicConfig(level=logging.INFO, format=fmt) logging.debug("这是一条调试信息") logging.info("这是一条普通信息") logging.warning("这是一条警告信息") logging.error("这是一条错误信息")4. 将日志信息输出到文件中
logging.basicConfig(filename="a.log")
5、日志的高级用法
1. logging日志模块四大组件
日志器 → Logger → 提供了程序使用日志的入口
处理器 → Handler → 将logger创建的日志记录发送到合适的目的输出
格式器 → Formatter → 决定日志记录的最终输出格式
过滤器 → Filter → 提供了更细粒度的控制工具来决定输出哪条日志记录,丢弃哪条日志记录
2. Logger类
Logger对象的任务:
向程序暴露记录日志的方法
基于日志级别或Filter对象来决定要对哪些日志进行后续处理
将日志消息传送给所有感兴趣的日志handlers
logger = logging.getLogger() logger = logging.getLogger("myLogger")
logging.getLogger()方法有一个可选参数name,该参数表示将要返回的日志器的名称标识,如果不提供该参数,则返回root日志器对象。 若以相同的name参数值多次调用getLogger()方法,将会返回指向同一个logger对象的引用。
Logger常用的方法:
方法 | 描述 |
logger.debug() logger.info() logger.warning() logger.error() logger.critical() | 打印日志 |
logger.setLevel() | 设置日志器将会处理的日志消息的最低严重级别 |
logger.addHandler() | 为该logger对象添加一个handler对象 |
logger.addFilter() | 为该logger对象添加一个filter对象 |
3. Handler类
Handler对象的作用是将消息分发到handler指定的位置,比如:控制台、文件、网络、邮件等。
使用Handler实现类来创建对象,logging中内置的常用的Handler包括:
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地址 |
Handler常用的方法:
方法 | 描述 |
handler.setLevel() | 设置handler将会处理的日志消息的最低严重级别 |
handler.setFormatter() | 为handler设置一个格式器对象 |
handler.addFilter() | 为handler添加一个过滤器对象 |
4. Formatter类
formatter = logging.Formatter(fmt=None, datefmt=None, style='%') # fmt:指定消息格式化字符串,如果不指定该参数则默认使用message的原始值 # datefmt:指定日期格式字符串,如果不指定该参数则默认使用"%Y-%m-%d %H:%M:%S" # style:Python 3.2新增的参数,可取值为 '%', '{'和 '$',如果不指定该参数则默认使用'%'
日志的高级用法示例:
将日志信息同时输出到控制台和文件中
import logging # 定义日志格式 fmt = '%(asctime)s %(levelname)s [%(name)s] [%(filename)s(%(funcName)s:%(lineno)d)] - % (message)s' formatter = logging.Formatter(fmt) # 把日志输出到控制台中 logger = logging.getLogger() sh = logging.StreamHandler() sh.setFormatter(formatter) logger.addHandler(sh) # 把日志输出到文件中 fh = logging.FileHandler("./b.log") fh.setFormatter(formatter) logger.addHandler(fh)
6、每日生成一个日志文件
将日志信息记录到文件中,以特定的时间间隔切换日志文件。
fh = logging.handlers.TimedRotatingFileHandler(filename, when='h', interval=1, backupCo unt=0)
filename: 日志文件名
when: 时间单位,可选参数
S - Seconds
M - Minutes
H - Hours
D - Days
midnight - roll over at midnight
W{0-6} - roll over on a certain day; 0 - Monday
interval: 时间间隔
backupCount: 日志文件备份数量。如果backupCount大于0,那么当生成新的日志文件时,将只保留backupCount个文件,删除最老的文件。
示例代码:
import logging.handlers logger = logging.getLogger() logger.setLevel(logging.DEBUG) # 定义日志格式 fmt = '%(asctime)s %(levelname)s [%(name)s] [%(filename)s(%(funcName)s:%(lineno)d)] - % (message)s' formatter = logging.Formatter(fmt) # 输出到文件,每日一个文件 fh = logging.handlers.TimedRotatingFileHandler("./a.log", when='MIDNIGHT', interval=1, backupCount=3) fh.setFormatter(formatter) fh.setLevel(logging.INFO) logger.addHandler(fh)
标签:输出,logging,文件,测试,自动化,日志,级别,logger 来源: https://www.cnblogs.com/mtoy/p/16460475.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。