Как правильно регистрировать ошибки / информацию с Python? - PullRequest
2 голосов
/ 23 декабря 2011

Я создаю программу с графическим интерфейсом, которая имеет несколько основных (GUI) модулей и 4 разных модуля QThread. Я хочу иметь возможность правильно регистрировать необработанные исключения и другую различную информацию, которую я указываю. Поэтому я решил использовать встроенный в Python модуль логирования.

Это то, что я настроил как:

logging.basicConfig(filename="ubc.log", 
                    format='%(asctime)-6s: %(name)s - %(levelname)s - %(module)s - %(funcName)s - %(lineno)d - %(message)s', 
                    level=logging.DEBUG)

В соответствии с этой конфигурацией, я хотел, чтобы модуль регистрации сообщал мне, в какой именно строке произошла ошибка / информация, в каком модуле, в какой функции она произошла и т. Д. когда я logging.info("text")):

2011-12-22 16:06:02,072: root - INFO - logging - info - 1592 - Calling load blog names function, tabWidget index is 0

Излишне говорить, что большая часть этой информации мне не нужна. Номер строки определенно не 1592, имя функции не является информацией, и модуль не регистрируется.

Повторюсь, я хочу вот что: когда я говорю logging.info("log this"), я хочу, чтобы это появилось в журнале:

2011-12-22 16:06:02,072: root - INFO - WorkerThread1.py - upload_function(self, email, param) - line number 131 - log this

Возможно ли что-то подобное, и если да, то как?

РЕДАКТИРОВАТЬ : По запросу я добавляю больше кода:

class UI(QMainWindow, ui_ui.Ui_MainWindow):

    def __init__(self, parent=None):
        super(BlogCreator, self).__init__(parent)
        self.setupUi(self)
        self.tabWidget.setCurrentIndex(0)

        logging.info("Prda!")

logging.info("Prda!") находится в строке 414 файла GUI.py. Как видите, это сообщение должно быть написано при каждом запуске программного обеспечения (это setupUi). И это написано, но вот что пишется:

2011-12-22 16:53:04,209: root - INFO - logging - info - 1592 - Prda!

EDIT # 2 При дальнейшем рассмотрении кажется, что именно PyInstaller каким-то образом все испортил. Запуск программного обеспечения напрямую через интерпретатор дает желаемые результаты; после того, как программа была скомпилирована в EXE-файл, происходит вышеупомянутое.

Ответы [ 3 ]

3 голосов
/ 23 декабря 2011

Можете ли вы опубликовать полный фрагмент? Если я сделаю то, что вы только что сказали, я получу правильный журнал. Я выложу свой сценарий здесь (с именем stackoverflow_8613924.py), для сравнения:

import logging

logging.basicConfig(filename=None, format='%(asctime)-6s: %(name)s - %(levelname)s - %(module)s - %(funcName)s - %(lineno)d - %(message)s', level=logging.DEBUG)

def fname():
    logging.info('hello world')

fname()

Выполнение этого дает мне:

$ python stackoverflow_8613924.py 
2011-12-23 09:05:35,678: root - INFO - stackoverflow_8613924 - fname - 6 - hello world
1 голос
/ 23 декабря 2011

Я не смог воспроизвести вашу проблему. Этот пост содержит очень простой пример. Пожалуйста, попробуйте и скажите нам, если вам удастся получить правильный результат или нет:

myModule.py * * 1004

import logging
logging.basicConfig(filename="myLogFile.log", \
    format='%(asctime)-6s: %(name)s - %(levelname)s - %(module)s - %(funcName)s - %(lineno)d - %(message)s', \
    level=logging.DEBUG)

def myFct():
    logging.info("info at module.function level")

logging.info("info at module level")
myFct()

После выполнения мой файл журнала содержит:

2011-12-23 10:35:09,743: root - INFO - myModule - <module> - 11 - info at module level
2011-12-23 10:35:09,743: root - INFO - myModule - myFct - 9 - info at module.class.function level
0 голосов
/ 23 декабря 2011

Может быть, модуль трассировки - это то, что вы ищете:

import sys, traceback

try:
    my_function()
except Exception:
    exc_type, exc_value, exc_traceback = sys.exc_info()
    msg = u"\n".join(traceback.format_tb(exc_traceback))
    logging.error(msg)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...