diff --git a/django/test/utils.py b/django/test/utils.py
index ed5ab59..b97d98f 100644
--- a/django/test/utils.py
+++ b/django/test/utils.py
@@ -1,6 +1,9 @@
 from __future__ import with_statement
 
+from contextlib import contextmanager
+import logging
 import warnings
+
 from django.conf import settings, UserSettingsHolder
 from django.core import mail
 from django.test.signals import template_rendered, setting_changed
@@ -221,3 +224,23 @@ class override_settings(object):
             setting_changed.send(sender=settings._wrapped.__class__,
                                  setting=key, value=new_value)
 
+
+@contextmanager
+def capture_logging(logger_name=''):
+    """
+    Temporarily redirect logging to a buffer (list)
+    """
+    logger = logging.getLogger(logger_name)
+    saved_handlers = logger.handlers[:]
+    for handler in logger.handlers:
+        logger.removeHandler(handler)
+    capture_handler = logging.handlers.MemoryHandler(100)
+    logger.addHandler(capture_handler)
+
+    try:
+        yield capture_handler.buffer
+    finally:
+        logger.removeHandler(capture_handler)
+        capture_handler.close()
+        for handler in saved_handlers:
+            logger.addHandler(handler)
diff --git a/docs/topics/testing.txt b/docs/topics/testing.txt
index 829e059..43892e9 100644
--- a/docs/topics/testing.txt
+++ b/docs/topics/testing.txt
@@ -1837,6 +1837,30 @@ under MySQL with MyISAM tables)::
         def test_transaction_behavior(self):
             # ... conditional test code
 
+Capturing logging during tests
+------------------------------
+
+.. versionadded:: 1.5
+
+.. currentmodule:: django.test
+
+.. function:: capture_logging(logger_name='')
+
+Django provides the ``capture_logging`` context manager as a way to allow you
+to capture the logging output during some tests. You can then access the
+logged content in the captured variable, as a list of
+:py:class:`LogRecord <logging.LogRecord>` objects.  Here's a usage example::
+
+    from django.test.utils import capture_logging
+
+    class MyTests(TestCase):
+        def test_containing_logging(self):
+            with capture_logging('logger.name') as log:
+                # ... Do stuff that output logging content
+                # ... Now output is a StringIO instance that contains logging output
+                self.assertEqual(log[0].msg, "First logging content")
+
+
 Live test server
 ----------------
 
diff --git a/tests/regressiontests/test_utils/tests.py b/tests/regressiontests/test_utils/tests.py
index 7f4208c..9e5c2bc 100644
--- a/tests/regressiontests/test_utils/tests.py
+++ b/tests/regressiontests/test_utils/tests.py
@@ -1,5 +1,6 @@
 # -*- coding: utf-8 -*-
 from __future__ import with_statement, absolute_import
+import logging
 
 from django.forms import EmailField, IntegerField
 from django.http import HttpResponse
@@ -562,3 +563,25 @@ __test__ = {"API_TEST": r"""
 '<foo bbb="2.0" aaa="1.0">Hello</foo><bar ddd="4.0" ccc="3.0"></bar>'
 
 """}
+
+
+class CaptureLoggingTests(SimpleTestCase):
+    def test_capture_logging(self):
+        from django.test.utils import capture_logging
+
+        logger = logging.getLogger('django.request')
+        previous_handlers = logger.handlers[:]
+        with capture_logging('django.request') as log:
+            logger.error("This is a test log output")
+            self.assertEqual(log[0].msg, "This is a test log output")
+
+        # Test that original handlers are restored
+        self.assertEqual(logger.handlers, previous_handlers)
+
+    def test_capture_root_logger(self):
+        from django.test.utils import capture_logging
+
+        with capture_logging() as log:
+            logging.warn("This is a test log output")
+            self.assertEqual((log[0].levelno, log[0].msg),
+                (logging.WARNING, "This is a test log output"))
