サーバー上で mod_python を実行すると、Python ロギング モジュールの動作が異なるという厄介な問題があります。シェルで、または runserver コマンドまたは mod_wsgi を使用して django で同じコードを実行すると、動作は正しくなります。
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 インスタンス at 0x85f8aac>, 'handlers': []、「レベル」: 0、「無効」: 0、「マネージャー」: <0x85f8aec の logging.Manager インスタンス>、「伝播」: 1、「フィルター」: []}]
2009-05-28 10:36:43,740,DEBUG,error_middleware.py:32,[logger.parent={'name': 'root', 'parent': None, 'handlers': [<logging.StreamHandler インスタンスで0x8ec612c>、<logging.handlers.RotatingFileHandler インスタンス 0x8ec616c>]、'レベル': 10、'無効': 0、'伝搬': 1、'フィルター': []}]
ご覧のとおり、子ロガー「site-errors」にはハンドラーまたはレベルが設定されていません。
ロギング構成は 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
2 つ目の問題は、__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)
ログにカスタム ハンドラが表示されません。
誰かが問題の場所を知っている場合は、お知らせください。追加情報を求めることを躊躇しないでください。それは確かに問題を解決するのに役立ちます。