1

我们有一个令人讨厌的问题,我们看到 python 日志记录模块在我们的服务器上使用 mod_python 运行时表现不同。在 shell 或 django 中使用 runserver 命令或 mod_wsgi 执行相同的代码时,行为是正确的:

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,740,DEBUG,error_middleware.py:31,[logger={'name': 'site-errors', 'parent': <logging.RootLogger instance at 0x85f8aac>, 'handlers': [], 'level': 0, 'disabled': 0, 'manager': <logging.Manager instance at 0x85f8aec>, 'propagate': 1, 'filters': []}]

2009-05-28 10:36:43,740,DEBUG,error_middleware.py:32,[logger.parent={'name': 'root', 'parent': None, 'handlers': [<logging.StreamHandler instance at 0x8ec612c>, <logging.handlers.RotatingFileHandler instance at 0x8ec616c>], 'level': 10, 'disabled': 0, 'propagate': 1, 'filters': []}]

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

日志配置在 settings.py 中完成:

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

第二个问题是我们还在 __init__.py 中添加了一个自定义处理程序,该处理程序作为 error_middleware.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)

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

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

4

3 回答 3

5

如果不配置登录可能会更好settings.py

我们在我们的 root 中配置您的日志记录urls.py。这似乎效果更好。我还没有阅读足够多的 Django 源代码来知道为什么,确切地说,它更好,但它对我们来说效果很好。我也会在这里添加自定义处理程序。

另外,请仔细查看mod_wsgi。它的表现似乎比 mod_python 好得多。

于 2009-05-28T10:04:46.057 回答
0

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

你说:

在 shell 或 django 中使用 runserver 命令或 mod_wsgi 执行相同的代码时,行为是正确的

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

如果您查看配置的日志记录文档,则可以轻松解释有关自定义处理程序的问题,请参阅

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

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

logging.sitemonitoring = 站点监控

并将处理程序类指定为

sitemonitoring.db_log_handler.DBLogHandler

这也可以正常工作(只要已经导入了 db_log_handler 子包)。

顺便说一句,人们有时在 settings.py 中配置登录时遇到问题的原因是 Django 的导入魔法导致循环导入问题。我通常在 settings.py 中配置日志记录,除非您想导入 Django 的某些位(例如在 django.db 中 - 因为应用程序导入逻辑在 django.db 中,所以如果您尝试导入可能会遇到循环导入问题)在 settings.py 中导入 django.db.x)。

于 2009-06-07T16:26:25.217 回答
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)

从 settings.py 我无法导入sitemonitoring.db_log_handler,所以我必须将此代码放在根目录中urls.py

在配置文件中,我引用DBLogHandler了以下语句

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

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

于 2009-06-02T13:45:13.837 回答