我們正在使用uWSGI來爲我們的Django應用程序提供服務。我們還利用uWSGI的mules和假脫機系統定期運行作業,並在請求/響應週期之外異步執行一些任務。uWSGI異步函數不知道Django的日誌記錄設置
的uWSGI的一部分處理HTTP請求使用Django logging configuration就好了。但是,使用uWSGI的cron
和mulefunc
功能時,通常不會配置記錄器 - 您將調用log.error(),異常就會消失。我們發現了一個奇怪的解決方法,我將在下面解釋。
這是我們的日誌記錄設置,在settings.py
。 StreamHandler默認路由到stderr,所以我們應該看到DEBUG級別和更高級別的任何日誌路由到stderr。
LOGGING = { 'version': 1, 'disable_existing_loggers': True, 'formatters': { 'verbose': { 'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s' }, }, 'handlers': { 'console': { 'level': 'DEBUG', 'class': 'logging.StreamHandler', 'formatter': 'verbose' } }, 'loggers': { '': { 'handlers': ['console'], 'level': 'NOTSET', } } }
這裏有什麼行不通的例子:
from uwsgidecorators import mulefunc log = logging.getLogger(__name__) @timer(10, target="mule") def test_mule_logging(signum): log.error("You'll never see this message")
然而,有一個很奇怪的解決方法。如果你導入Django的設置,並且訪問它上面的一個鍵,那麼這個記錄器會神奇地工作。例如:
from django.conf import settings getattr(settings, "doesntmatter", None) from uwsgidecorators import timer import logging log = logging.getLogger(__name__) @timer(10, target="mule") def test_mule_logging(signum): log.error("I WILL see this log!")
雖然這看起來像一個可怕的解決方法。