<p>重定向不起作用,因为您最初设置的记录器有一个直接指向stdout的指针。见下文。在</p>
<blockquote>
<p>logging_test.py</p>
</blockquote>
<pre><code>import logging
import sys
SIMPLE_LOG_FORMAT = '[%(asctime)s] {%(filename)s:%(lineno)d} %(levelname)s - %(message)s'
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
formatter = logging.Formatter(SIMPLE_LOG_FORMAT)
console_handler = logging.StreamHandler(sys.stdout)
console_handler.setFormatter(formatter)
logger.addHandler(console_handler)
logger.info("Message before redirecting stdout and stderr")
# Checking what logger is writing to
logger.info('Before Redirection. logger writing to {} '.format(logger.handlers[0].stream))
log_file = open('log_file.log', 'w')
sys.stdout = log_file
sys.stderr = log_file
# Checking what logger is writing to
logger.info('After Redirection. logger writing to {} '.format(logger.handlers[0].stream))
logger.info("Message after redirecting stdout and stderr")
log_file.close()
</code></pre>
<blockquote>
<p>Output:</p>
</blockquote>
^{pr2}$
<p>正如您在输出的第二行和第三行上看到的,logger仍然直接引用它。在</p>
<p>解决这个问题的方法之一就是这样做</p>
<pre><code>logger.handlers[0].stream = open('log_file.log', 'w')
</code></pre>
<p>请注意,如果您使用多个线程,在一个线程中这样的更改将导致其他线程的输出也开始重定向输出。在</p>