python进程静默退出主因是未捕获信号(如sigsegv)或c扩展崩溃;logging.basicconfig仅首次生效,需置于getlogger前;多进程需隔离日志handler,避免权限、磁盘或竞态问题。

日志里找不到 Traceback,但程序就是挂了
Python 进程静默退出,stdout 和 stderr 都没留下痕迹,大概率是未捕获的信号(比如 SIGSEGV)或 C 扩展崩溃。标准日志模块根本收不到这类事件。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 用
strace -f -e trace=signal,clone,execve python your_script.py观察是否收到致命信号 - 检查是否启用了
faulthandler.enable()—— 它能在SIGSEGV/SIGFPE时强制 dump Python 调用栈 - 若用了多进程,确认子进程是否调用了
logging.basicConfig();默认情况下子进程不继承父进程的日志配置,print()可能被缓冲且未刷出
logging.basicConfig() 不生效的常见原因
写了 basicConfig 却看不到日志,不是代码写错了,而是它只在首次调用 logging.getLogger() 前有效。一旦 logger 实例化过,再调 basicConfig 就完全被忽略。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 把
basicConfig放在所有import logging之后、任何getLogger()之前 —— 最好是脚本最顶部 - 如果用的是第三方库(如
requests、urllib3),它们可能已提前触发了 root logger 初始化;此时需显式获取并配置对应 logger:logging.getLogger("urllib3").setLevel(logging.DEBUG) - 注意
level参数:默认是WARNING,INFO和DEBUG日志不会输出,别只改格式不调等级
线上环境日志中看不到真实行号和函数名
本地跑得好好的,一上生产,%(funcName)s 变成 <module></module>,%(lineno)d 总是固定值。通常是日志被封装进线程/协程上下文,或者使用了不保留栈帧的异步日志方案。
newasp框架是一个基于 Classic Asp Vbscript Api 框架。全面支持64位,无需修改应用池32位启用,效率更高。 更新日志: 8月2号 - v2.2.9 修复Str.ToString对GetRows二维数组的解析问题 7月26号 - v2.2.8 修复IIS在前端自定义信息头提交下的跨域访问问题 修复路由对跨域OPTIONS发起提交导致的访问问题 修改web.confi
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 确认没误用
threading.Thread(target=...)启动裸函数 —— 这种方式会丢失原始调用栈;改用functools.partial或闭包包装 - 异步场景(如
asyncio)下,logging默认不感知协程上下文;需配合contextvars手动注入 request_id 等字段,而非依赖%(funcName)s - 检查是否启用了
sys.settrace或某些 APM 工具(如dd-trace-py),它们可能干扰帧对象提取;可临时禁用验证
用 RotatingFileHandler 后日志突然变少甚至中断
看起来配置没问题,但运行几小时后日志停止写入,或者轮转后新文件为空。根本原因常是权限、磁盘空间,或 handler 在多进程下未正确隔离。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 确保日志目录对运行用户有
w+ x权限(x是进入目录必需的);ls -ld /var/log/myapp比猜更可靠 - 轮转前先检查磁盘剩余空间:
shutil.disk_usage(log_dir).free,避免因ENOSPC导致 handler 内部静默失败 - 多进程场景下,
RotatingFileHandler不是进程安全的 —— 不要用多个进程共用同一个 handler 实例;改用QueueHandler+ 单独日志进程,或直接用TimedRotatingFileHandler(它对轮转时间点的处理更鲁棒)
日志分析真正的难点不在格式或级别,而在于“谁在什么时候、以什么身份、经过哪条路径”触发了某条日志 —— 这需要主动埋点、上下文透传和进程模型理解,不是加一行 basicConfig 就能解决的。









