logging模块使用
使用print打印信息遇到稍微复杂的python脚本就会炸:一大堆结果和调试信息混杂在一起啥情况都看不出来。写了一个从MDX文件读取17万条文本数据格式化成json再转存sqlite3的脚本,格式话过程使用logging模块来调试例外情况还是相当舒适的。
基础使用
实现简单的日志输出
示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| import logging
logging.basicConfig( level=logging.DEBUG, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", datefmt="%Y-%m-%d %H:%M:%S", filename="test.log" )
logging.debug("一条调试信息") logging.info("一条普通信息") logging.warning("一条警告信息") logging.error("一条错误信息") logging.critical("一条严重错误信息")
|
错误级别
错误级别 |
细节 |
DEBUG |
详细的调试信息,通常用于开发阶段 |
INFO |
程序正常运行时的信息 |
WARNING |
表示潜在的问题,但程序仍能正常运行 |
ERROR |
表示程序中的错误,导致某些功能无法正常工作 |
CRITICAL |
表示严重的错误,可能导致程序崩溃 |
拓展用法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| import logging from logging.handlers import MemoryHandler, RotatingFileHandler
logger = logging.getLogger("my_app") logger.setLevel(logging.DEBUG)
console_handler = logging.StreamHandler() console_handler.setLevel(logging.INFO)
file_handler = RotatingFileHandler( filename="app.log", maxBytes=1024*1024, backupCount=5, encoding="utf-8" ) file_handler.setLevel(logging.DEBUG)
buffer_handler = MemoryHandler( capacity=100, flushLevel=logging.ERROR, target=file_handler )
formatter = logging.Formatter( "[%(asctime)s][%(levelname)s][%(filename)s:%(lineno)d] %(message)s", datefmt="%Y-%m-%d %H:%M:%S" )
console_handler.setFormatter(formatter) file_handler.setFormatter(formatter)
logger.addHandler(console_handler) logger.addHandler(buffer_handler)
logger.debug("这段不会打印到控制台,但是会写入到日志文件中") logger.error("出错啦")
|
控制台结果如下
1
| [2025-05-04 10:17:08][ERROR][log.py:75] 出错啦
|
日志文件结果如下
1 2
| [2025-05-04 10:21:54][DEBUG][log.py:75] 这段不会打印到控制台,但是会写入到日志文件中 [2025-05-04 10:21:54][ERROR][log.py:76] 出错啦
|
流程图
flowchart LR
A[文件处理器]
B[控制台处理器]
C[内存缓存处理器]
D[实例化的日志记录器]
C -- 关联 ---A
A --> D
B --> D
D --提供--> E[logger.DEBUG...]