【问题标题】:multiprocessing subprocess log to separate file多处理子进程日志到单独的文件
【发布时间】:2022-08-13 21:10:27
【问题描述】:

我的主程序记录到自己的日志文件中,子进程应该有自己的日志文件。 我在多处理进程中替换了 logger 对象,但是来自子进程的日志记录数据另外被重定向到主日志文件。

我怎样才能防止这种情况?

结构如下所示:

import logging
import sys
import os
from pathlib import Path
import multiprocessing
import time

import requests


class ProcessFilter(logging.Filter):
    \"\"\"Only accept log records from a specific pid.\"\"\"

    def __init__(self, pid):
        self._pid = pid

    def filter(self, record):
        return record.process == self._pid


def create_logger(file):
    log = logging.getLogger(__name__)
    log.setLevel(logging.DEBUG)
    log.addFilter(ProcessFilter(pid=os.getpid()))
    file_handler = logging.FileHandler(file)
    stream_handler = logging.StreamHandler(sys.stdout)
    formatter = logging.Formatter(\'[%(asctime)s] %(levelname)s [%(filename)s.%(funcName)s:%(lineno)d] %(message)s\',
                                  datefmt=\'%a, %d %b %Y %H:%M:%S\')
    file_handler.setFormatter(formatter)
    stream_handler.setFormatter(formatter)
    log.addHandler(file_handler)
    log.addHandler(stream_handler)
    return log


def subprocess_init():
    global log
    sub_log_file = str(Path.home()) + \'/logfile_sub.log\'
    log = create_logger(sub_log_file)
    do_subprocess_stuff()


def do_subprocess_stuff():
    count = 0
    while True:
        create_log(\"subprocess\", count)
        time.sleep(5)
        count += 1


def main_tasks():
    num = 10
    while num > 0:
        create_log(\"main\", num)
        time.sleep(5)
        num -= 1


def create_log(text, num):
    log.debug(text + \" log %s\", num)


if __name__ == \'__main__\':
    file = str(Path.home()) + \'/logfile.log\'
    log = create_logger(file)
    sub_process = multiprocessing.Process(target=subprocess_init, args=())
    sub_process.daemon = True
    sub_process.start()
    main_tasks()
  • this 重复
  • 您能提供一个集成示例吗?

标签: python python-multiprocessing


【解决方案1】:

我只是在翻译this answer 以适应多处理。

import logging

class ProcessFilter(logging.Filter):
    """Only accept log records from a specific pid."""

    def __init__(self, pid):
        self._pid = pid

    def filter(self, record):
        return record.process == self._pid
import logging
import os

def create_logger(file):
    log = logging.getLogger('')  # why use this logger and not __name__ ?
    log.setLevel(logging.DEBUG)
    log.addFilter(ProcessFilter(pid=os.getpid()))  # logger wide filter
    file_handler = logging.FileHandler(file)
    stream_handler = logging.StreamHandler(sys.stdout)
    formatter = logging.Formatter('[%(asctime)s] %(levelname)s [%(filename)s.%(funcName)s:%(lineno)d] %(message)s',
                                  datefmt='%a, %d %b %Y %H:%M:%S')
    file_handler.setFormatter(formatter)
    stream_handler.setFormatter(formatter)
    log.addHandler(file_handler)
    log.addHandler(stream_handler)
    return log

注意。您还可以将过滤器放在特定的处理程序上

【讨论】:

  • 谢谢,通过这些更改,我的 python 程序的子进程的输出已经从主日志中消失了,除了导入内容的调试日志,它仍然在两个日志文件中。子进程日志文件中缺少来自我的 python 文件的子进程日志消息。不幸的是,它还没有按预期工作。
  • 根据上面的例子,还有什么需要调整的吗?
  • @Ximi 我不知道您在记录什么,从哪里以及如何记录,因此我只能为您提供以上信息。如果您需要为所有记录器设置一些东西,您应该配置根记录器,并且可能会配置到每个记录器命名空间。如果有许多记录器受到影响,可能值得考虑使用dictionary 配置记录器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-07
  • 2012-01-25
  • 2011-10-20
  • 2022-12-17
相关资源
最近更新 更多