在Python中使用全局日志時(shí)需要注意的問題
在使用 uliweb 開發(fā) soap webservice 后,啟動(dòng) uliweb 時(shí),werkzeug 的日志莫名其妙丟失了。
正常的日志:
[INFO] * Running on http://localhost:8000/
[INFO] * Restarting with reloader
[INFO] * Loading DebuggedApplication...
異常的日志:
[INFO] * Loading DebuggedApplication...
事實(shí)上, werkzeug 相關(guān) INFO 及其以下級(jí)別的日志全部都看不到了,這太詭異了,于是果斷提交了issue
而且我創(chuàng)建一個(gè)新的項(xiàng)目和 app 后,并沒有日志丟失的問題,于是我懷疑是因?yàn)槲覐?uliweb 0.1.3 升級(jí)到 0.1.4 導(dǎo)致的,我的項(xiàng)目是使用 0.1.3 創(chuàng)建的,之前也沒有注意過日志的問題,但是得到 limodou 的答復(fù)后,我否定了這一點(diǎn)
- uliweb在創(chuàng)建項(xiàng)目時(shí)不會(huì)生成象 Django 一樣的 manage.py 之類的東西,就是 settings.py 等一些配置文件和啟動(dòng)文件, 都是和版本無關(guān)的。
仔細(xì)想想,我的項(xiàng)目和新創(chuàng)建的項(xià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 沒有定義日志級(jí)別,werkzeug 會(huì)將其 logger 的日志級(jí)別 設(shè)置為 info,而打印 werkzeug 日志的地方,恰巧用了 info 級(jí)別
[code][INFO] * Running on http://localhost:8000/
[INFO] * Restarting with reloader
也就是說,因?yàn)橐呀?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 的庫(kù)修改的全局設(shè)計(jì),似乎應(yīng)該給它提個(gè) issue 才是, 這個(gè) issue 應(yīng)該可以關(guān)閉了。
這里有個(gè) workaround,在 apps/settings.ini 中添加
werkzeug = {'propagate':0, 'level': 'info', 'format':'format_simple'}
當(dāng)然,建議 limodou 將 default_settings.ini 中的 zerkzeug 的日志級(jí)別默認(rèn)設(shè)置成 info,因?yàn)檫@個(gè)問題實(shí) 在太詭異了,畢竟 werkzeug 中的默認(rèn)日志級(jí)別就是 info。
好了,回顧一下,pysimplesoap 中因?yàn)楦采w了全局日志級(jí)別,導(dǎo)致 werkzeug 無法輸入低于 warning 的日志,所以, 如果我們?cè)陂_發(fā)開放 python 庫(kù)的時(shí)候,還是將日志打在自己的命名空間下吧,不要去碰全局的 logging 設(shè)置,這樣 會(huì)對(duì)別人造成困擾。
相關(guān)文章
通過python讀取txt文件和繪制柱形圖的實(shí)現(xiàn)代碼
這篇文章主要介紹了通過python讀取txt文件和繪制柱形圖的實(shí)現(xiàn)代碼,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03關(guān)于Python 的簡(jiǎn)單柵格圖像邊界提取方法
今天小編就為大家分享一篇關(guān)于Python 的簡(jiǎn)單柵格圖像邊界提取方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-07-07Python 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語句方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-08-08對(duì)Python中創(chuàng)建進(jìn)程的兩種方式以及進(jìn)程池詳解
今天小編就為大家分享一篇對(duì)Python中創(chuàng)建進(jìn)程的兩種方式以及進(jìn)程池詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-01-01使用Python的Tornado框架實(shí)現(xiàn)一個(gè)Web端圖書展示頁面
Tornado是Python的一款高人氣Web開發(fā)框架,這里我們來展示使用Python的Tornado框架實(shí)現(xiàn)一個(gè)Web端圖書展示頁面的實(shí)例,通過該實(shí)例可以清楚地學(xué)習(xí)到Tornado的模板使用及整個(gè)Web程序的執(zhí)行流程.2016-07-07Python調(diào)用C++,通過Pybind11制作Python接口
今天小編就為大家分享一篇關(guān)于Python調(diào)用C++,通過Pybind11制作Python接口,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-10-10簡(jiǎn)單聊聊Python中的鴨子類型和猴子補(bǔ)丁
不知不覺使用python寫代碼已經(jīng)很長(zhǎng)時(shí)間了,下面這篇文章主要給大家介紹了關(guān)于python鴨子類型(duck?type)和猴子補(bǔ)丁(mokey?patching)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04