@1011

Логгирование Python, как быстро сделать вывод ошибок в файл?

Возможно ли как то быстро вывести в файл все что python выводит в консоль? Сообщения от команды print и обшибки?
os windows
python 3.4
программа собирается pyinstaller-ом и выполняется на стороннем компьютере.
  • Вопрос задан
  • 3345 просмотров
Решения вопроса 1
longclaps
@longclaps
Я как-то так в одной ситуации рулил:
old_print = print

def print(*args, **kwargs):
    old_print("~", *args, "~", **kwargs)

print("qwerty")

Учти, подмена print'а действует в контексте модуля.

Вот намёк, как вывести ошибки:
from traceback import format_exc

try:
    # do something wrong
    x = 1 / 0
except:
    for s in format_exc().splitlines():
        print("*", s, "*")

Тут товарищи горячо рекомендуют logging - тоже вариант. Просто из вопроса не понять, что именно для вас лучше.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
qlkvg
@qlkvg
python backend developer
прикрутите logging, пока не поздно. Один раз создать логгер и поменять все print на logger.info - дело где-то 5 минут. Взамен получите возможность быстрого переключения логирования в файл/консоль, разбивку сообщений по уровням (очень удобно отделять дебажные сообщения от информационных и диагностических), полноценное логирование исключений и еще кучу всяких плюшек.
Ответ написан
@trapwalker
Программист, энтузиаст
Самое первое, что нужно делать в любом более-менее полезном скрипте или большой программе - это настроить логирование.
В самом простейшем виде его можно устроить так:
import sys
import logging
if __name__ == '__main__':
    log = logging.getLogger()
    log.level = logging.DEBUG
    log.addHandler(logging.StreamHandler(sys.stderr))
else:
    log = logging.getLogger(__name__)

## Используем так:
log.info('any text')
log.debug('Something about %r in %s', log, __name__)

## Здесь размещаем весь остальной код
if __name__ == '__main__':
    pass  # А здесь, если надо, размещаем то, что будет выполняться, когда модуль запускают как скрипт

Тут всё логирование заворачивается в sys.stderr, не настроено форматирование, вывод в файл и ротация. Это минимальный уровень, дающий возможность отказаться от print для логирования.
Пример для питона 2.7.
Добавлю, что при непосредственном запуске этого кода логгер создаётся с именем по умолчанию (root). Это значит, что в других модулях проекта, управление которым передаётся,
log = logging.getLogger(__name__)

создаст логгер с именем модуля, и в главном файле можно будет настроить роутинг логов с учетом этих имён.
Роутинг настраивается добавлением дополнительных хендлеров и к ним разных фильтров. Если есть какие-то затруднения с этим - пишите, поясню.
Использовать правильное управляемое, расширяемое и гибкое логирование вместо россыпи принтов очень просто. Нужно просто себя приучить к этому, как к чему-то обязательному вроде чистки зубов, использования системы контроля версий и своевременного бэкапа.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы