因此,假设我有一段看起来像这样的代码:
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类实例,我敢肯定有更好的方法可以做到这一点,但是我在使用日志记录模块并且仍然能够将日志行与单独的过程。
答案 0 :(得分:0)
默认情况下,日志消息是写入sys.stderr
而不是sys.stdout
的,因此您需要重定向stderr:
def get_stdout(): # Maybe rename this
sys.stderr = open(str(os.getpid()) + ".out", "w")
foo.foo()