在UWSGI下从Django记录日志

14 投票
1 回答
19660 浏览
提问于 2025-04-16 07:38

我正在通过uwsgi服务器运行我的django应用,并且启动了32个进程。我的初始化脚本中的参数是:

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。

我想要一个单独的日志文件,所以我使用了一个基于多进程的日志处理器,具体内容可以参考问题641420

这个多日志处理器在我简单的测试应用中运行得很好,当我用manage.py runserver_plus和werkzeug运行时也没问题,但是当我用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\
"))

1 个回答

13

答案已更新 - 2013年5月15日 - 请查看底部以获取额外的日志选项

如果你想要一个单一的日志文件,可以使用syslog,让它来处理所有输入的信息,集中到一个文件里。多个进程同时往一个文件里写东西是很麻烦的,即使有多进程的解决办法也不太好。

除了可以安全地将不同来源的日志信息合并到一起之外,你还可以指定一个远程主机来接收日志,这样做的好处是,日志文件的轮换变得简单,因为你的客户端只需要写入一个域套接字或UDP套接字,不用等着你去管理底下的文件。而且更棒的是,你不会丢失任何信息。

如果和像syslog-ng这样的syslog守护进程结合使用,你可以做很多复杂的操作,比如消息转发、重复消息过滤等等。

简单来说,我认为syslog比自己管理日志文件要好,反对syslog的最大理由是,你可能不“拥有”服务器(而且,显然日志文件可能对你来说是无法访问的)。

如果你想更牛逼一点,可以把你的日志数据发送到splunk,这样你就能提升你的技能水平。大多数人使用Splunk来聚合IT日志,但从你的应用程序通过syslog发送到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等其他语言)的库,可以为你提供一个集中监控错误的地方。看起来很不错。

撰写回答