本帖最后由 我是楠楠 于 2019-9-24 14:18 编辑
【郑州校区】日志的高级用法
目标
1. 了解logging日志模块四大组件 2. 掌握如何讲日志输出到多个Handler中 思考: 1. 如何将日志信息同时输出到控制台和日志文件中? 2. 如何将不同级别的日志输出到不同的日志文件中? 3. 如何解决日志文件过大的问题? 1. logging日志模块四大组件
组件名称 | | | | | | | | | | | | | | 提供了更细粒度的控制工具来决定输出哪条日志记录,丢弃哪条日志记录 |
logging模块就是通过这些组件来完成日志处理的
1.1 组件之间的关系 日志器(logger)需要通过处理器(handler)将日志信息输出到目标位置,如:文件、sys.stdout、网络等; 不同的处理器(handler)可以将日志输出到不同的位置; 日志器(logger)可以设置多个处理器(handler)将同一条日志记录输出到不同的位置; 每个处理器(handler)都可以设置自己的格式器(formatter)实现同一条日志以不同的格式输出到不同的地方。 每个处理器(handler)都可以设置自己的过滤器(filter)实现日志过滤,从而只保留感兴趣的日志; 简单点说就是:日志器(logger)是入口,真正干活儿的是处理器(handler),处理器(handler)还可以通过过 滤器(filter)和格式器(formatter)对要输出的日志内容做过滤和格式化等处理操作。
1.2 Logger类 Logger对象的任务: 向程序暴露记录日志的方法 基于日志级别或Filter对象来决定要对哪些日志进行后续处理将日志消息传送给所有感兴趣的日志handlers 如何创建Logger对象 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() | | | | | | | |
1.1 Handler类 Handler对象的作用是将消息分发到handler指定的位置,比如:控制台、文件、网络、邮件等。 Logger对象可以通过addHandler()方法为自己添加多个handler对象。
如何创建Handler对象 在程序中不应该直接实例化和使用Handler实例,因为Handler是一个基类,它只定义了Handler应该有的接口。 应该使用Handler实现类来创建对象,logging中内置的常用的Handler包括: Handler | | | 将日志消息发送到输出到Stream,如std.out, std.err或任何file-like对象。 | | 将日志消息发送到磁盘文件,默认情况下文件大小会无限增长 | logging.handlers.RotatingFileHandler | 将日志消息发送到磁盘文件,并支持日志文件按大小切割 | logging.hanlders.TimedRotatingFileHandler | 将日志消息发送到磁盘文件,并支持日志文件按时间切割 | logging.handlers.HTTPHandler | 将日志消息以GET或POST的方式发送给一个HTTP服务器 | logging.handlers.SMTPHandler | |
Handler常用的方法
方法 | | | 设置handler将会处理的日志消息的最低严重级别 |
|
|
1.1 Formatter类 Formatter对象用于配置日志信息的格式。
如何创建Formatter对象 formatter = logging.Formatter(fmt=None, datefmt=None, style='%') fmt:指定消息格式化字符串,如果不指定该参数则默认使用message的原始值 datefmt:指定日期格式字符串,如果不指定该参数则默认使用"%Y-%m-%d %H:%M:%S" style:Python 3.2新增的参数,可取值为 '%', '{'和 '$',如果不指定该参数则默认使用'%' 1. 将日志信息同时输出到控制台和文件中实现步骤 1.创建日志器对象 2.创建控制台处理器对象 3.创建文件处理器对象 4.创建格式化器对象 5.把格式化器添加到处理器中 6.把处理器添加到日志器中 定义日志格式 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) 1. 每日生成一个日志文件 定义Handler对象 [AppleScript] 纯文本查看 复制代码 fh = logging.handlers.TimedRotatingFileHandler(filename, when='h', interval=1, backupCount=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个文件,删除最老的文件。 示例代码: [AppleScript] 纯文本查看 复制代码 import logging.handlers
logger = logging.getLogger() logger.setLevel(logging.DEBUG)
# 日志格式
fmt = "%(asctime)s %(levelname)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) |