logging模块(基础配置)Python的logging模块是官方提供的灵活日志解决方案,支持多级别日志记录(DEBUG/INFO/WARNING/ERROR/CRITICAL)、多处理器输出(文件/控制台)及格式化定制。基础配置示例如下:
import logging
# 创建logger实例(推荐使用模块名,如__name__)
logger = logging.getLogger('my_app')
logger.setLevel(logging.DEBUG) # 设置最低日志级别(所有级别≥此值的日志会被处理)
# 创建文件处理器(写入文件)
file_handler = logging.FileHandler('/var/log/my_app.log')
file_handler.setLevel(logging.DEBUG)
# 创建控制台处理器(输出到终端)
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO) # 控制台仅输出INFO及以上级别
# 定义日志格式(包含时间、logger名、级别、消息)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)
console_handler.setFormatter(formatter)
# 将处理器添加到logger
logger.addHandler(file_handler)
logger.addHandler(console_handler)
# 记录日志
logger.debug('调试信息') # 仅文件中输出
logger.info('服务启动成功') # 文件和控制台均输出
logger.error('数据库连接失败') # 文件和控制台均输出
此配置实现了日志分级输出(调试信息存文件,重要信息同时输出到控制台),便于后续分析。
当日志文件过大时,可使用RotatingFileHandler(按大小轮转)或TimedRotatingFileHandler(按时间轮转)自动管理日志文件。示例如下:
from logging.handlers import RotatingFileHandler
# 按大小轮转(10MB/个,保留5个备份)
rot_handler = RotatingFileHandler(
'/var/log/my_app.log',
maxBytes=10*1024*1024, # 10MB
backupCount=5, # 保留5个旧日志
encoding='utf-8'
)
rot_handler.setLevel(logging.DEBUG)
rot_handler.setFormatter(formatter)
logger.addHandler(rot_handler)
或使用TimedRotatingFileHandler按天轮转:
from logging.handlers import TimedRotatingFileHandler
timed_handler = TimedRotatingFileHandler(
'/var/log/my_app.log',
when='midnight', # 每天午夜轮转
interval=1, # 每天一次
backupCount=7, # 保留7天日志
encoding='utf-8'
)
timed_handler.setLevel(logging.DEBUG)
timed_handler.setFormatter(formatter)
logger.addHandler(timed_handler)
轮转后,旧日志会自动重命名为my_app.log.1、my_app.log.2.gz等格式,节省磁盘空间。
若需将Python日志整合到Debian系统日志(通过rsyslog管理),可使用SysLogHandler:
from logging.handlers import SysLogHandler
syslog_handler = SysLogHandler(address='/dev/log') # Debian系统日志路径
syslog_handler.setLevel(logging.WARNING) # 仅发送WARNING及以上级别
syslog_formatter = logging.Formatter('%(name)s: %(levelname)s %(message)s')
syslog_handler.setFormatter(syslog_formatter)
logger.addHandler(syslog_handler)
此时,Python日志会同步到/var/log/syslog或/var/log/messages(取决于系统配置),便于统一管理。
loguru(简化配置)loguru是一个高级日志库,提供零配置、自动文件轮转、异常捕获等功能,适合快速开发。示例如下:
from loguru import logger
# 配置文件日志(自动轮转:100MB/个,保留7天,压缩)
logger.add("app_{time:YYYY-MM-DD}.log",
rotation="100 MB",
retention="7 days",
compression="zip")
# 记录日志(无需手动创建handler)
logger.debug('调试信息')
logger.info('服务启动成功')
logger.error('数据库连接失败')
# 异常自动捕获(日志中包含堆栈信息)
@logger.catch
def risky_operation():
return 1 / 0
risky_operation() # 错误详情会自动写入日志
loguru的配置更简洁,适合中小项目或快速迭代。
为适应测试/生产环境的不同需求(如测试环境输出DEBUG日志,生产环境输出INFO日志),可使用python-dotenv加载环境变量,动态调整日志级别:
import logging
from dotenv import load_dotenv
import os
load_dotenv() # 加载.env文件(需安装python-dotenv)
logger = logging.getLogger('my_app')
logger.setLevel(logging.DEBUG if os.getenv('DEBUG') == 'true' else logging.INFO)
# 其他配置(文件处理器、格式化器等)
file_handler = logging.FileHandler('/var/log/my_app.log')
file_handler.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))
logger.addHandler(file_handler)
.env文件示例:
DEBUG=true # 测试环境设为true,生产环境设为false
此方式避免了硬编码,便于环境切换。
在Debian系统中,可使用以下工具查看和管理日志:
tail:实时查看日志最后几行(如tail -f /var/log/my_app.log)。grep:过滤特定关键词(如grep 'ERROR' /var/log/my_app.log)。less:分页查看日志(如less /var/log/my_app.log)。logrotate:自动化日志轮转(需提前配置/etc/logrotate.d/my_app)。journalctl:查看系统日志(若日志发送到syslog,可通过journalctl -u my_service查看)。以上方法覆盖了Debian系统中Python日志管理的常见需求,可根据项目规模(小型/大型)、团队习惯(基础/高级)选择合适的方案。