logging模块详解
程序员文章站
2023-12-31 23:07:04
logging模块简单使用 1 import logging 2 3 # 记录debug级别的日志; 4 logging.debug("this is a debug info") 5 6 # 记录info级别的日志; 7 logging.info("this is a info") 8 9 # 记 ......
logging模块简单使用
1 import logging 2 3 # 记录debug级别的日志; 4 logging.debug("this is a debug info") 5 6 # 记录info级别的日志; 7 logging.info("this is a info") 8 9 # 记录警告级别的日志; 10 logging.warn("this is a warn") 11 WARNING:root:this is a warn 12 13 # 记录错误级别的日志; 14 logging.error("this is a error info") 15 ERROR:root:this is a error info 16 17 # 记录严重错误级别的日志; 18 logging.critical("this is a critical info") 19 CRITICAL:root:this is a critical info
总结:默认情况下,logging模块将日志打印到屏幕上(stdout),日志级别为WARNING(即只有日志级别高于WARNING的日志信息才会输出),日志格式为:日志级别 : 日志实例的名称 : 日志信息;
- 日志级别
日志级别 | 含义 |
---|---|
DEBUG | 调试信息,只有用户在调试代码时才会用; |
INFO | 确保代码按照预期正常运行; |
WARNING | 表明不久的将来会发生问题,软件还是在正常工作; |
ERROR | 由于更严重的问题,软件已不能执行一些功能了; |
CRITICAL | 严重错误,表明软件已不能继续运行了; |
其他重要的概念
Logger 记录器
|
创建方法:
1 logger = logging.getLogger("logger_name")
增加处理器Handler:
# 设置日志级别为ERROR,即只有级别>=ERROR的日志才会输出; logger.setLevel(logging.ERROR) # 为logger实例增加一个处理器; logger.addHandler(handler_name) # 为logger实例删除一个处理器 logger.removeHandler(handler_name)
Handler 处理器
将(记录器产生的)日志记录发送至合适的目的地。
Filter 过滤器
提供了更好的粒度控制,它可以决定输出哪些日志记录。
Formatter 格式化器
指明了最终输出中日志记录的布局。
除了加时间,还可以自定义一大堆格式,下表就是所有支持的格式
%(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 | 用户输出的消息 |
日志同时输出到屏幕和文件
如果想同时把log打印在屏幕和文件日志里,就需要了解一点复杂的知识 了
Python 使用logging模块记录日志涉及四个主要类,使用官方文档中的概括最为合适:
- logger提供了应用程序可以直接使用的接口;
- handler将(logger创建的)日志记录发送到合适的目的输出;
- filter提供了细度设备来决定输出哪条日志记录;
- formatter决定日志记录的最终输出格式。
他们之间的关系是这样的