2014-04-24 124 views
0

即時通訊目前通過......Python的異常記錄

def log_message(text): 
    log_file = "/var/log/logfile.txt" 

    try: 
     if os.path.isfile(log_file): 
      mode = "a" 
     else: 
      mode = "w" 

     with open(log_file, mode) as myfile: 
      myfile.write("%s\n" % (text)) 

     return True 

    except Exception as e: 
     print "error : ",e 
     return False 

try: 
    ... some code 

except Exception as e: 
     log_message("error : %s" % (e)) 

但是即時通訊我的日誌我得到記錄程序的異常「類型錯誤:類型的參數‘NoneType’不是可迭代的」 有沒有一種辦法還會記錄下例外的其他信息。如行號模塊文件等等?

>>> post_builder_ghost(abc).generate() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "post_builder.py", line 34, in generate 
    if 'youtube' in self.video: 
TypeError: argument of type 'NoneType' is not iterable 
>>> 

感謝,

+0

爲什麼不試試['logging'(https://docs.python.org/2/library/logging.html)模塊 – emeth

回答

1

直接回答你的問題:看traceback.print_exc

但是...

你應該看看standard loggingtutorial)。您的代碼將成爲(在它的最簡單的形式):

import logging 
logging.basicConfig(stream=open("/var/log/logfile.txt", "a+")) 

LOG = logging.getLogger(__name__) 

try: 
    ... some code 
except Exception as e: 
    LOG.exception("human readable explanation of what you did") 

如前所述,這是記錄的最簡單形式。你可以比這更遠!就個人而言,我會建議basicConfig。但爲了讓你快點,它會做得很好。

跳水入日誌配置,您將能夠做更多有益的事情,比如在一個文件中寫入調試信息和錯誤信息到另一個文件(或流像標準錯誤,標準輸出)。

它也支持你的要求,如登錄模塊名,文件名和行號,但默認情況下禁用。您可以啓用它,指定自己的消息格式(見LogRecord objects的字段的引用):

logging.basicConfig(stream=open("/var/log/logfile.txt", "a+"), 
        format="%(levelname)s:%(name)s:%(pathname)s:%(lineno)s:%(message)s") 

我上面使用將包括堆棧跟蹤(這是你想要的東西)的LOG.exception方法。你有其他的方法(.debug.info.warning.error.critical),它只會發出消息。

作爲一個經驗法則,您希望在您的應用程序中儘快配置日誌記錄系統,但不要在模塊級別配置以避免干擾其他庫。如果它是一個控制檯應用程序,「切入點」將有助於(或用if __name__ == '__main__'塊保護它

配置後(無論是手動,或使用basicConfig),然後你可以把這個在每個模塊:

import logging 
LOG = logging.getLogger(__name__) 

哪位能給一個專用於該模塊記錄器(LOG),並允許您配置日誌(增加/減少例如冗長)以後(甚至在運行時),每個模塊。

0

您可以使用traceback.format_exc

import traceback 

try: 
    some code ... 
except Exception: 
    exp = traceback.format_exc() 
    log_message("error : %s" % (exp))