python3: logging.basicConfig отправляет все в stderr? - PullRequest
2 голосов
/ 05 ноября 2019

Следующий простой код:

import logging
import requests

logging.basicConfig(level=logging.DEBUG)
res = requests.get('https://www.stackoverflow.com')

При запуске как python ./test.py > foo.txt все отправляется в stderr. Почему это не собирается в стандартный вывод?

Ответы [ 2 ]

2 голосов
/ 05 ноября 2019

logging.basicConfig использует StreamHandler, когда параметр handler / filename / stream не задан, а StreamHandler по умолчанию - поток STDERR:

class StreamHandler(Handler):

    def __init__(self, stream=None):
        """
        Initialize the handler.

        If stream is not specified, sys.stderr is used.
        """
        Handler.__init__(self)
        if stream is None:
            stream = sys.stderr  # <- Here
        self.stream = stream

Для использования STDOUT, передайте sys.stdout как stream:

logging.basicConfig(level=logging.DEBUG, stream=sys.stdout)

Теперь, как и в настоящее время, вы можете захватить STDERR из оболочки как:

python ./test.py  2> foo.txt

Таким образом, перенаправивподойдет файловый дескриптор 2 (который является STDERR).

STDOUT - это файловый дескриптор 1, и когда вы выполняете перенаправление без ключа >, предполагается 1>.

Если по какой-то причине вы хотитечтобы использовать разные файлы для перенаправления двух потоков, вы можете сделать:

python ./test.py  >stdout.txt 2>stderr.txt

Если вы хотите перенаправить оба файла в один и тот же файл:

python ./test.py  >all.txt 2>&1  # POSIX

или

python ./test.py  &>all.txt  # `bash`-ism (works in other advanced shells as well)
1 голос
/ 05 ноября 2019

Вам необходимо добавить logging.StreamHandler() к вашему корневому обработчику и настроить его на использование stdout

import logging
import requests
import sys

root = logging.getLogger()
root.setLevel(logging.DEBUG)

handler = logging.StreamHandler(sys.stdout)
handler.setLevel(logging.DEBUG)
root.addHandler(handler)
res = requests.get('https://www.stackoverflow.com')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...