Как из разных функций отправлять по одному API информацию о выполнении этой функции?
Доброго времени суток!
Суть: Есть софтина на Python, со своим API и суть ее работы, давайте представим, заключается в автоматической готовке пиццы. У нее есть набор модулей, например, модуль для работы с печью, модуль для работы с автоматом для разрезания теста и т.д. Каждый модуль - набор функций. В ходе выполнения каждой функции, с помощью команды print в стандартный поток вывода выводится текущий статус. (Ну например print('Запускается печь...').
Задача: Мне нужно, что бы эти статусы отображались в стандартном потоке вывода и отправлялись по API (в данном случае, API - это экземпляр класса, с помощью методов которого осуществляются различные операции, нас интересует метод broadcast_sending, который отправляет заданные аргументы всем клиентам, которые к этому API подключены (подключение по сокетам)). Т.е. я в другом модуле сделал функцию:
def send_status(*data):
print(data)
global api
api.broadcast_sending(data)
Теперь, во всех функциях в других модулях я заменил просто print на send_status, таким образом, информация попадает и на стандартный поток вывода, и клиенту, который был подключен по к этому API и дал, собственно, команду на начало заготовки пиццы.. Но мне кажется, что я делаю что-то неправильно, нет ли решения изящней? Спасибо.
Ответы (1 шт):
Вы можете использовать модуль logging. Он позволяет подключить различные handler'ы. Делаете свой вариант handler, который, к примеру будет отправлять post запросы с логами по адресу и добавляете его через .addHandler(api).
В качестве примеры приведу вариант, когда по разному выводится сообщение в лог.
import logging
class APIRequestHandler(logging.Handler):
def emit(self, record):
try:
msg = self.format(record)
print('api:: ' + msg)
except Exception:
self.handleError(record)
class ModStringHandler(logging.Handler):
def emit(self, record):
try:
msg = self.format(record)
print('print:: ' + msg)
except Exception:
self.handleError(record)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
api = APIRequestHandler()
#api.setLevel(logging.INFO)
api.setFormatter(formatter)
mod = ModStringHandler()
#mod.setLevel(logging.INFO)
mod.setFormatter(formatter)
logger = logging.Logger('test')
logger.setLevel(logging.INFO)
logger.addHandler(api)
logger.addHandler(mod)
logger.info('test - info')
logger.warning('test - warning')
Вывод:
api:: 2021-07-21 22:34:02,131 - test - INFO - test - info
mod:: 2021-07-21 22:34:02,131 - test - INFO - test - info
api:: 2021-07-21 22:34:02,132 - test - WARNING - test - warning
mod:: 2021-07-21 22:34:02,132 - test - WARNING - test - warning