在Docker中进行多处理日志记录

时间:2020-07-23 10:17:49

标签: python docker multiprocessing amazon-cloudwatch

我正在使用Amazon CloudWatch进行日志记录,并使用Python中的内置日志记录并添加了CloudWatch处理程序。我的问题是,当尝试为进程设置日志记录时,未在docker环境中添加处理程序,但在本地运行正常。

示例代码:

main.py

import os
from multiprocessing import Process
from logger import logger
from worker import worker

def app():
    logger.info({'message': 'Main process started',
                'pid': os.getpid()})
    p1 = Process(target=worker)
    p1.start()
    p1.join()
    logger.info({'message': 'In main process',
                 'pid': os.getpid()})

if __name__ == '__main__':
    app()

worker.py

import os

def worker():
    from logger import logger
    logger.info({'message': 'In worker process',
                 'pid': os.getpid()})

logger.py

import os
import logging
from watchtower import CloudWatchLogHandler

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger('foo-logger')

logger.addHandler(CloudWatchLogHandler())
logger.info({'message': 'CloudWatch handler added',
             'pid': os.getpid()})

我的预期输出(X是主进程的PID,Y是工作进程的pid)。这是我在本地运行代码时的输出。

INFO:foo-logger:{"message": "CloudWatch handler added", "pid": X}
INFO:foo-logger:{"message": "Main process started", "pid": X}
INFO:foo-logger:{"message": "CloudWatch handler added", "pid": Y}
INFO:foo-logger:{"message": "In worker process", "pid": Y}
INFO:foo-logger:{"message": "In main process", "pid": X}

实际输出。在Docker中运行时的输出。

INFO:foo-logger:{"message": "CloudWatch handler added", "pid": X}
INFO:foo-logger:{"message": "Main process started", "pid": X}
INFO:foo-logger:{"message": "In worker process", "pid": Y} <-- Before this line I want the handler to be added
INFO:foo-logger:{"message": "In main process", "pid": X}

请解释一下我在想什么以及如何在多处理程序中使用日志。

编辑:经过更多的研究之后,我可以通过设置set_start_method('fork')在本地复制Docker行为,因为我的Mac似乎使用了spawn-method而不是fork ...按照{{3} } fork方法应该更快。

1 个答案:

答案 0 :(得分:0)

解决方案是设置set_start_method('spawn')。以下两个链接提供了有关此问题原因的更多详细信息和进一步的解释: