diff --git a/reviewboard/admin/forms.py b/reviewboard/admin/forms.py
index 14a5ff73dd5bd6d6f070852e681f4a80072d431c..dca5d026df6032357754cd4eed5231d1638a24bd 100644
--- a/reviewboard/admin/forms.py
+++ b/reviewboard/admin/forms.py
@@ -40,7 +40,6 @@ from django.utils.six.moves.urllib.parse import urlparse
 from django.utils.translation import ugettext as _
 from djblets.cache.backend_compat import normalize_cache_backend
 from djblets.forms.fields import TimeZoneField
-from djblets.log import restart_logging
 from djblets.siteconfig.forms import SiteSettingsForm
 
 from reviewboard.accounts.forms.auth import LegacyAuthModuleSettingsForm
@@ -658,7 +657,6 @@ class LoggingSettingsForm(SiteSettingsForm):
 
         # Reload any important changes into the Django settings.
         load_site_config()
-        restart_logging()
 
     class Meta:
         title = _("Logging Settings")
diff --git a/reviewboard/admin/middleware.py b/reviewboard/admin/middleware.py
index dcdd3716a272e18d0068057e2e0c81d7ab8e7fe1..08079b66fa27886975db1b7978f8c4f35d74c358 100644
--- a/reviewboard/admin/middleware.py
+++ b/reviewboard/admin/middleware.py
@@ -18,6 +18,7 @@ except ImportError:
     class WSGIRequest:
         pass
 
+from djblets.siteconfig.models import SiteConfiguration
 
 from reviewboard import initialize
 from reviewboard.admin.checks import check_updates_required
@@ -42,11 +43,21 @@ class LoadSettingsMiddleware(object):
     Middleware that loads the settings on each request.
     """
     def process_request(self, request):
-        # Load all site settings.
-        siteconfig = load_site_config()
-
-        if (siteconfig and
-            siteconfig.settings.get('site_domain_method', 'http') == 'https'):
+        try:
+            siteconfig = SiteConfiguration.objects.get_current()
+        except Exception as e:
+            logging.critical('Unable to load SiteConfiguration: %s',
+                             e, exc_info=1)
+            return
+
+        # This will be unset if the SiteConfiguration expired, since we'll
+        # have a new one in the cache.
+        if not hasattr(siteconfig, '_rb_settings_loaded'):
+            # Load all site settings.
+            load_site_config(full_reload=True)
+            siteconfig._rb_settings_loaded = True
+
+        if siteconfig.settings.get('site_domain_method', 'http') == 'https':
             request.META['wsgi.url_scheme'] = 'https'
 
 
diff --git a/reviewboard/admin/siteconfig.py b/reviewboard/admin/siteconfig.py
index 53675eb71411850953f8d09e2797e8516c71d33c..9fd5f76b423f1a3a1a429a461b2613c3468a62ec 100644
--- a/reviewboard/admin/siteconfig.py
+++ b/reviewboard/admin/siteconfig.py
@@ -38,7 +38,7 @@ import re
 from django.conf import settings, global_settings
 from django.core.exceptions import ImproperlyConfigured
 from django.utils import six
-from djblets.log import siteconfig as log_siteconfig
+from djblets.log import restart_logging, siteconfig as log_siteconfig
 from djblets.siteconfig.django_settings import (apply_django_settings,
                                                 get_django_defaults,
                                                 get_django_settings_map)
@@ -164,7 +164,7 @@ defaults.update({
 })
 
 
-def load_site_config():
+def load_site_config(full_reload=False):
     """
     Loads any stored site configuration settings and populates the Django
     settings object with any that need to be there.
@@ -240,6 +240,10 @@ def load_site_config():
     # Populate the settings object with anything relevant from the siteconfig.
     apply_django_settings(siteconfig, settings_map)
 
+    if full_reload and not getattr(settings, 'RUNNING_TEST', False):
+        # Logging may have changed, so restart logging.
+        restart_logging()
+
     # Now for some more complicated stuff...
 
     update_haystack_settings()
