python - 同时从多个进程记录到标准输出与记录到文件
问题描述
我有一个进程(在 python 中),它产生多个进程。它们都记录到标准输出和文件。
当我运行代码(在下面添加)时,stdout 的所有日志都会被打乱,正如我实际上认为的那样。
但是,日志文件看起来非常整洁干净。所以我然后尝试将标准输出重定向到一个文件,该文件也很整洁。我也尝试了不同的日志大小,但都产生了相同的结果。
所以我想我在问这里到底发生了什么。我读过一些关于流缓冲的文章,但我不确定它是否相关(虽然也许我错了:))
看起来写入文件是原子的,但它不适用于标准输出,这对我来说似乎有点奇怪。
在 MacOS 上运行 python3.7:
import multiprocessing
import logging.config
config = {
"version": 1,
"formatters": {
"default": {
"format": "%(asctime)s [%(levelname)s] %(threadName)s %(module)s(%(lineno)d): %(message)s"
}
},
"handlers": {
"console": {
"formatter": "default",
"class": "logging.StreamHandler",
"stream": "ext://sys.stdout"
},
"file": {
"formatter": "default",
"class": "logging.FileHandler",
"filename": "/tmp/test.log"
}
},
"loggers": {
"my_logger": {
"handlers": ["console", "file"],
"level": "DEBUG"
}
}
}
logging.config.dictConfig(config)
def foo(char):
my_logger = logging.getLogger('my_logger')
import os, time
msg = f'{os.getpid()}' + (char * 2400)
s=time.time()
while 1:
my_logger.info(msg)
if time.time() - s > 5:
break
ps = [multiprocessing.Process(target=foo, args=(chr(i+64),)) for i in range(10)]
for p in ps:
p.start()
解决方案
推荐阅读
- javascript - 使用javascript隐藏和取消隐藏div
- c# - 如何始终在 ASP.NET Core 应用程序中为给定类型发送特定值?
- shell - 如何在 MobaXterm 上自定义 URL 解释
- android - 具有 15 分钟计时器的 Android 通知
- android - 改造成功空指针异常
- flutter - 尝试生成签名 apk 时的 Java 断言
- python - 当我的 y_train 是 Python 中的二维向量时,我可以拟合模型吗?
- reactjs - 必须点击两次 OnPress React Native
- r - 行名称在 R 中显示为行号
- css - CSS变量有时在浏览器中全部小写,但在Variables.css文件中是驼峰大小写