UWSGI

2010-11-26 112 views
11
下從Django的記錄

我正在我的Django應用程序通過uwsgi服務器和我開始32個進程在我的init腳本-args是:UWSGI

ARGS="--pidfile ${PIDFILE} --uid ${UID} -s /tmp/${NAME}.sock --pythonpath ${GCS_HOME}/server/src/gcs --master -w wsgi -d ${GCS_HOME}/logs/uwsgi.log -p 32 -z 30" 

版本的Python 2.6.5,Django的1.2.1,uWSGI 0.9.5.1

我想擁有一個日誌文件,因此我使用了基於多處理的日誌處理程序,如question 641420中所述。

multilogging處理程序在我有一個簡單的測試應用程序中工作正常,當我運行帶有werkzeug的manage.py runserver_plus時,但是當我使用django和uwsgi運行時沒有記錄任何內容(我沒有從uwsgi雖然過程)。

我WSGI文件如下,如果任何人都可以認同我的配置有問題或正在發生的事情我會很感激的解釋:

APP_VIRTUAL_ENV = "/home/devadmin/gcs/server/gcs_env/" 
APP_PARENT_PATH = "/home/devadmin/gcs/server/src/" 

##                    

import sys 
# Redirect stdout to comply with WSGI           
sys.stdout = sys.stderr 

import os, site 

# Set the settings module django should use          
os.environ['DJANGO_SETTINGS_MODULE'] = "gcs.settings" 

# set the sys.path                
site_packages_subpath = "/lib/python%s.%s/site-packages" % (sys.version_info[0]\ 
, sys.version_info[1],) 
site_packages_path = os.path.join(APP_VIRTUAL_ENV, site_packages_subpath[1:]) 

sys_path = [] 
for path in sys.path: 
    if site_packages_subpath in path and not path.startswith(APP_VIRTUAL_ENV): 
     continue 
    sys_path.append(path) 

sys.path = [ APP_PARENT_PATH ] 
sys.path += sys_path 
site.addsitedir(site_packages_path) 

# reorder sys.path                
for path in sys_path: 
    sys.path.remove(path) 
sys.path += sys_path 

# setup logging                 
import os.path 
import logging 
import logging.config 
logging.config.fileConfig(os.path.join(os.path.dirname(__file__), "logging.conf\ 
")) 
+0

很難說,你的配置文件是什麼樣子的?你運行的是什麼版本的Python?您正在導入但不使用`multiproc_handler`,並且由於某種原因,您沒有使用在實際的`fileConfig`調用中計算出的`log_conf_file`。 – 2010-11-26 11:40:43

+0

添加上面的版本並從wsgi.py中刪除虛假行(它們是我在做某些調試時留下的。還指出,當我使用werkzeug/runserver_plus時,日誌記錄是可以的。所以它會表明我的日誌記錄不能通過wsgi.py正確初始化。當我使用標準的Python日誌處理程序(RotatingLogFileHandler)時,我得到日誌輸出,但這不是多個uwsgi進程的解決方案。 – rtmie 2010-11-26 13:42:51

回答

12

答案已經更新 - 5月15日,2013 - 請參閱下方的其他日誌記錄選項

如果您想擁有單個日誌文件 - 使用syslog,讓它處理將所有輸入複用到單個文件。多個進程附加到單個文件是很難看的,即使是多處理的解決方法。

除了各種日誌信息流的線程/進程安全「縮混」的優點之外,您可以隨時指定遠程主機以便根據需要發送日誌,以及使日誌文件輪轉變得輕而易舉您的客戶正在寫入域套接字或UDP套接字 - 他們不必等待管理其下的文件。更好的是,你不會失去信息。

結合使用像syslog-ng的系統日誌守護進程,你可以做很多花哨的切片和切塊,信息中繼,重複的郵件過濾等

長話短說的 - 系統日誌比管理自己的更好日誌文件(在我看來),針對系統日誌的最佳參數是,你不'擁有'服務器(並且,表面上日誌文件可能對你沒有限制)。

如果你想超級棒,將你的日誌數據發送給splunk,你就可以將你的遊戲提升到一個新的水平。大多數人使用Splunk進行IT日誌聚合,但是將應用程序中的系統日誌記錄到splunk中是實現理解性能瓶頸,使用模式等的絕佳數據挖掘功能的捷徑。

#!/usr/bin/python 

import logging 
from logging.handlers import SysLogHandler 

# Setup 
logger = logging.getLogger("mything") 
hdlr = SysLogHandler(address = '/dev/log', facility = SysLogHandler.LOG_USER) 
logger.addHandler(hdlr) 
formatter = logging.Formatter('%(name)s: %(levelname)s %(message)s') 
hdlr.setFormatter(formatter) 
logger.setLevel(logging.INFO) 


logger.info('hello Laverne!') 
logger.debug('The Great Ragu has taken ill!') 

新內容 - 2013年5月15日

有值得如果你有基礎設施/韌勁將它設置提的一個附加選項 - Sentry,這對Python的可用庫(以及作爲Javascript和其他),它提供了一個集中的位置給你發送錯誤以進行監控。它看起來很整齊。