天天看點

Python異常資訊寫日志

開發的過程中可能時常碰到一個需求,需要把Python的異常資訊輸出到日志檔案中

網上的辦法都不太實用,下面介紹一種實用的,從Python 2.7源碼中扣出來的

廢話不說 直接上代碼,代碼不多,注釋比較多而已

<code>import</code> <code>sys, traceback</code>

<code>traceback_template = </code><code>''</code><code>'Traceback (most recent call last):</code>

<code>  </code><code>File </code><code>"%(filename)s"</code><code>, line %(lineno)s, </code><code>in</code> <code>%(name)s</code>

<code>%(</code><code>type</code><code>)s: %(message)s\n</code><code>''</code><code>' </code><code># Skipping the "actual line" item</code>

<code># Also note: we don't walk all the way through the frame stack in this example</code>

<code># see hg.python.org/cpython/file/8dffb76faacc/Lib/traceback.py#l280</code>

<code># (Imagine if the 1/0, below, were replaced by a call to test() which did 1/0.)</code>

<code>try:</code>

<code>    </code><code>1</code><code>/0</code>

<code>except:</code>

<code>    </code><code># http://docs.python.org/2/library/sys.html#sys.exc_info</code>

<code>    </code><code>exc_type, exc_value, exc_traceback = sys.exc_info() </code><code># most recent (if any) by default</code>

<code>    </code><code>''</code><code>'</code>

<code>    </code><code>Reason this _can_ be bad: If an (unhandled) exception happens AFTER this,</code>

<code>    </code><code>or </code><code>if</code> <code>we </code><code>do</code> <code>not delete the labels on (not much) older versions of Py, the</code>

<code>    </code><code>reference we created can linger.</code>

<code>    </code><code>traceback.format_exc</code><code>/print_exc</code> <code>do</code> <code>this very thing, BUT note this creates a</code>

<code>    </code><code>temp scope within the </code><code>function</code><code>.</code>

<code>    </code><code>traceback_details = {</code>

<code>                         </code><code>'filename'</code><code>: exc_traceback.tb_frame.f_code.co_filename,</code>

<code>                         </code><code>'lineno'</code>  <code>: exc_traceback.tb_lineno,</code>

<code>                         </code><code>'name'</code>    <code>: exc_traceback.tb_frame.f_code.co_name,</code>

<code>                         </code><code>'type'</code>    <code>: exc_type.__name__,</code>

<code>                         </code><code>'message'</code> <code>: exc_value.message, </code><code># or see traceback._some_str()</code>

<code>                        </code><code>}</code>

<code>    </code><code>del(exc_type, exc_value, exc_traceback) </code><code># So we don't leave our local labels/objects dangling</code>

<code>    </code><code># This still isn't "completely safe", though!</code>

<code>    </code><code># "Best (recommended) practice: replace all exc_type, exc_value, exc_traceback</code>

<code>    </code><code># with sys.exc_info()[0], sys.exc_info()[1], sys.exc_info()[2]</code>

<code>    </code><code>## 修改這裡就可以把traceback打到任意地方,或者存儲到檔案中了</code>

<code>    </code><code>print traceback_template % traceback_details</code>

本文轉自 xjtuhit 51CTO部落格,原文連結:http://blog.51cto.com/51reboot/1560492