2009-05-28 47 views
1

我们有一个令人讨厌的问题,我们发现当我们的服务器上运行mod_python时,python日志记录模块的行为不同。当执行的外壳,或与的runserver命令或mod_wsgi的Django的相同的代码,该行为是正确的:python日志记录模块在使用mod_python时的不同行为

import logging 
logger = logging.getLogger('site-errors') 
logging.debug('logger=%s' % (logger.__dict__)) 
logging.debug('logger.parent=%s' % (logger.parent.__dict__)) 
logger.error('some message that is not logged.') 

我们那么下面的记录:

2009-05-28 10 :36:43,440,DEBUG,error_middleware.py:31,[logger = {'name':'site-errors','parent':< logging.RootLogger instance at 0x85f8aac >,'handlers':[],'level' :0,'disabled':0,'manager':< logging.Manager实例在0x85f8aec >,'propagate':1,'filters':[]}]

2009-05-28 10:36:43,440,DEBUG,error_middleware.py:32,[logger.parent = {'name': 'root','parent':None,'handlers': [< logging 10, '禁用':在 0x8ec612c >, 在0x8ec616c >], '等级' < logging.handlers.RotatingFileHandler 实例.StreamHandler实例0, '传播':1, '过滤器':[]}]

可以看到,没有处理程序或级别设置为儿童记录器'站点错误'。

MONITOR_LOGGING_CONFIG = ROOT + 'error_monitor_logging.conf' 

import logging 
import logging.config 

logging.config.fileConfig(MONITOR_LOGGING_CONFIG) 

if CONFIG == CONFIG_DEV: 
    DB_LOGLEVEL = logging.INFO 
else: 
    DB_LOGLEVEL = logging.WARNING 

的第二个问题是,我们也是在驻留该文件夹error_middleware.py在__init__.py添加自定义处理程序:

日志记录配置在settings.py完成

import logging 
from django.conf import settings 
from db_log_handler import DBLogHandler 

handler = DBLogHandler() 
handler.setLevel(settings.DB_LOGLEVEL) 
logging.root.addHandler(handler) 

自定义处理程序无法在日志中看到!

如果有人知道问题所在,请告诉我们!不要犹豫,要求提供更多信息。这肯定会有助于解决问题。

回答

5

如果不在settings.py中配置日志记录可能会更好。

我们将您的日志记录配置在我们的根目录urls.py。这似乎更好。我没有阅读足够的Django源文件来知道为什么,更确切地说,它更好,但它对我们来说工作得很好。我也会在这里添加自定义处理程序。

另外,请仔细查看mod_wsgi。它似乎比mod_python更好。

+2

+1使用mod_wsgi。 wsgi应用程序意味着您可以部署在其他服务器软件上,并且mod_python会特别吸引人。 – nosklo 2009-05-28 10:56:08

0

该问题没有通过使用mod_wsgi解决。

我可以通过将完整的配置放入一个文件来解决问题。混合文件和代码配置似乎会造成apache问题(无论是使用mod_wsgi还是mod_python)。

使用带有文件配置自定义日志处理程序,我必须做到以下几点:

import logging 
import logging.config 
logging.custhandlers = sitemonitoring.db_log_handler 
logging.config.fileConfig(settings.MONITORING_FILE_CONFIG) 

从设置。py我无法导入sitemonitoring.db_log_handler,所以我必须将此代码放入根urls.py

在config文件中,我指的是DBLogHandler与下面的语句

[handler_db] 
class=custhandlers.DBLogHandler() 
level=ERROR 
args=(,) 

PS:注意custhandler“属性”是动态创建的,可以有另外一个名字。这是使用动态语言的优势。

0

您似乎没有发布所有相关信息 - 例如,您的日志记录配置文件在哪里?

你说:

当执行在 壳,或与的runserver 命令或mod_wsgi的Django的相同的代码,其行为 是正确的

你不”请确认您显示的日志输出是来自这些环境之一还是来自mod_python运行。它看起来不错 - 在你的代码中,你将处理程序添加到根目录,而不是记录器的“站点错误”。您还在处理程序上设置了一个级别,而不是记录器 - 所以您不希望在日志记录输出中看到为“站点错误”记录器设置的级别,neh?可以在记录器和处理程序上设置级别,但它们不尽相同,尽管它们以相同的方式过滤事件。

有关自定义处理程序,如果你看一下配置日志文件很容易解释的问题,请参阅

http://docs.python.org/library/logging.html(搜索“之类条目指示”)

这说明任何处理类描述配置文件是日志包名称空间中的eval()'d。因此,通过将logging.custhandlers绑定到您的自定义处理程序模块,然后在配置文件中声明“custhandlers.MyCustomClass”,eval()会产生预期的结果。你也可以同样做了

logging.sitemonitoring = sitemonitoring

和指定的处理程序类作为

sitemonitoring.db_log_handler.DBLogHandler

这将很好的工作(只要db_log_handler子包已被导入)。

顺便提一下,人们有时会在settings.py中配置日志记录时出现问题,这是由于Django的导入魔法导致了循环导入问题。我通常在settings.py中配置日志记录,除非要导入某些Django位(例如在django.db中 - 因为应用程序导入逻辑位于django.db中,所以如果尝试在settings.py中导入django.db.x)。

相关问题