
Python使用logging
在 Python 中,logging
模块是一个强大的日志工具,可以灵活地记录程序运行时的信息,支持不同日志级别、输出位置和格式。以下是基本使用方法和常见场景:
1. 基础用法
import logging
# 配置基础日志格式和级别(默认级别是 WARNING)
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# 记录不同级别的日志
logging.debug("这是一条 DEBUG 日志") # 默认不会显示(级别低于 INFO)
logging.info("这是一条 INFO 日志")
logging.warning("这是一条 WARNING 日志")
logging.error("这是一条 ERROR 日志")
logging.critical("这是一条 CRITICAL 日志")
输出示例:
2023-10-01 12:34:56,789 - root - INFO - 这是一条 INFO 日志
2023-10-01 12:34:56,790 - root - WARNING - 这是一条 WARNING 日志
...
2. 日志级别
级别从低到高:DEBUG < INFO < WARNING < ERROR < CRITICAL
。
设置
level=logging.DEBUG
会记录所有级别的日志。默认级别是
WARNING
,只会记录该级别及更严重的日志。
3. 输出到文件
import logging
logging.basicConfig(
filename='app.log', # 日志文件名
level=logging.DEBUG, # 记录 DEBUG 及以上级别
format='%(asctime)s - %(levelname)s - %(message)s',
filemode='w' # 模式:'w' 覆盖写入,'a' 追加写入
)
logging.info("这条日志会保存到 app.log 文件中")
4. 高级配置(Handler、Formatter)
使用 Logger
对象、Handler
和 Formatter
实现更灵活的日志控制:
import logging
# 创建 Logger 对象
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG) # 设置全局日志级别
# 创建控制台 Handler,设置级别为 INFO
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)
# 创建文件 Handler,设置级别为 DEBUG
file_handler = logging.FileHandler('app.log')
file_handler.setLevel(logging.DEBUG)
# 定义日志格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)
# 将 Handler 添加到 Logger
logger.addHandler(console_handler)
logger.addHandler(file_handler)
# 记录日志
logger.debug("DEBUG 级别日志(仅文件可见)")
logger.info("INFO 级别日志(控制台和文件可见)")
5. 日志格式说明
Formatter
支持丰富的占位符,例如:
%(asctime)s
: 时间戳%(levelname)s
: 日志级别%(message)s
: 日志内容%(name)s
: Logger 名称%(filename)s
: 文件名%(lineno)d
: 行号%(funcName)s
: 函数名
6. 禁用第三方库的日志
如果第三方库(如 requests
)产生过多日志,可以单独设置其日志级别:
logging.getLogger("requests").setLevel(logging.WARNING)
7. 最佳实践
在模块中使用
logger = logging.getLogger(__name__)
,而非直接使用根 Logger。根据需要为不同的 Handler 设置不同的日志级别和格式。
使用
try-except
时记录异常信息:try: # 可能出错的代码 except Exception as e: logger.error("发生错误: %s", e, exc_info=True) # 记录堆栈信息
完整示例
import logging
# 配置全局日志
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
# 控制台输出(INFO 级别)
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)
# 文件输出(DEBUG 级别)
file_handler = logging.FileHandler('debug.log')
file_handler.setLevel(logging.DEBUG)
# 定义日志格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)
# 添加 Handler
logger.addHandler(console_handler)
logger.addHandler(file_handler)
# 示例日志
logger.debug("调试信息")
logger.info("程序正常运行")
logger.warning("警告:资源不足")
通过 logging
模块,你可以轻松实现从简单到复杂的日志需求,提升代码的可维护性和调试效率。