sentry集成需配对init()和capture_exception():init必须在应用启动最早期执行并传对dsn,web框架需加中间件或全局异常处理器调用capture_exception(e),异步任务要单独初始化,scope需手动绑定request_id和user信息,采样率应设为sample_rate=0.1、traces_sample_rate=0.01以控成本。

Python服务报错没收到通知?Sentry集成要配对init()和capture_exception()
生产环境出错没人知道,通常不是没日志,而是日志散在文件里、没聚合、没告警。Sentry能实时捕获异常并触发通知,但光装包不配置等于没装。关键在两处:初始化时传对dsn,以及确保异常真正被capture_exception()捕获(而不是只靠未处理异常自动上报)。
常见错误现象:Exception抛出了,但Sentry后台没记录;或者只看到SystemExit之类基础异常,业务逻辑里的ValueError全丢了。
- 用
sentry_sdk.init(dsn="https://xxx@o123.ingest.sentry.io/456")必须在应用启动最早期执行(比如main.py第一行),晚于logging.basicConfig()或uvicorn.run()都可能漏报 - Web框架(如FastAPI/Flask)需显式加中间件或异常处理器,否则
try/except吞掉的异常不会进Sentry——推荐在全局异常处理器里调用sentry_sdk.capture_exception(e) - 异步任务(Celery/Apscheduler)要单独初始化
sentry_sdk,且before_send钩子得返回event而非None,否则过滤逻辑会静默丢事件
ELK日志管道卡在Logstash?Python端JsonFormatter和logstash字段映射要对齐
ELK不是“装完就能搜”,Python日志进不了Elasticsearch,八成是Logstash解析失败或字段类型冲突。核心问题不在Logstash配置,而在于Python日志输出是否为合法JSON、关键字段是否命名一致、时间戳是否为ISO格式。
使用场景:需要按service_name、trace_id、level多维检索,或对接APM做链路追踪。
- 别用
logging.Formatter,改用python-json-logger.JsonFormatter,并指定fmt='%(asctime)s %(name)s %(levelname)s %(message)s %(funcName)s %(lineno)d'——字段名必须和Logstash的filter { json { source => "message" } }能匹配 -
asctime默认是字符串,Logstash解析成@timestamp时容易失败;应改为%(created)f(Unix时间戳秒级浮点数),再在Logstash里用date { match => ["created", "UNIX"] } - 如果用了
structlog,确保structlog.stdlib.ProcessorFormatter输出的是字典而非字符串,否则Logstash的json插件会直接丢弃整条日志
为什么Sentry看不到请求上下文?scope绑定request_id和user信息必须手动做
Sentry默认只上报异常堆栈,没有HTTP方法、URL、用户ID、请求ID这些上下文,排查时还得切回ELK查关联日志。这不是功能缺失,而是设计上要求你显式注入——因为框架差异大,没法自动猜。
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
性能影响很小,但漏掉就失去80%诊断价值。
- 在Web中间件里调用
sentry_sdk.set_tag("request_id", request.headers.get("X-Request-ID")),比用set_context更轻量,也方便Kibana里跨系统关联 - 用户信息不能直接传
user.id,得用sentry_sdk.set_user({"id": user_id, "email": email}),否则Sentry后台不识别为“用户”实体 - 避免在
before_send里做耗时操作(比如查DB补全用户信息),它运行在异常捕获路径上,拖慢会阻塞主线程
日志量大时Sentry费用爆炸?用sample_rate和traces_sample_rate控制上报粒度
免费版Sentry每月5000次事件限额,一个高频接口每秒报错1次,不到一小时就超限。不是要砍日志,而是区分“错误事件”和“性能追踪”——前者必须全量,后者可采样。
容易踩的坑:把traces_sample_rate=1.0留在生产环境,导致每个HTTP请求都生成一个Transaction,费用指数级上涨。
-
sentry_sdk.init(..., sample_rate=0.1)控制错误事件上报比例(0.1 = 10%),适合错误率低但总量大的服务 -
traces_sample_rate=0.01(即1%)足够定位慢接口,再配合traces_sampler函数,对/health这类路径返回0.0彻底不采样 - ELK侧同步做日志分级:
DEBUG级日志写本地文件,ERROR级才发到Logstash,避免磁盘爆满或Logstash背压
最常被忽略的是:Sentry的release参数没填,导致所有版本的错误混在一起,根本分不清是新上线引发的还是旧Bug复现。每次部署必须带release="myapp@1.2.3",哪怕只是Git commit hash。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










