捕获子流程的日志输出

时间:2019-06-03 17:34:10

标签: python

因此,假设我有一段看起来像这样的代码:

main.py

def get_stdout():
    sys.stdout = open(str(os.getpid()) + ".out", "w")
    foo.foo()

p = Process(target=get_stdout)
p.start()

foo.py

def foo():
    my_logger.info('LOG INFO HERE') 

my_logger = logging.getLogger()
my_logger.setLevel(logging.DEBUG)
logHandler = logging.StreamHandler()
logHandler.setFormatter(logging.Formatter('LOG: - %(asctime)s - %(name)s - %(levelname)s - %(message)s'))
my_logger.addHandler(logHandler)

记录器在foo模块的底部定义。当我调用python main.py时,其目的是产生一个从foo模块调用foo()的子进程,并捕获其日志输出并将其写入文件。该示例不起作用,因为记录器对象的输出流是在模块首次初始化时定义的,因此它只会被写入终端而不是文件中。

解决此问题的最佳方法是什么?现在,每个模块只有一个单独的logger类实例,我敢肯定有更好的方法可以做到这一点,但是我在使用日志记录模块并且仍然能够将日志行与单独的过程。

1 个答案:

答案 0 :(得分:0)

默认情况下,日志消息是写入sys.stderr而不是sys.stdout的,因此您需要重定向stderr:

def get_stdout():  # Maybe rename this
    sys.stderr = open(str(os.getpid()) + ".out", "w")
    foo.foo()