UWSGI

2010-11-26 113 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和其他),它提供了一个集中的位置给你发送错误以进行监控。它看起来很整齐。