萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> 編程語言綜合 >> 在Python中使用全局日志時需要注意的問題

在Python中使用全局日志時需要注意的問題

   這篇文章主要介紹了在Python中使用全局日志時需要注意的問題, 作者由uliweb使用時遇到的問題分析全局日志出現錯誤時的解決方法,需要的朋友可以參考下

  在使用 uliweb 開發 soap webservice 後,啟動 uliweb 時,werkzeug 的日志莫名其妙丟失了。

  正常的日志:

   代碼如下:

  [INFO] * Loading DebuggedApplication...

  [INFO] * Running on http://localhost:8000/

  [INFO] * Restarting with reloader

  [INFO] * Loading DebuggedApplication...

  異常的日志:

   代碼如下:

  [INFO] * Loading DebuggedApplication...

  [INFO] * Loading DebuggedApplication...

  事實上, werkzeug 相關 INFO 及其以下級別的日志全部都看不到了,這太詭異了,於是果斷提交了issue

  而且我創建一個新的項目和 app 後,並沒有日志丟失的問題,於是我懷疑是因為我從 uliweb 0.1.3 升級到 0.1.4 導致的,我的項目是使用 0.1.3 創建的,之前也沒有注意過日志的問題,但是得到 limodou 的答復後,我否定了這一點

  uliweb在創建項目時不會生成象 Django 一樣的 manage.py 之類的東西,就是 settings.py 等一些配置文件和啟動文件, 都是和版本無關的。

  仔細想想,我的項目和新創建的項目的區別在於 settings.ini 豐富了一些,然後用了 pysimplelib,好吧,從源碼追蹤吧。

  我看了 uliweb 內置的 zerkzeug 代碼,創建日志這裡很明確

  uliweb/lib/werkzeug/serving.py

   代碼如下:

  112 if not logging.root.handlers and _logger.level == logging.NOTSET:

  113 _logger.setLevel(logging.INFO)

  114 handler = logging.StreamHandler()

  115 _logger.addHandler(handler)[code]

  當全局 logging.root 中已經定義了 Handler 或者 werkzeug 沒有定義日志級別,werkzeug 會將其 logger 的日志級別 設置為 info,而打印 werkzeug 日志的地方,恰巧用了 info 級別

  [code][INFO] * Running on http://localhost:8000/

  [INFO] * Restarting with reloader

  也就是說,因為已經定義其它 logging handler 的原因,導致無法輸出 werkzeug 日志

  grep pysimplelib 下的結果

  代碼如下:

  ./client.py:33: logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.WARNING)

  ./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 日志正常輸出

  說起來,這不應該算是 uliweb 的問題,pysimplesoap 的庫修改的全局設計,似乎應該給它提個 issue 才是, 這個 issue 應該可以關閉了。

  這裡有個 workaround,在 apps/settings.ini 中添加

   代碼如下:

  [LOG.Loggers]

  werkzeug = {'propagate':0, 'level': 'info', 'format':'format_simple'}

  當然,建議 limodou 將 default_settings.ini 中的 zerkzeug 的日志級別默認設置成 info,因為這個問題實 在太詭異了,畢竟 werkzeug 中的默認日志級別就是 info。

  好了,回顧一下,pysimplesoap 中因為覆蓋了全局日志級別,導致 werkzeug 無法輸入低於 warning 的日志,所以, 如果我們在開發開放 python 庫的時候,還是將日志打在自己的命名空間下吧,不要去碰全局的 logging 設置,這樣 會對別人造成困擾。

copyright © 萬盛學電腦網 all rights reserved