0

我是python初学者。我的 python 脚本使用基本的 python 日志记录模块将输出记录到一个文件(比如 example.log)。但是,我的 python 脚本还进行了一些我无法控制的第 3 方 API 调用(例如,parse_the_file)。我想将 API 生成的输出(通常在控制台上)捕获到我的 example.log 中。以下示例代码部分工作,但问题是一旦我开始将 API 的输出记录到我的日志文件中,内容就会被覆盖。

#!/usr/bin/env python

import logging
import sys
import os
from common_lib import *     # import additional modules

logging.basicConfig(filename='example.log', filemode='w', level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')

logging.debug('This is a log message.') # message goes to log file.

sys.stdout = open('example.log','a')
metadata_func=parse_the_file('/opt/metadata.txt') # output goes to log file but OVERWRITES the content
sys.stdout = sys.__stdout__
logging.debug('This is a second log message.') # message goes to log file.

我知道在这个网站上有过类似问题的帖子,但我没有在这种情况下有效的解决方法/解决方案。

4

1 回答 1

1

尝试:

log_file = open('example.log', 'a')
logging.basicConfig(stream=log_file, level=logging.DEBUG)
logging.debug("Test")
sys.stdout = log_file
sys.stderr = log_file
stdout_fd = os.dup(1)
stderr_fd = os.dup(2)
os.dup2(log_file.fileno(), 1)
os.dup2(log_file.fileno(), 2)

os.system("echo foo")

os.dup2(stdout_fd, 1)
os.dup2(stderr_fd, 2)
sys.stdout = sys.__stdout__
sys.stderr = sys.__stderr__

但是,这不会相应地对其进行格式化。如果你想要,你可以尝试类似http://plumberjack.blogspot.com/2009/09/how-to-treat-logger-like-output-stream.html

于 2012-08-24T17:33:39.077 回答