Python 的 logging 不是实时的?

2021-06-01 19:28:04 +08:00
 azev

头次用这个 发现日志文件里记录的时间点都那么接近 都是差不多程序运行结束时的时刻
这是怎么回事?之前用 js,java 啥的不是这样啊

3092 次点击
所在节点    Python
18 条回复
nowheremanx
2021-06-01 19:36:12 +08:00
flush 一下?
chenqh
2021-06-01 20:14:56 +08:00
不应该呀
ClericPy
2021-06-01 22:03:56 +08:00
无代码猜不到
jdhao
2021-06-01 22:05:05 +08:00
上代码啊,没代码你说个蛋蛋
leavic
2021-06-01 23:34:15 +08:00
确实不是实时的,尤其是有 Exception 的时候,logging 还没完成程序就结束了都可能。
lzjamao
2021-06-01 23:50:23 +08:00
这要看 logging 的内部实现了。
IO 分为有缓冲和无缓冲的。
有缓冲,不是立即写到磁盘的。
stderr 是不做缓存立即写的,你可以换个 error 输出接口试试
或者找下是否有接口,设置缓冲区模式 setvbuf
luckylo
2021-06-02 07:16:49 +08:00
确实是。我也碰到过。还把别人怼了。结果自己搞错了。尴尬。
myCupOfTea
2021-06-02 09:02:01 +08:00
正常啊,就算是 print 他都是有缓冲的啊
azev
2021-06-02 10:14:11 +08:00
@nowheremanx 每句都要跟一个 flush 吗?
azev
2021-06-02 10:14:28 +08:00
@myCupOfTea 貌似其他语言没有这个问题
azev
2021-06-02 10:15:17 +08:00
@lzjamao 开始我是输出到控制台的 发现记录的时间点不对 后来输出到文件 还是一样
azev
2021-06-02 10:16:38 +08:00
@luckylo 确实 这个问题太奇葩了
ruanimal
2021-06-02 10:30:28 +08:00
@azev 你代码有问题,logging 到控制台应该是无缓冲的
myCupOfTea
2021-06-02 10:43:19 +08:00
发现日志文件里记录的时间点都那么接近
你这个应该是自己的问题了
no1xsyzy
2021-06-02 10:43:54 +08:00
可是 logging.StreamHandler.emit 在 19 年前刚引入 logging 包就有 flush
https://github.com/python/cpython/blame/bb3e0c240bc60fe08d332ff5955d54197f79751c/Lib/logging/__init__.py#L1102
不过 python>=3,<3.7 的话始终有单行 buffer 。

而且记录时间不是在打印后,而是在打印前,怎么可能因为有 buffer 导致记录的时间点改变?
flyingghost
2021-06-02 11:44:40 +08:00
啊不,有 buffer 正常,buffer 还会影响时间戳就不正常了。
你确定你的姿势没问题吗?
l4ever
2021-06-03 12:21:02 +08:00
loguru 解君愁
lusi1990
2021-06-08 16:12:09 +08:00
pycharm 里面有个环境变量 PYTHONUNBUFFERED=1
不知道你有没有?
![Is PYTHONUNBUFFERED=TRUE a good idea]( https://github.com/aws/amazon-sagemaker-examples/issues/319)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/780684

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX