文章目录
- import logging # 最简单的使用方式 logging.basicConfig(level=logging.WARN) # 设置日志级别 logging.debug(‘这是一条debug信息’) # 不会显示(默认级别更高) logging.info(‘这是一条info信息’) # 不会显示 logging.warning(‘这是一条warning信息’) # 会显示√ logging.error(‘这是一条error信息’) # 会显示√ logging.critical(‘这是一条critical信息’)# 会显示√
- DEBUG – 调试细节,开发时使用 INFO – 普通信息,确认事情按预期运行 WARNING – 警告,发生了意外但不影响运行 ERROR – 错误,部分功能受影响 CRITICAL – 严重错误,程序可能崩溃 重要规则: 只会显示设置级别及以上的日志!
- # 详细配置示例 logging.basicConfig( level=logging.DEBUG, format=’%(asctime)s – %(name)s – %(levelname)s – %(message)s’, datefmt=’%Y-%m-%d %H:%M:%S’, filename=’app.log’, # 输出到文件 filemode=’a’, # 追加模式 encoding=’utf-8′ # 指定UTF-8编码,解决中文乱码问题 ) # 使用 logging.info(“程序启动”) logging.warning(“磁盘空间不足90%”) logging.error(“数据库连接失败”)
- %(name)s Logger的名字 %(levelname)s 日志级别 %(message)s 日志内容 %(asctime)s 时间,可指定格式 %(filename)s 文件名 %(funcName)s 函数名 %(lineno)d 行号
- # 在每个模块中这样做 import logging # 创建logger实例,通常以模块名命名 logger = logging.getLogger(__name__) # 这是最佳实践! def process_data(data): logger.debug(f”开始处理数据,长度: {len(data)}”) try: # 你的业务逻辑 result = data * 2 logger.info(f”数据处理成功,结果: {result}”) return result except Exception as e: logger.error(f”数据处理失败: {str(e)}”, exc_info=True) return None
- # config_logging.py – 日志配置文件 import logging import logging.handlers import os def setup_logging(): “””配置项目日志系统””” # 创建formatter(定义日志格式) formatter = logging.Formatter( ‘%(asctime)s – %(name)s – %(levelname)s – %(message)s’ ) # 创建logger logger = logging.getLogger() # 根logger logger.setLevel(logging.DEBUG) # 设置最低级别 # 控制台处理器 console_handler = logging.StreamHandler() console_handler.setLevel(logging.INFO) # 控制台只显示INFO及以上 console_handler.setFormatter(formatter) # 文件处理器 file_handler = logging.FileHandler(‘app.log’) file_handler.setLevel(logging.DEBUG) # 文件记录所有DEBUG及以上 file_handler.setFormatter(formatter) # 按时间切分的文件处理器(推荐生产环境使用) time_handler = logging.handlers.TimedRotatingFileHandler( ‘app.log’, when=’midnight’, # 每天午夜切分 interval=1, backupCount=7 # 保留7天 ) time_handler.setFormatter(formatter) # 添加处理器 logger.addHandler(console_handler) logger.addHandler(file_handler) # logger.addHandler(time_handler) # 使用这个替换上面的file_handler
- import logging from logging.handlers import RotatingFileHandler # 创建logger logger = logging.getLogger(‘webapp’) logger.setLevel(logging.INFO) # 按大小滚动日志文件(最大10MB,保留5个备份) handler = RotatingFileHandler( ‘webapp.log’, maxBytes=10*1024*1024, # 10MB backupCount=5 ) formatter = logging.Formatter( ‘%(asctime)s – %(clientip)s – %(user)s – %(message)s’ ) handler.setFormatter(formatter) logger.addHandler(handler) # 使用(假设在请求处理中) def handle_request(request, user): # 添加额外信息 extra = {‘clientip’: request.client_ip, ‘user’: user} logger.info(‘用户登录成功’, extra=extra)
- import logging # 配置不同的处理器 logger = logging.getLogger(‘myapp’) # 错误日志单独保存 error_handler = logging.FileHandler(‘errors.log’) error_handler.setLevel(logging.ERROR) # 所有日志保存 all_handler = logging.FileHandler(‘all.log’) all_handler.setLevel(logging.DEBUG) # 设置格式 formatter = logging.Formatter(‘%(asctime)s – %(levelname)s – %(message)s’) error_handler.setFormatter(formatter) all_handler.setFormatter(formatter) logger.addHandler(error_handler) logger.addHandler(all_handler)
目录
- 一、为什么要使用Logging?
- 二、快速开始:5分钟上手
- 基础示例
- 理解日志级别(从低到高)
- 三、核心配置:让日志更实用
- 1. 配置日志格式和输出
- 2. 常用格式化字段
- 四、进阶技巧:模块化使用
- 1. 创建模块专用的Logger
- 2. 项目级别的配置
- 五、实用场景示例
- 场景1:Web应用日志
- 场景2:不同级别日志分开存储
- 六、最佳实践和小贴士
- ✅应该这样做:
- 避免这样做:
- 总结
很多初学者喜欢用print()调试,但在实际项目中会遇到问题:
- 项目跑起来后,不能随意中断程序查看输出
- 需要区分不同重要程度的信息(错误、警告、普通信息)
- 需要将日志保存到文件方便后续分析
- 在生产环境中,需要动态调整日志详细程度
这就是Logging库存在的意义!
import logging
# 最简单的使用方式
logging.basicConfig(level=logging.WARN) # 设置日志级别
logging.debug('这是一条debug信息') # 不会显示(默认级别更高)
logging.info('这是一条info信息') # 不会显示
logging.warning('这是一条warning信息') # 会显示√
logging.error('这是一条error信息') # 会显示√
logging.critical('这是一条critical信息')# 会显示√
- DEBUG – 调试细节,开发时使用
- INFO – 普通信息,确认事情按预期运行
- WARNING – 警告,发生了意外但不影响运行
- ERROR – 错误,部分功能受影响
- CRITICAL – 严重错误,程序可能崩溃
重要规则: 只会显示设置级别及以上的日志!
# 详细配置示例
logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S',
filename='app.log', # 输出到文件
filemode='a', # 追加模式
encoding='utf-8' # 指定UTF-8编码,解决中文乱码问题
)
# 使用
logging.info("程序启动")
logging.warning("磁盘空间不足90%")
logging.error("数据库连接失败")
%(name)s Logger的名字
%(levelname)s 日志级别
%(message)s 日志内容
%(asctime)s 时间,可指定格式
%(filename)s 文件名
%(funcName)s 函数名
%(lineno)d 行号
在实际项目中,我们通常不直接使用logging模块,而是创建自己的Logger:
# 在每个模块中这样做
import logging
# 创建logger实例,通常以模块名命名
logger = logging.getLogger(__name__) # 这是最佳实践!
def process_data(data):
logger.debug(f"开始处理数据,长度: {len(data)}")
try:
# 你的业务逻辑
result = data * 2
logger.info(f"数据处理成功,结果: {result}")
return result
except Exception as e:
logger.error(f"数据处理失败: {str(e)}", exc_info=True)
return None
# config_logging.py - 日志配置文件
import logging
import logging.handlers
import os
def setup_logging():
"""配置项目日志系统"""
# 创建formatter(定义日志格式)
formatter = logging.Formatter(
'%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
# 创建logger
logger = logging.getLogger() # 根logger
logger.setLevel(logging.DEBUG) # 设置最低级别
# 控制台处理器
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO) # 控制台只显示INFO及以上
console_handler.setFormatter(formatter)
# 文件处理器
file_handler = logging.FileHandler('app.log')
file_handler.setLevel(logging.DEBUG) # 文件记录所有DEBUG及以上
file_handler.setFormatter(formatter)
# 按时间切分的文件处理器(推荐生产环境使用)
time_handler = logging.handlers.TimedRotatingFileHandler(
'app.log',
when='midnight', # 每天午夜切分
interval=1,
backupCount=7 # 保留7天
)
time_handler.setFormatter(formatter)
# 添加处理器
logger.addHandler(console_handler)
logger.addHandler(file_handler)
# logger.addHandler(time_handler) # 使用这个替换上面的file_handler
import logging
from logging.handlers import RotatingFileHandler
# 创建logger
logger = logging.getLogger('webapp')
logger.setLevel(logging.INFO)
# 按大小滚动日志文件(最大10MB,保留5个备份)
handler = RotatingFileHandler(
'webapp.log',
maxBytes=10*1024*1024, # 10MB
backupCount=5
)
formatter = logging.Formatter(
'%(asctime)s - %(clientip)s - %(user)s - %(message)s'
)
handler.setFormatter(formatter)
logger.addHandler(handler)
# 使用(假设在请求处理中)
def handle_request(request, user):
# 添加额外信息
extra = {'clientip': request.client_ip, 'user': user}
logger.info('用户登录成功', extra=extra)
import logging
# 配置不同的处理器
logger = logging.getLogger('myapp')
# 错误日志单独保存
error_handler = logging.FileHandler('errors.log')
error_handler.setLevel(logging.ERROR)
# 所有日志保存
all_handler = logging.FileHandler('all.log')
all_handler.setLevel(logging.DEBUG)
# 设置格式
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
error_handler.setFormatter(formatter)
all_handler.setFormatter(formatter)
logger.addHandler(error_handler)
logger.addHandler(all_handler)
-
尽早配置日志:在程序入口处配置,不要多处配置
-
使用getLogger(__name__) :自动获取模块名作为logger名
-
合理使用级别:
- DEBUG:调试信息
- INFO:关键流程节点
- WARNING:可预料的问题
- ERROR:需要关注的错误
-
包含上下文信息:logger.error(f"用户{user_id}操作失败")
尽早配置日志:在程序入口处配置,不要多处配置
使用getLogger(__name__) :自动获取模块名作为logger名
合理使用级别:
- DEBUG:调试信息
- INFO:关键流程节点
- WARNING:可预料的问题
- ERROR:需要关注的错误
包含上下文信息:logger.error(f"用户{user_id}操作失败")
- 不要在所有地方都用根logger
- 不要在日志中记录敏感信息(密码、密钥)
- 不要过度记录,避免日志过大
Logging库看似复杂,但核心只有几个概念:
- Logger – 记录器(谁在记录)
- Handler – 处理器(记录到哪里)
- Formatter – 格式化器(怎么记录)
- Level – 级别(记录什么)
到此这篇关于Python Logging库完全指南的文章就介绍到这了,更多相关Python Logging库内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!
您可能感兴趣的文章:
- 关于Python使用logging库进行有效日志管理的方法详解
- 关于如何使用python的logging库
- python中logging库的使用总结