Я использую модуль журналирования Python для записи некоторых строк отладки в файл, который работает довольно хорошо. Кроме того, я бы хотел использовать этот модуль для вывода строк в стандартный вывод. Как мне это сделать? Для записи моих строк в файл я использую следующий код:
import logging
import logging.handlers
logger = logging.getLogger("")
logger.setLevel(logging.DEBUG)
handler = logging.handlers.RotatingFileHandler(
LOGFILE, maxBytes=(1048576*5), backupCount=7
)
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
handler.setFormatter(formatter)
logger.addHandler(handler)
а затем вызвать функцию регистратора, как
logger.debug("I am written to the file")
Спасибо за помощь здесь!
StreamHandler
сsys.stdout
, и тогда он будет регистрировать это вместо stderr.import sys
сначала. И фактически инициализируем обработчик, т.е.consoleHandler = logging.StreamHandler(sys.stdout)
rootLogger.setLevel(logging.DEBUG)
если вы пытаетесь увидеть информацию или отладочные сообщенияlogging.basicConfig()
может принять аргумент ключевого словаhandlers
начиная с Python 3.3, что значительно упрощает настройку ведения логов, особенно при настройке нескольких обработчиков с одним и тем же форматером:Таким образом, вся настройка может быть выполнена с помощью одного вызова:
(Или с
import sys
+StreamHandler(sys.stdout)
для требований исходного вопроса - по умолчанию для StreamHandler является запись в stderr. Посмотрите на атрибуты LogRecord если вы хотите настроить формат журнала и добавить такие вещи, как имя файла / строка, информация о потоке и т. Д.)Вышеуказанную настройку необходимо выполнить только один раз в начале сценария. Вы можете использовать ведение журнала из всех других мест в кодовой базе позже, как это:
Примечание. Если это не работает, возможно, кто-то другой уже инициализировал систему ведения журнала по-другому. Комментарии предлагают сделать
logging.root.handlers = []
перед звонкомbasicConfig()
.источник
FileHandler
:logging.FileHandler(filename, mode='a', encoding=None, delay=False)
. Это означает, что когда вы просто хотите войти в ту же папку, вы можете просто использоватьFileHandler("mylog.log")
. Если вы хотите перезаписывать журнал каждый раз, установите «w» в качестве второго аргумента.logging.root.handlers = []
перед вызовомbasicConfig
, посмотрите на функцию - это раздражает.Добавление StreamHandler без аргументов идет в stderr вместо stdout. Если какой-то другой процесс зависит от дампа stdout (т.е. при написании плагина NRPE), убедитесь, что вы явно указали stdout, иначе вы можете столкнуться с неожиданными проблемами.
Вот быстрый пример повторного использования предполагаемых значений и LOGFILE из вопроса:
источник
Либо беги
basicConfig
с вstream=sys.stdout
качестве аргумента до создания каких - либо других обработчиков или регистрации сообщений, или вручную добавить ,StreamHandler
что толкает сообщения на стандартный вывод в корневой регистратор (или любой другой регистратор вы хотите, по этому вопросу).источник
После многократного использования кода Waterboy в нескольких пакетах Python я, наконец, превратил его в крошечный автономный пакет Python, который вы можете найти здесь:
https://github.com/acschaefer/duallog
Код хорошо документирован и прост в использовании. Просто скачайте
.py
файл и включите его в свой проект или установите весь пакет черезpip install duallog
.источник
Вход на
stdout
иrotating file
с различными уровнями и форматами:источник
Вот полное, хорошо обернутое решение, основанное на ответе Уотербоя и других источниках. Он поддерживает ведение журнала как в консоли, так и в файле журнала, допускает различные настройки уровня журнала, обеспечивает цветной вывод и легко настраивается (также доступен как Gist ):
источник
Для 2.7 попробуйте следующее:
источник