diff --git a/django/core/handlers/base.py b/django/core/handlers/base.py index a0aecbfdd3..26a8146161 100644 --- a/django/core/handlers/base.py +++ b/django/core/handlers/base.py @@ -1,12 +1,12 @@ -import logging import sys from django import http from django.core import signals from django.utils.encoding import force_unicode from django.utils.importlib import import_module +from django.utils.log import getLogger -logger = logging.getLogger('django.request') +logger = getLogger('django.request') class BaseHandler(object): diff --git a/django/core/handlers/modpython.py b/django/core/handlers/modpython.py index 395ec65314..5afc61296f 100644 --- a/django/core/handlers/modpython.py +++ b/django/core/handlers/modpython.py @@ -1,4 +1,3 @@ -import logging import os from pprint import pformat import sys @@ -10,8 +9,9 @@ from django.core.handlers.base import BaseHandler from django.core.urlresolvers import set_script_prefix from django.utils import datastructures from django.utils.encoding import force_unicode, smart_str, iri_to_uri +from django.utils.log import getLogger -logger = logging.getLogger('django.request') +logger = getLogger('django.request') # NOTE: do *not* import settings (or any module which eventually imports diff --git a/django/core/handlers/wsgi.py b/django/core/handlers/wsgi.py index 0978be0d6d..dead1e1adf 100644 --- a/django/core/handlers/wsgi.py +++ b/django/core/handlers/wsgi.py @@ -1,4 +1,3 @@ -import logging from pprint import pformat import sys from threading import Lock @@ -13,8 +12,9 @@ from django.core.handlers import base from django.core.urlresolvers import set_script_prefix from django.utils import datastructures from django.utils.encoding import force_unicode, iri_to_uri +from django.utils.log import getLogger -logger = logging.getLogger('django.request') +logger = getLogger('django.request') # See http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html diff --git a/django/db/backends/util.py b/django/db/backends/util.py index fb5162dda1..865508a057 100644 --- a/django/db/backends/util.py +++ b/django/db/backends/util.py @@ -1,11 +1,11 @@ import datetime import decimal -import logging from time import time from django.utils.hashcompat import md5_constructor +from django.utils.log import getLogger -logger = logging.getLogger('django.db.backends') +logger = getLogger('django.db.backends') class CursorDebugWrapper(object): def __init__(self, cursor, db): diff --git a/django/middleware/common.py b/django/middleware/common.py index 60af804925..2a45acfff8 100644 --- a/django/middleware/common.py +++ b/django/middleware/common.py @@ -1,4 +1,3 @@ -import logging import re from django.conf import settings @@ -7,8 +6,9 @@ from django.core.mail import mail_managers from django.utils.http import urlquote from django.core import urlresolvers from django.utils.hashcompat import md5_constructor +from django.utils.log import getLogger -logger = logging.getLogger('django.request') +logger = getLogger('django.request') class CommonMiddleware(object): diff --git a/django/middleware/csrf.py b/django/middleware/csrf.py index ed2a4f0e98..b88dd55a3d 100644 --- a/django/middleware/csrf.py +++ b/django/middleware/csrf.py @@ -6,7 +6,6 @@ against request forgeries from other sites. """ import itertools -import logging import re import random @@ -14,6 +13,7 @@ from django.conf import settings from django.core.urlresolvers import get_callable from django.utils.cache import patch_vary_headers from django.utils.hashcompat import md5_constructor +from django.utils.log import getLogger from django.utils.safestring import mark_safe _POST_FORM_RE = \ @@ -21,7 +21,7 @@ _POST_FORM_RE = \ _HTML_TYPES = ('text/html', 'application/xhtml+xml') -logger = logging.getLogger('django.request') +logger = getLogger('django.request') # Use the system (hardware-based) random number generator if it exists. if hasattr(random, 'SystemRandom'): diff --git a/django/utils/log.py b/django/utils/log.py index aece33bfac..b9d32e339b 100644 --- a/django/utils/log.py +++ b/django/utils/log.py @@ -1,4 +1,5 @@ import logging +import sys from django.core import mail # Make sure a NullHandler is available @@ -17,10 +18,32 @@ try: except ImportError: from django.utils.dictconfig import dictConfig +if sys.version_info < (2, 5): + class LoggerCompat(object): + def __init__(self, logger): + self._logger = logger + + def __getattr__(self, name): + val = getattr(self._logger, name) + if callable(val): + def _wrapper(*args, **kwargs): + # Python 2.4 logging module doesn't support 'extra' parameter to + # methods of Logger + kwargs.pop('extra', None) + return val(*args, **kwargs) + return _wrapper + else: + return val + + def getLogger(name=None): + return LoggerCompat(logging.getLogger(name=name)) +else: + getLogger = logging.getLogger + # Ensure the creation of the Django logger # with a null handler. This ensures we don't get any # 'No handlers could be found for logger "django"' messages -logger = logging.getLogger('django') +logger = getLogger('django') if not logger.handlers: logger.addHandler(NullHandler()) @@ -35,7 +58,14 @@ class AdminEmailHandler(logging.Handler): from django.conf import settings try: - request = record.request + if sys.version_info < (2,5): + # A nasty workaround required because Python 2.4's logging + # module doesn't support passing in extra context. + # For this handler, the only extra data we need is the + # request, and that's in the top stack frame. + request = record.exc_info[2].tb_frame.f_locals['request'] + else: + request = record.request subject = '%s (%s IP): %s' % ( record.levelname, diff --git a/django/views/decorators/http.py b/django/views/decorators/http.py index cb4c1aff21..b763d6ee92 100644 --- a/django/views/decorators/http.py +++ b/django/views/decorators/http.py @@ -10,16 +10,16 @@ except ImportError: from calendar import timegm from datetime import timedelta from email.Utils import formatdate -import logging from django.utils.decorators import decorator_from_middleware, available_attrs from django.utils.http import parse_etags, quote_etag +from django.utils.log import getLogger from django.middleware.http import ConditionalGetMiddleware from django.http import HttpResponseNotAllowed, HttpResponseNotModified, HttpResponse conditional_page = decorator_from_middleware(ConditionalGetMiddleware) -logger = logging.getLogger('django.request') +logger = getLogger('django.request') def require_http_methods(request_method_list): diff --git a/django/views/generic/simple.py b/django/views/generic/simple.py index abadef3629..7c38f07688 100644 --- a/django/views/generic/simple.py +++ b/django/views/generic/simple.py @@ -1,9 +1,8 @@ -import logging - from django.template import loader, RequestContext from django.http import HttpResponse, HttpResponseRedirect, HttpResponsePermanentRedirect, HttpResponseGone +from django.utils.log import getLogger -logger = logging.getLogger('django.request') +logger = getLogger('django.request') def direct_to_template(request, template, extra_context=None, mimetype=None, **kwargs): diff --git a/docs/topics/logging.txt b/docs/topics/logging.txt index 3d4dffe3e0..149bd0ae7a 100644 --- a/docs/topics/logging.txt +++ b/docs/topics/logging.txt @@ -411,6 +411,10 @@ Messages to this logger have the following extra context: * ``request``: The request object that generated the logging message. +.. note:: + Due to a limitation in the logging library, this extra + context is not available if you are using Python 2.4. + ``django.db.backends`` ~~~~~~~~~~~~~~~~~~~~~~ @@ -424,6 +428,10 @@ Messages to this logger have the following extra context: * ``sql``: The SQL statement that was executed. * ``params``: The parameters that were used in the SQL call. +.. note:: + Due to a limitation in the logging library, this extra + context is not available if you are using Python 2.4. + Handlers --------