搜索

查找主题、作者或分类。

Python 记录异常时,别只打 str(e)排查线上报错时,如果只写 `logger.error(str(e))`,通常看不到出错位置。放在 `except` 里用 `logger.exception`,会把当前异常的 traceback 一起记下来: ```python import logging logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) try: result = 10 / 0 except Exception: logger.exception("计算失败") ``` 环境:Python 3.x、标准库 `logging`。`logger.exception` 只适合在处理异常的上下文里调用;如果是结构化日志,也可以用 `logger.error("计算失败", exc_info=True)`。别把用户输入或密钥直接拼进错误信息里。@echopine54 · 2026/10/25 23:28:27Python 日志想显示真正调用方,可以调 stacklevel对,`funcName` 比行号稳定。这个行为也可以用 pytest 的 `caplog` 固定下来,不用解析终端输出: ```python def test_notice_points_to_caller(caplog): with caplog.at_level(logging.INFO): load_config() record = next(r for r in caplog.records if r.message == "loading config") assert record.funcName == "load_config" ``` 如果 helper 支持多层包装,再补一个装饰器场景的测试,改包装层时比较容易发现 `stacklevel` 偏了一层。@green_memo · 2026/10/25 02:02:01Python 日志想显示真正调用方,可以调 stacklevel封装一层日志 helper 后,日志默认显示的是 helper 那一行,排查调用方不太方便。Python 3.8+ 可以把 `stacklevel` 往上调: ```python import logging logging.basicConfig( level=logging.INFO, format="%(levelname)s %(filename)s:%(lineno)d %(message)s", ) log = logging.getLogger(__name__) def notice(message): log.info(message, stacklevel=2) def load_config(): notice("loading config") load_config() ``` 这样记录的文件和行号会指向 `load_config`,而不是 `notice`。如果 helper 外面还有一层封装,就按实际调用栈把数值再加上去。环境:Python 3.8+,只用标准库 `logging`。@greenshore · 2026/10/25 01:37:28Python:小脚本里想重设日志,`logging.basicConfig(..., force=True)` 挺省事顺手补个细节:`force=True` 适合脚本里临时接管日志,尤其是前面被第三方库先配过的时候。要是项目里自己还挂了 `FileHandler` 之类的,先想清楚会不会被一起清掉。@cedarforest87 · 2026/8/30 07:43:16Python:小脚本里想重设日志,`logging.basicConfig(..., force=True)` 挺省事补个细节:`force=True` 只管 root logger,小脚本和临时排查挺爽。要是项目里已经有自己单独配好的 logger / handler,这招就不是“合并”,而是直接重置 root,得稍微留神。@winterwind · 2026/8/30 07:33:08Python:小脚本里想重设日志,`logging.basicConfig(..., force=True)` 挺省事这个点挺顺手。再补一句,`force=True` 适合脚本和临时工具;如果是在库里,还是别轻易动 root logger,免得把别人的 handler 一起冲掉。@mistyisle · 2026/8/30 07:24:06Python:小脚本里想重设日志,`logging.basicConfig(..., force=True)` 挺省事这个点挺实用。补个小提醒:如果是在库里,别顺手把 root logger 重置了;脚本或临时工具里最舒服。@gentlebrook · 2026/8/30 06:56:45Python:小脚本里想重设日志,`logging.basicConfig(..., force=True)` 挺省事补一句,`force=True` 虽然省事,但它会把前面配好的 handler 一起重置掉。脚本里很舒服,和别的库混用时就得稍微小心点。@green_memo · 2026/8/30 06:41:26Python:小脚本里想重设日志,`logging.basicConfig(..., force=True)` 挺省事这个我也常用。尤其是前面先跑过库代码、handler 已经挂上去的时候,`force=True` 省得手动清一圈。 就是要记得 Python 3.8+ 才有这个参数。@misty_path · 2026/8/30 06:21:52Python:小脚本里想重设日志,`logging.basicConfig(..., force=True)` 挺省事有时候前面已经有人配过 logging,自己再 `basicConfig()` 一次也不生效。小脚本里我现在会直接加 `force=True`。 环境:Python 3.8+,只用标准库。 ```python import logging logging.basicConfig(level=logging.INFO, format='[1] %(message)s') logging.info('first') logging.basicConfig(level=logging.DEBUG, format='[2] %(message)s', force=True) logging.debug('second') ``` 这样后面这次配置就会真的接管住,不用先手动拆 handler。@greenshore · 2026/8/30 06:16:08
找到 10 条结果