Ubuntu下Python日志管理优化方案
logging模块规范基础配置Python的logging模块是日志管理的核心工具,通过合理配置可实现灵活的日志分级、输出控制及格式化。基础配置需包含以下要素:
DEBUG记录详细信息,生产环境用INFO或WARNING减少冗余);'%(asctime)s - %(name)s - %(levelname)s - %(message)s'),提升可读性。示例代码:
import logging
# 创建模块级Logger
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG) # 设置最低级别,后续Handler可过滤
# 控制台Handler(仅输出INFO及以上)
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)
console_formatter = logging.Formatter('%(levelname)s - %(message)s')
console_handler.setFormatter(console_formatter)
# 文件Handler(输出所有级别,便于调试)
file_handler = logging.FileHandler('app.log')
file_handler.setLevel(logging.DEBUG)
file_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_handler.setFormatter(file_formatter)
# 添加Handler到Logger
logger.addHandler(console_handler)
logger.addHandler(file_handler)
# 记录日志(带异常堆栈)
try:
1 / 0
except Exception as e:
logger.error("除零错误发生", exc_info=True) # exc_info=True记录完整回溯
当日志文件持续增长时,需通过日志轮转限制文件大小并保留历史记录。Ubuntu下可使用logrotate工具(系统自带)或RotatingFileHandler(Python内置):
logrotate配置(推荐):
sudo apt-get install logrotate;/etc/logrotate.d/python_app,内容如下:/var/log/python_app/*.log {
daily # 每天轮转
rotate 7 # 保留7份
compress # 压缩旧日志(节省空间)
missingok # 文件不存在时不报错
notifempty # 文件为空时不轮转
copytruncate # 复制原文件后清空(避免进程重启)
}
sudo logrotate -f /etc/logrotate.d/python_app。Python内置RotatingFileHandler(无需额外工具):
from logging.handlers import RotatingFileHandler
rotating_handler = RotatingFileHandler(
'app_rotating.log',
maxBytes=10*1024*1024, # 单个文件最大10MB
backupCount=5 # 保留5份备份
)
rotating_handler.setFormatter(formatter)
logger.addHandler(rotating_handler)
结构化日志(如JSON格式)便于ELK(Elasticsearch+Logstash+Kibana)进行日志收集、分析和可视化。使用json_log_formatter库可将日志转为JSON格式:
pip install json_log_formatter;import json_log_formatter
json_formatter = json_log_formatter.JSONFormatter()
json_handler = logging.FileHandler('app_structured.log')
json_handler.setFormatter(json_formatter)
logger.addHandler(json_handler)
# 日志会自动转为JSON格式(包含时间、级别、消息等字段)
logger.info("用户登录成功", extra={'user': 'Alice', 'ip': '192.168.1.1'})
输出示例:{"timestamp": "2025-10-06T14:30:00.123Z", "level": "INFO", "message": "用户登录成功", "user": "Alice", "ip": "192.168.1.1"}
import sentry_sdk
from sentry_sdk.integrations.logging import LoggingIntegration
# 初始化Sentry(替换为你的DSN)
sentry_sdk.init(
dsn="https://your-dsn@sentry.io/12345",
integrations=[LoggingIntegration()], # 关联logging模块
level=logging.ERROR # 仅上报ERROR及以上级别
)
try:
1 / 0
except Exception as e:
logger.error("除零错误", exc_info=True) # Sentry会自动捕获并上报
通过环境变量或配置文件动态调整日志设置,避免硬编码:
import os
import logging.config
# 从环境变量读取日志级别
log_level = os.getenv('LOG_LEVEL', 'INFO').upper()
logging.basicConfig(
level=log_level,
format='%(asctime)s - %(levelname)s - %(message)s'
)
logging_config.yaml:version: 1
disable_existing_loggers: False
formatters:
simple:
format: '%(asctime)s - %(levelname)s - %(message)s'
handlers:
console:
class: logging.StreamHandler
level: INFO
formatter: simple
stream: ext://sys.stdout
file:
class: logging.FileHandler
level: DEBUG
formatter: simple
filename: app.log
loggers:
__main__:
level: DEBUG
handlers: [console, file]
propagate: no
import logging.config
import yaml
with open('logging_config.yaml', 'r') as f:
config = yaml.safe_load(f.read())
logging.config.dictConfig(config)
logging模块默认是线程安全的,无需额外配置;RotatingFileHandler或TimedRotatingFileHandler时,需开启locking=True(避免多个进程同时写入导致文件损坏):from logging.handlers import RotatingFileHandler
rotating_handler = RotatingFileHandler(
'app_multiprocess.log',
maxBytes=10*1024*1024,
backupCount=5,
locking=True # 启用文件锁
)
DEBUG级别日志的输出(如循环内的DEBUG日志),降低I/O压力;concurrent-log-handler库实现异步写入(提升性能):from concurrent_log_handler import ConcurrentRotatingFileHandler
async_handler = ConcurrentRotatingFileHandler(
'app_async.log',
maxBytes=10*1024*1024,
backupCount=5
)
logger.addHandler(async_handler)
通过以上优化措施,可实现Ubuntu下Python日志的高效管理,兼顾开发调试需求与生产环境稳定性。