繁体   English   中英

记录到标准输出与同时从多个进程记录到文件

[英]Logging to stdout vs logging to file from multiple processes simultaneously

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM