Как я могу регистрировать каждый печатный вывод при печати внутри (внешней) функции

#python #logging

Вопрос:

Я не так хорошо знаком с лесорубом; пожалуйста, позвольте мне спросить.

В принципе, я хочу регистрировать все, что печатаю. Проблема в том, что строки печати находятся внутри функций, объявленных во внешних файлах. Например, мой main.py файл выглядит так

 from do_run import do_run
import logging
if __name__ == "__main__":

    logging.basicConfig(level=logging.INFO, format='%(message)s')
    logger = logging.getLogger()
    logger.addHandler(logging.FileHandler('test.log', 'a'))
    global print
    print = logger.info
    do_run()
 

И у меня есть строки печати в функции do_run (), определенной в отдельном файле python do_run.py :

 def do_run():

    print('blah')
 

Проблема в том, что » бла «не печатается в «тесте».файл журнала, и я хочу, чтобы он был напечатан в нем.

Есть ли простой способ это исправить?

Комментарии:

1. не переопределяйте встроенную print функцию

Ответ №1:

Вид взлома, но вы можете использовать patch from unittest.mock для того, чтобы он регистрировался в файле, а также печатался.

 from src.do_run import do_run
import logging
from unittest.mock import patch

if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO, format='%(message)s')
    logger = logging.getLogger()
    logger.addHandler(logging.FileHandler('test.log', 'a'))
    with patch("src.do_run.print", logger.info):
        do_run()
 

Когда я запускаю приведенный выше код, я получаю test.log файл с содержимым blah в нем.