在Python中使用全局日志時需要注意的問題
在使用 uliweb 開發(fā) soap webservice 后,啟動 uliweb 時,werkzeug 的日志莫名其妙丟失了。
正常的日志:
[INFO] * Running on http://localhost:8000/
[INFO] * Restarting with reloader
[INFO] * Loading DebuggedApplication...
異常的日志:
[INFO] * Loading DebuggedApplication...
事實上, werkzeug 相關(guān) INFO 及其以下級別的日志全部都看不到了,這太詭異了,于是果斷提交了issue
而且我創(chuàng)建一個新的項目和 app 后,并沒有日志丟失的問題,于是我懷疑是因為我從 uliweb 0.1.3 升級到 0.1.4 導(dǎo)致的,我的項目是使用 0.1.3 創(chuàng)建的,之前也沒有注意過日志的問題,但是得到 limodou 的答復(fù)后,我否定了這一點(diǎn)
- uliweb在創(chuàng)建項目時不會生成象 Django 一樣的 manage.py 之類的東西,就是 settings.py 等一些配置文件和啟動文件, 都是和版本無關(guān)的。
仔細(xì)想想,我的項目和新創(chuàng)建的項目的區(qū)別在于 settings.ini 豐富了一些,然后用了 pysimplelib,好吧,從源碼追蹤吧。
我看了 uliweb 內(nèi)置的 zerkzeug 代碼,創(chuàng)建日志這里很明確
uliweb/lib/werkzeug/serving.py
113 _logger.setLevel(logging.INFO)
114 handler = logging.StreamHandler()
115 _logger.addHandler(handler)[code]
當(dāng)全局 logging.root 中已經(jīng)定義了 Handler 或者 werkzeug 沒有定義日志級別,werkzeug 會將其 logger 的日志級別 設(shè)置為 info,而打印 werkzeug 日志的地方,恰巧用了 info 級別
[code][INFO] * Running on http://localhost:8000/
[INFO] * Restarting with reloader
也就是說,因為已經(jīng)定義其它 logging handler 的原因,導(dǎo)致無法輸出 werkzeug 日志
grep pysimplelib 下的結(jié)果
./simplexml.py:27:logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.WARNING)
./transport.py:30:logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.WARNING)
好吧,果然是這家伙在作祟,注釋掉這三行代碼后,werkzeug 日志正常輸出
說起來,這不應(yīng)該算是 uliweb 的問題,pysimplesoap 的庫修改的全局設(shè)計,似乎應(yīng)該給它提個 issue 才是, 這個 issue 應(yīng)該可以關(guān)閉了。
這里有個 workaround,在 apps/settings.ini 中添加
werkzeug = {'propagate':0, 'level': 'info', 'format':'format_simple'}
當(dāng)然,建議 limodou 將 default_settings.ini 中的 zerkzeug 的日志級別默認(rèn)設(shè)置成 info,因為這個問題實 在太詭異了,畢竟 werkzeug 中的默認(rèn)日志級別就是 info。
好了,回顧一下,pysimplesoap 中因為覆蓋了全局日志級別,導(dǎo)致 werkzeug 無法輸入低于 warning 的日志,所以, 如果我們在開發(fā)開放 python 庫的時候,還是將日志打在自己的命名空間下吧,不要去碰全局的 logging 設(shè)置,這樣 會對別人造成困擾。
相關(guān)文章
通過python讀取txt文件和繪制柱形圖的實現(xiàn)代碼
這篇文章主要介紹了通過python讀取txt文件和繪制柱形圖的實現(xiàn)代碼,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03Python APScheduler執(zhí)行使用方法詳解
在本篇文章里小編給大家整理的是一篇關(guān)于Python APScheduler執(zhí)行使用方法的相關(guān)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2020-12-12Django shell調(diào)試models輸出的SQL語句方法
今天小編就為大家分享一篇Django shell調(diào)試models輸出的SQL語句方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08對Python中創(chuàng)建進(jìn)程的兩種方式以及進(jìn)程池詳解
今天小編就為大家分享一篇對Python中創(chuàng)建進(jìn)程的兩種方式以及進(jìn)程池詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-01-01使用Python的Tornado框架實現(xiàn)一個Web端圖書展示頁面
Tornado是Python的一款高人氣Web開發(fā)框架,這里我們來展示使用Python的Tornado框架實現(xiàn)一個Web端圖書展示頁面的實例,通過該實例可以清楚地學(xué)習(xí)到Tornado的模板使用及整個Web程序的執(zhí)行流程.2016-07-07Python調(diào)用C++,通過Pybind11制作Python接口
今天小編就為大家分享一篇關(guān)于Python調(diào)用C++,通過Pybind11制作Python接口,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-10-10