簡體   English   中英

如何使用Python正確記錄錯誤/信息?

[英]How to properly log errors/info with Python?

我正在構建一個GUI程序,其中包含幾個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,函數名稱不是info,並且模塊未記錄。

重申一下,我想要的是:當我說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!")在GUI.py文件的第414行上。 如您所見,該消息應在每次軟件啟動時寫入(這是setupUi)。 它是書面的,但是這是書面的:

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

編輯#2經過進一步檢查,似乎是PyInstaller以某種方式將問題搞砸了。 直接通過解釋器運行軟件會產生預期的結果; 程序被編譯成EXE文件后,發生上述情況。

您可以發布完整的摘要嗎? 如果我按照您剛才所說的去做,就會得到正確的日志。 我將在此處發布腳本(名為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

我無法重現您的問題。 這篇文章包含一個非常簡單的示例。 請嘗試一下,並告訴我們您是否成功獲得正確的結果:

myModule.py

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

也許您正在尋找traceback模塊

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM