首页 > 解决方案 > 同时从多个进程记录到标准输出与记录到文件

问题描述

我有一个进程(在 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()

标签: pythonmacosoperating-systemstdout

解决方案


推荐阅读