Создание Python loggers выводит все сообщения в stdout в дополнение к журналу
есть ли способ сделать ведение журнала Python с помощью logging
модуль автоматически выводит вещи в stdout в файл журнала, куда они должны идти? Например, я хотел бы, чтобы все вызовы logger.warning
, logger.critical
, logger.error
, чтобы пойти в намеченные места, но в дополнение всегда копируются в stdout
. Это делается, чтобы избежать дублирования сообщений, таких как:
mylogger.critical("something failed")
print "something failed"
5 ответов
все выходные данные журнала обрабатываются обработчиками; просто добавьте logging.StreamHandler()
к корневому регистратору.
вот пример настройки обработчика потока (с помощью stdout
вместо stderr
) и добавление его в корневой регистратор:
import logging
import sys
root = logging.getLogger()
root.setLevel(logging.DEBUG)
ch = logging.StreamHandler(sys.stdout)
ch.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
ch.setFormatter(formatter)
root.addHandler(ch)
самый простой способ:
import logging
import sys
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)
возможно использование нескольких обработчиков.
import logging
import auxiliary_module
# create logger with 'spam_application'
log = logging.getLogger('spam_application')
log.setLevel(logging.DEBUG)
# create formatter and add it to the handlers
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# create file handler which logs even debug messages
fh = logging.FileHandler('spam.log')
fh.setLevel(logging.DEBUG)
fh.setFormatter(formatter)
log.addHandler(fh)
# create console handler with a higher log level
ch = logging.StreamHandler()
ch.setLevel(logging.ERROR)
ch.setFormatter(formatter)
log.addHandler(ch)
log.info('creating an instance of auxiliary_module.Auxiliary')
a = auxiliary_module.Auxiliary()
log.info('created an instance of auxiliary_module.Auxiliary')
log.info('calling auxiliary_module.Auxiliary.do_something')
a.do_something()
log.info('finished auxiliary_module.Auxiliary.do_something')
log.info('calling auxiliary_module.some_function()')
auxiliary_module.some_function()
log.info('done with auxiliary_module.some_function()')
# remember to close the handlers
for handler in log.handlers:
handler.close()
log.removeFilter(handler)
самый простой способ войти в файл и в stderr:
import logging
logging.basicConfig(filename="logfile.txt")
stderrLogger=logging.StreamHandler()
stderrLogger.setFormatter(logging.Formatter(logging.BASIC_FORMAT))
logging.getLogger().addHandler(stderrLogger)
вы можете создать два обработчика для файла и stdout, а затем создать один регистратор с до basicConfig
. Это может быть полезно, если у вас такая же log_level и формат вывода для обоих обработчиков:
import logging
import sys
file_handler = logging.FileHandler(filename='tmp.log')
stdout_handler = logging.StreamHandler(sys.stdout)
handlers = [file_handler, stdout_handler]
logging.basicConfig(
level=logging.DEBUG,
format='[%(asctime)s] {%(filename)s:%(lineno)d} %(levelname)s - %(message)s',
handlers=handlers
)
logger = logging.getLogger('LOGGER_NAME')