logging模块 --logging模块提供通用的日志系统
Logging模块提供Logger,handler,filter,formatter
- Logger:记录器
- 应用程序代码能直接调用日志接口。
- Logger最常用的操作有两类:配置和发送日志消息。
- 初始化
logger = logging.getLogger("endlesscode")
,获取logger对象,getLogger()方法后面最好加上所要日志记录的模块名字,配置文件和打印日志格式中的%(name)s 对应的是这里的模块名字,如果不指定name则返回root对象。 - logger.setLevel(logging.DEBUG),Logging中有NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL这几种级别,日志会记录设置级别以上的日志
-
级别 何时使用 DEBUG 详细信息,典型地调试问题时会感兴趣 INFO 证明事情按预期工作 WARNING 表明发生了一些意外,或者不久的将来会发生问题(如‘磁盘满了’)。软件还是在正常工作 ERROR 由于更严重的问题,软件已不能执行一些功能了 CRITICAL 严重错误,表明软件已不能继续运行了 - 多次使用相同的name调用getLogger方法返回同一个looger对象;
- handler:处理器
- 将(记录器产生的)日志记录(log record)发送至合适的目的地(destination),比如文件,socket等。
- Handler常用的是StreamHandler和FileHandler,可以简单理解为一个是console和文件日志,一个打印在调试窗口上,一个记录在一个文件上
- 一个logger对象可以通过addHandler方法添加0到多个handler,每个handler又可以定义不同日志级别,以实现日志分级过滤显示。
- filter:过滤器
- 提供更好的粒度控制,它可以决定输出哪些日志记录
- formatter:格式化器
- 指明最终输出中日志记录的布局。
- 指定日志记录输出的具体格式。
- formatter的构造方法需要两个参数:消息的格式字符串和日期字符串,这两个参数都是可选的。
- 喜欢用这样的格式 '[%(asctime)s] [%(levelname)s] %(message)s', '%Y-%m-%d %H:%M:%S'
Logger 记录器
Logger是一个树形层级结构,在使用接口debug,info,warn,error,critical之前必须创建Logger实例
创建方法: logger = logging.getLogger(logger_name)
Handler 处理器
Handler处理器类型有很多种,比较常用的有三个,StreamHandler,FileHandler,NullHandler,详情可以访问Python logging.handlers
创建StreamHandler之后,可以通过使用以下方法设置日志级别,设置格式化器Formatter,增加或删除过滤器Filter。
创建方法: sh = logging.StreamHandler(stream=None)
FileHandler
创建方法: fh = logging.FileHandler(filename, mode='a', encoding=None, delay=False)
Formatter 格式化器
使用Formatter对象设置日志信息最后的规则、结构和内容,默认的时间格式为%Y-%m-%d %H:%M:%S。
创建方法: formatter = logging.Formatter(fmt=None, datefmt=None)
其中,fmt是消息的格式化字符串,datefmt是日期字符串。如果不指明fmt,将使用'%(message)s'。如果不指明datefmt,将使用ISO8601日期格式。
有用的format格式
格式 | 描述 |
---|---|
%(levelno)s | 打印日志级别的数值 |
%(levelname)s | 打印日志级别名称 |
%(pathname)s | 打印当前执行程序的路径 |
%(filename)s | 打印当前执行程序名称 |
%(funcName)s | 打印日志的当前函数 |
%(lineno)d | 打印日志的当前行号 |
%(asctime)s | 打印日志的时间 |
%(thread)d | 打印线程id |
%(threadName)s | 打印线程名称 |
%(process)d | 打印进程ID |
%(message)s | 打印日志信息 |
Filter 过滤器
Handlers和Loggers可以使用Filters来完成比级别更复杂的过滤。Filter基类只允许特定Logger层次以下的事件。例如用‘A.B’初始化的Filter允许Logger ‘A.B’, ‘A.B.C’, ‘A.B.C.D’, ‘A.B.D’等记录的事件,logger‘A.BB’, ‘B.A.B’ 等就不行。 如果用空字符串来初始化,所有的事件都接受。
创建方法: filter = logging.Filter(name='')