繁体   English   中英

多处理子进程日志到单独的文件

[英]multiprocessing subprocess log to separate file

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

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

结构如下所示:

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()

我只是将这个答案翻译为适合多处理。

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

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

暂无
暂无

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

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