diff --git a/reviewboard/scmtools/clearcase.py b/reviewboard/scmtools/clearcase.py
index d2439ecd1492510d6c27af4e85f62d8f86e9d25b..7d6dcca4853beaf1c2a51cc222e95d568eea9d6b 100644
--- a/reviewboard/scmtools/clearcase.py
+++ b/reviewboard/scmtools/clearcase.py
@@ -26,6 +26,7 @@ else:
     import posixpath as cpath
 
 
+logger = logging.getLogger(__name__)
 _cleartool = None
 
 
@@ -47,7 +48,7 @@ def get_cleartool():
         if not _cleartool:
             _cleartool = 'cleartool'
 
-        logging.debug('Using cleartool %s', _cleartool)
+        logger.debug('Using cleartool %s', _cleartool)
 
     return _cleartool
 
@@ -146,7 +147,7 @@ class ClearCaseTool(SCMTool):
 
         cmdline = [get_cleartool()] + cmdline
 
-        logging.debug('Running %s', subprocess.list2cmdline(cmdline))
+        logger.debug('Running %s', subprocess.list2cmdline(cmdline))
 
         p = subprocess.Popen(
             cmdline,
@@ -539,8 +540,8 @@ class ClearCaseDiffParser(DiffParser):
             try:
                 info['origFile'] = self._oid2filename(m.group(1))
             except Exception:
-                logging.debug('oid (%s) not found, get filename from client',
-                              m.group(1))
+                logger.debug('oid (%s) not found, get filename from client',
+                             m.group(1))
                 info['origFile'] = self.client_relpath(current_filename)
 
             current_filename = info.get('newFile', '')
@@ -548,8 +549,8 @@ class ClearCaseDiffParser(DiffParser):
             try:
                 info['newFile'] = self._oid2filename(m.group(2))
             except Exception:
-                logging.debug('oid (%s) not found, get filename from client',
-                              m.group(2))
+                logger.debug('oid (%s) not found, get filename from client',
+                             m.group(2))
                 info['newFile'] = self.client_relpath(current_filename)
 
             linenum += 1
@@ -615,12 +616,12 @@ class ClearCaseDiffParser(DiffParser):
             revision = None
 
         relpath = ''
-        logging.debug('vobstag: %s, path: %s', self.vobstag, path)
+        logger.debug('vobstag: %s, path: %s', self.vobstag, path)
 
         while True:
             # An error should be raised if vobstag cannot be reached.
             if path == '/':
-                logging.debug('vobstag not found in path, use client filename')
+                logger.debug('vobstag not found in path, use client filename')
                 return filename
 
             # Vobstag reach, relpath can be returned.
@@ -635,7 +636,7 @@ class ClearCaseDiffParser(DiffParser):
             else:
                 relpath = os.path.join(basename, relpath)
 
-        logging.debug('relpath: %s', relpath)
+        logger.debug('relpath: %s', relpath)
 
         if revision:
             relpath = relpath + '@@' + revision
diff --git a/reviewboard/scmtools/core.py b/reviewboard/scmtools/core.py
index df588e37d7c7f5751c3cbe71bcde90a29f1e7eca..f43a51de0fc7c21a306258e8f28483375594be00 100644
--- a/reviewboard/scmtools/core.py
+++ b/reviewboard/scmtools/core.py
@@ -29,6 +29,9 @@ from reviewboard.ssh import utils as sshutils
 from reviewboard.ssh.errors import SSHAuthenticationError
 
 
+logger = logging.getLogger(__name__)
+
+
 class ChangeSet(object):
     """A server-side changeset.
 
@@ -1129,7 +1132,7 @@ class SCMTool(object):
         """
         if sshutils.is_ssh_uri(path):
             username, hostname = SCMTool.get_auth_from_uri(path, username)
-            logging.debug(
+            logger.debug(
                 "%s: Attempting ssh connection with host: %s, username: %s"
                 % (cls.__name__, hostname, username))
 
@@ -1345,7 +1348,7 @@ class SCMClient(object):
                 Unexpected error in fetching the file. This may be an
                 unexpected HTTP status code.
         """
-        logging.info('Fetching file from %s' % url)
+        logger.info('Fetching file from %s' % url)
 
         try:
             request = URLRequest(url)
@@ -1370,9 +1373,9 @@ class SCMClient(object):
             else:
                 msg = "HTTP error code %d when fetching file from %s: %s" % \
                       (e.code, url, e)
-                logging.error(msg)
+                logger.error(msg)
                 raise SCMError(msg)
         except Exception as e:
             msg = "Unexpected error fetching file from %s: %s" % (url, e)
-            logging.error(msg)
+            logger.error(msg)
             raise SCMError(msg)
diff --git a/reviewboard/scmtools/cvs.py b/reviewboard/scmtools/cvs.py
index 6be2810a8fb703e9a69b6162e96624e78d7cecf7..32315d73a3cee48361b2194da9fe8248317edbb7 100644
--- a/reviewboard/scmtools/cvs.py
+++ b/reviewboard/scmtools/cvs.py
@@ -23,6 +23,7 @@ from reviewboard.ssh import utils as sshutils
 from reviewboard.ssh.errors import SSHAuthenticationError, SSHError
 
 
+logger = logging.getLogger(__name__)
 sshutils.register_rbssh('CVS_RSH')
 
 
@@ -676,9 +677,9 @@ class CVSClient(object):
         errmsg = six.text_type(p.stderr.read())
 
         if p.wait() != 0:
-            logging.error('CVS repository validation failed for '
-                          'CVSROOT %s: %s',
-                          self.cvsroot, errmsg)
+            logger.error('CVS repository validation failed for '
+                         'CVSROOT %s: %s',
+                         self.cvsroot, errmsg)
 
             auth_failed_prefix = 'cvs version: authorization failed: '
 
diff --git a/reviewboard/scmtools/forms.py b/reviewboard/scmtools/forms.py
index 6775dd803def9700bb0897328e4d161af5776cb7..6770759c0dc1701c28ed7b1fa3c9779aa5a798dc 100644
--- a/reviewboard/scmtools/forms.py
+++ b/reviewboard/scmtools/forms.py
@@ -927,8 +927,8 @@ class RepositoryForm(LocalSiteAwareModelFormMixin, forms.ModelForm):
                                   local_site=self.local_site,
                                   prefix=hosting_service_id)
             except Exception as e:
-                logging.exception('Error loading hosting service %s: %s',
-                                  hosting_service_id, e)
+                logger.exception('Error loading hosting service %s: %s',
+                                 hosting_service_id, e)
 
         for class_name, cls in six.iteritems(FAKE_HOSTING_SERVICES):
             if class_name not in hosting_services:
@@ -981,8 +981,8 @@ class RepositoryForm(LocalSiteAwareModelFormMixin, forms.ModelForm):
                 self._load_scmtool(scmtool_cls=scmtool_cls,
                                    is_active=is_tool_active)
             except Exception as e:
-                logging.exception('Error loading SCMTool %s: %s',
-                                  tool.class_name, e)
+                logger.exception('Error loading SCMTool %s: %s',
+                                 tool.class_name, e)
                 continue
 
             self.tool_models_by_id[scmtool_id] = tool
@@ -1934,8 +1934,8 @@ class RepositoryForm(LocalSiteAwareModelFormMixin, forms.ModelForm):
             if not hosting_service.is_ssh_key_associated(repository, key):
                 hosting_service.associate_ssh_key(repository, key)
         except SSHKeyAssociationError as e:
-            logging.warning('SSHKeyAssociationError for repository "%s" (%s)'
-                            % (repository, e.message))
+            logger.warning('SSHKeyAssociationError for repository "%s" (%s)'
+                           % (repository, e.message))
             raise ValidationError([
                 _('Unable to associate SSH key with your hosting service. '
                   'This is most often the result of a problem communicating '
@@ -2359,7 +2359,7 @@ class RepositoryForm(LocalSiteAwareModelFormMixin, forms.ModelForm):
                 raise ValidationError(six.text_type(e),
                                       code='repo_auth_failed')
             except Exception as e:
-                logging.exception(
+                logger.exception(
                     'Unexpected exception while verifying repository path for '
                     'hosting service %r using plan %r and tool %r: %s',
                     hosting_service, plan, tool, e)
diff --git a/reviewboard/scmtools/git.py b/reviewboard/scmtools/git.py
index 40c4e6df41d909d52ecbca7921e88e90f924873c..1568b619c2ef2246e8f2e1ab4545dd2021772a4c 100644
--- a/reviewboard/scmtools/git.py
+++ b/reviewboard/scmtools/git.py
@@ -26,6 +26,7 @@ from reviewboard.scmtools.errors import (FileNotFoundError,
 from reviewboard.ssh import utils as sshutils
 
 
+logger = logging.getLogger(__name__)
 GIT_DIFF_EMPTY_CHANGESET_SIZE = 3
 
 
@@ -684,8 +685,8 @@ class GitClient(SCMClient):
         failure = p.wait()
 
         if failure:
-            logging.error("Git: Failed to find valid repository %s: %s" %
-                          (self.path, errmsg))
+            logger.error("Git: Failed to find valid repository %s: %s" %
+                         (self.path, errmsg))
             return False
 
         return True
diff --git a/reviewboard/scmtools/hg.py b/reviewboard/scmtools/hg.py
index 8c57e3ed209fbdb064bb90d00b084e94c17ae749..f30e8103d92e09bcc0fadfc7480ba8b777a6f63f 100644
--- a/reviewboard/scmtools/hg.py
+++ b/reviewboard/scmtools/hg.py
@@ -17,6 +17,9 @@ from reviewboard.scmtools.errors import SCMError
 from reviewboard.scmtools.git import GitDiffParser
 
 
+logger = logging.getLogger(__name__)
+
+
 class HgTool(SCMTool):
     scmtool_id = 'mercurial'
     name = "Mercurial"
@@ -380,8 +383,8 @@ class HgWebClient(SCMClient):
                                           password=password)
 
         self.path_stripped = self.path.rstrip('/')
-        logging.debug('Initialized HgWebClient with url=%r, username=%r',
-                      self.path, self.username)
+        logger.debug('Initialized HgWebClient with url=%r, username=%r',
+                     self.path, self.username)
 
     def cat_file(self, path, rev='tip', base_commit_id=None):
         # If the base commit id is provided it should override anything
@@ -422,7 +425,7 @@ class HgWebClient(SCMClient):
         try:
             rsp = self._get_http_json('%s/json-branches' % self.path_stripped)
         except Exception as e:
-            logging.exception('Cannot load branches from hgweb: %s', e)
+            logger.exception('Cannot load branches from hgweb: %s', e)
             return results
 
         if rsp:
@@ -454,8 +457,8 @@ class HgWebClient(SCMClient):
             rsp = self._get_http_json('%s/json-rev/%s'
                                       % (self.path_stripped, revision))
         except Exception as e:
-            logging.exception('Cannot load detail of changeset from hgweb: %s',
-                              e)
+            logger.exception('Cannot load detail of changeset from hgweb: %s',
+                             e)
             return None
 
         if not rsp:
@@ -501,7 +504,7 @@ class HgWebClient(SCMClient):
             rsp = self._get_http_json('%s/json-log/?rev=%s'
                                       % (self.path_stripped, query))
         except Exception as e:
-            logging.exception('Cannot load commits from hgweb: %s', e)
+            logger.exception('Cannot load commits from hgweb: %s', e)
             return []
 
         results = []
@@ -542,7 +545,7 @@ class HgWebClient(SCMClient):
                 path='',
                 revision='')
         except Exception as e:
-            logging.exception('Cannot load patch from hgweb: %s', e)
+            logger.exception('Cannot load patch from hgweb: %s', e)
             raise SCMError('Cannot load patch from hgweb')
 
         if contents:
@@ -552,7 +555,7 @@ class HgWebClient(SCMClient):
                 changeset.diff = contents
                 return changeset
 
-        logging.error('Cannot load changeset %s from hgweb', revision)
+        logger.error('Cannot load changeset %s from hgweb', revision)
         raise SCMError('Cannot load changeset %s from hgweb' % revision)
 
     def _get_http_json(self, url):
@@ -750,7 +753,7 @@ class HgClient(SCMClient):
         hg_ssh = self._get_hg_config('ui.ssh')
 
         if not hg_ssh:
-            logging.debug('Using rbssh for mercurial')
+            logger.debug('Using rbssh for mercurial')
 
             if self.local_site_name:
                 hg_ssh = 'rbssh --rb-local-site=%s' % self.local_site_name
@@ -761,7 +764,7 @@ class HgClient(SCMClient):
                 '--config', 'ui.ssh=%s' % hg_ssh,
             ])
         else:
-            logging.debug('Found configured ssh for mercurial: %s' % hg_ssh)
+            logger.debug('Found configured ssh for mercurial: %s' % hg_ssh)
 
     def _get_hg_config(self, config_name):
         p = self._run_hg(['showconfig', config_name])
diff --git a/reviewboard/scmtools/managers.py b/reviewboard/scmtools/managers.py
index 86408bf8f9cbf8955f046e68ef9bb325ff17695a..5063c2929718eb406442545362746c42e2bbc3c6 100644
--- a/reviewboard/scmtools/managers.py
+++ b/reviewboard/scmtools/managers.py
@@ -122,8 +122,8 @@ class ToolManager(Manager):
             try:
                 scmtool_class = entry.load()
             except Exception as e:
-                logging.exception('Unable to load SCMTool %s: %s',
-                                  entry, e)
+                logger.exception('Unable to load SCMTool %s: %s',
+                                 entry, e)
                 continue
 
             class_name = '%s.%s' % (scmtool_class.__module__,
diff --git a/reviewboard/scmtools/models.py b/reviewboard/scmtools/models.py
index fe618e56b0766bec81824a303aec623241395e37..5e9e142d2df2ccf70173159ab9e94d797a57286b 100644
--- a/reviewboard/scmtools/models.py
+++ b/reviewboard/scmtools/models.py
@@ -32,6 +32,9 @@ from reviewboard.scmtools.signals import (checked_file_exists,
 from reviewboard.site.models import LocalSite
 
 
+logger = logging.getLogger(__name__)
+
+
 @python_2_unicode_compatible
 class Tool(models.Model):
     """A configured source code management tool.
@@ -520,7 +523,7 @@ class Repository(models.Model):
                 s = ('Unable to generate a unique hooks UUID for '
                      'repository %s after %d attempts'
                      % (self.pk, max_attempts))
-                logging.error(s)
+                logger.error(s)
                 raise Exception(s)
 
         return self.hooks_uuid
diff --git a/reviewboard/scmtools/perforce.py b/reviewboard/scmtools/perforce.py
index 63de365b581cbdef3be42fb367218d4a6719aa11..1899a1ad0204033969ae8f9abdbd99b190519ad0 100644
--- a/reviewboard/scmtools/perforce.py
+++ b/reviewboard/scmtools/perforce.py
@@ -33,6 +33,9 @@ from reviewboard.scmtools.errors import (SCMError, EmptyChangeSetError,
                                          UnverifiedCertificateError)
 
 
+logger = logging.getLogger(__name__)
+
+
 class STunnelProxy(object):
     """Secure Perforce communication proxy using stunnel.
 
@@ -157,12 +160,12 @@ class STunnelProxy(object):
         except subprocess.CalledProcessError:
             if self.stunnel_use_config:
                 with open(conf_filename, 'r') as fp:
-                    logging.error('Unable to create an stunnel using '
-                                  'config:\n%s\n'
-                                  % fp.read())
+                    logger.error('Unable to create an stunnel using '
+                                 'config:\n%s\n'
+                                 % fp.read())
             else:
-                logging.error('Unable to create an stunnel with args: %s\n'
-                              % ' '.join(args))
+                logger.error('Unable to create an stunnel with args: %s\n'
+                             % ' '.join(args))
         else:
             # It can sometimes be racy to immediately open the file. We
             # therefore have to wait a fraction of a second =/
@@ -173,8 +176,8 @@ class STunnelProxy(object):
                     self.pid = int(f.read())
                     f.close()
             except IOError as e:
-                logging.exception('Unable to open stunnel PID file %s: %s\n'
-                                  % (pid_filename, e))
+                logger.exception('Unable to open stunnel PID file %s: %s\n'
+                                 % (pid_filename, e))
 
         shutil.rmtree(tempdir)
 
@@ -320,13 +323,13 @@ class PerforceClient(object):
         ticket_status = self.get_ticket_status()
 
         if not ticket_status or ticket_status['user'] != self.username:
-            logging.info('Perforce ticket for host "%s" (user "%s") does not '
-                         'exist or has expired. Refreshing...',
-                         self.p4port, self.username)
+            logger.info('Perforce ticket for host "%s" (user "%s") does not '
+                        'exist or has expired. Refreshing...',
+                        self.p4port, self.username)
         elif ticket_status['expiration_secs'] < self.TICKET_RENEWAL_SECS:
-            logging.info('Perforce ticket for host "%s" (user "%s") will soon '
-                         'expire. Refreshing...',
-                         self.p4port, self.username)
+            logger.info('Perforce ticket for host "%s" (user "%s") will soon '
+                        'expire. Refreshing...',
+                        self.p4port, self.username)
         else:
             # The ticket is fine. We don't need to log in again.
             return
@@ -339,8 +342,8 @@ class PerforceClient(object):
         If there's an existing ticket, this will extend the ticket instead
         of creating a new one.
         """
-        logging.info('Logging into Perforce host "%s" (user "%s")',
-                     self.p4port, self.username)
+        logger.info('Logging into Perforce host "%s" (user "%s")',
+                    self.p4port, self.username)
 
         self.p4.password = force_str(self.password)
         self.p4.run_login()
@@ -408,9 +411,9 @@ class PerforceClient(object):
                 try:
                     os.makedirs(tickets_dir, 0o700)
                 except Exception as e:
-                    logging.warning('Unable to create Perforce tickets '
-                                    'directory %s: %s',
-                                    tickets_dir, e)
+                    logger.warning('Unable to create Perforce tickets '
+                                   'directory %s: %s',
+                                   tickets_dir, e)
                     tickets_dir = None
 
             if tickets_dir:
@@ -530,9 +533,9 @@ class PerforceClient(object):
                 change = self.p4.run_change('-o', '-O', changeset_id)
                 changeset_id = change[0]['Change']
             except Exception as e:
-                logging.warning('Failed to get updated changeset information '
-                                'for CLN %s (%s): %s',
-                                changeset_id, self.p4port, e, exc_info=True)
+                logger.warning('Failed to get updated changeset information '
+                               'for CLN %s (%s): %s',
+                               changeset_id, self.p4port, e, exc_info=True)
 
             return self.p4.run_describe('-s', changeset_id)
 
diff --git a/reviewboard/scmtools/plastic.py b/reviewboard/scmtools/plastic.py
index 3bc23dbba2abe0535cd65b726f47d65baa8e1707..346c7030fa77fd0e3ed95ab3fba19f6b43dc0c25 100644
--- a/reviewboard/scmtools/plastic.py
+++ b/reviewboard/scmtools/plastic.py
@@ -17,6 +17,9 @@ from reviewboard.scmtools.errors import (SCMError, FileNotFoundError,
 from reviewboard.diffviewer.parser import DiffParser
 
 
+logger = logging.getLogger(__name__)
+
+
 class PlasticTool(SCMTool):
     scmtool_id = 'plastic'
     name = "Plastic SCM"
@@ -45,10 +48,10 @@ class PlasticTool(SCMTool):
                                     self.hostname, self.port)
 
     def get_changeset(self, changesetid, allow_empty=False):
-        logging.debug('Plastic: get_changeset %s' % (changesetid))
+        logger.debug('Plastic: get_changeset %s' % (changesetid))
 
         changesetdata = self.client.get_changeset(changesetid)
-        logging.debug('Plastic: changesetdata %s' % (changesetdata))
+        logger.debug('Plastic: changesetdata %s' % (changesetdata))
 
         # Changeset data is in the form of multiple lines of:
         # <changesetid> <user> <revid> <file spec>
@@ -66,31 +69,31 @@ class PlasticTool(SCMTool):
         changeset.username = m.group("user")
         changeset.summary = self.client.get_changeset_comment(changesetid,
                                                               revid)
-        logging.debug('Plastic: changeset user %s summary %s' %
-                      (changeset.username, changeset.summary))
+        logger.debug('Plastic: changeset user %s summary %s' %
+                     (changeset.username, changeset.summary))
 
         for line in split:
             if line:
                 m = self.CS_RE.match(line)
 
                 if not m:
-                    logging.debug('Plastic: bad re %s failed to match %s' %
-                                  (self.CS_RE, line))
+                    logger.debug('Plastic: bad re %s failed to match %s' %
+                                 (self.CS_RE, line))
                     raise SCMError("Error looking up changeset")
 
                 if m.group("csid") != six.text_type(changesetid):
-                    logging.debug('Plastic: csid %s != %s' % (m.group("csid"),
-                                                              changesetid))
+                    logger.debug('Plastic: csid %s != %s' % (m.group("csid"),
+                                                            changesetid))
                     raise SCMError('The server returned a changeset ID that '
                                    'was not requested')
 
-                logging.debug('Plastic: adding file %s' % (m.group("file")))
+                logger.debug('Plastic: adding file %s' % (m.group("file")))
                 changeset.files += m.group("file")
 
         return changeset
 
     def get_file(self, path, revision=HEAD, **kwargs):
-        logging.debug('Plastic: get_file %s revision %s' % (path, revision))
+        logger.debug('Plastic: get_file %s revision %s' % (path, revision))
 
         if revision == PRE_CREATION:
             return b''
@@ -102,7 +105,7 @@ class PlasticTool(SCMTool):
         return self.client.get_file(path, revision)
 
     def file_exists(self, path, revision=HEAD, **kwargs):
-        logging.debug('Plastic: file_exists %s revision %s' % (path, revision))
+        logger.debug('Plastic: file_exists %s revision %s' % (path, revision))
 
         if revision == PRE_CREATION:
             return True
@@ -145,8 +148,8 @@ class PlasticTool(SCMTool):
         assert isinstance(revision, bytes), (
             'revision must be a byte string, not %s' % type(revision))
 
-        logging.debug('Plastic: parse_diff_revision file %s revision %s' %
-                      (file_str, revision_str))
+        logger.debug('Plastic: parse_diff_revision file %s revision %s' %
+                     (file_str, revision_str))
 
         if revision == b'PRE-CREATION':
             revision = PRE_CREATION
@@ -183,8 +186,8 @@ class PlasticTool(SCMTool):
         server = "%s:%s" % (m.group("hostname"), m.group("port"))
         reponame = m.group("reponame")
 
-        logging.debug('Plastic: Checking repository %s@%s' %
-                      (reponame, server))
+        logger.debug('Plastic: Checking repository %s@%s' %
+                     (reponame, server))
 
         repositories = PlasticClient.get_repositories(server)
         split = repositories.splitlines()
@@ -246,7 +249,7 @@ class PlasticClient(object):
         self.port = port
 
     def get_file(self, path, revision):
-        logging.debug('Plastic: get_file %s rev %s' % (path, revision))
+        logger.debug('Plastic: get_file %s rev %s' % (path, revision))
 
         repo = "rep:%s@repserver:%s:%s" % (self.reponame, self.hostname,
                                            self.port)
@@ -276,7 +279,7 @@ class PlasticClient(object):
         return contents
 
     def get_changeset(self, changesetid):
-        logging.debug('Plastic: get_changeset %s' % (changesetid))
+        logger.debug('Plastic: get_changeset %s' % (changesetid))
 
         repo = "rep:%s@repserver:%s:%s" % (self.reponame, self.hostname,
                                            self.port)
@@ -298,7 +301,7 @@ class PlasticClient(object):
         return contents
 
     def get_changeset_comment(self, changesetid, revid):
-        logging.debug('Plastic: get_changeset_comment %s' % (changesetid))
+        logger.debug('Plastic: get_changeset_comment %s' % (changesetid))
 
         repo = "rep:%s@repserver:%s:%s" % (self.reponame, self.hostname,
                                            self.port)
@@ -320,7 +323,7 @@ class PlasticClient(object):
 
     @classmethod
     def get_repositories(cls, server):
-        logging.debug('Plastic: get_repositories %s' % (server))
+        logger.debug('Plastic: get_repositories %s' % (server))
 
         p = subprocess.Popen(['cm', 'listrepositories', server],
                              stderr=subprocess.PIPE, stdout=subprocess.PIPE,
diff --git a/reviewboard/scmtools/svn/__init__.py b/reviewboard/scmtools/svn/__init__.py
index 43785d914fc96855393cd1c6ee8a1ba8587e3d7f..a412e691afc647b0b258fb8b6721731b7b7de54f 100644
--- a/reviewboard/scmtools/svn/__init__.py
+++ b/reviewboard/scmtools/svn/__init__.py
@@ -27,6 +27,9 @@ from reviewboard.scmtools.svn.utils import (collapse_svn_keywords,
 from reviewboard.ssh import utils as sshutils
 
 
+logger = logging.getLogger(__name__)
+
+
 # These will be set later in recompute_svn_backend().
 Client = None
 has_svn_backend = False
@@ -398,8 +401,8 @@ class SVNTool(SCMTool):
 
     @staticmethod
     def on_ssl_failure(e, path, cert_data):
-        logging.error('SVN: Failed to get repository information '
-                      'for %s: %s' % (path, e))
+        logger.error('SVN: Failed to get repository information '
+                     'for %s: %s' % (path, e))
 
         error = SVNTool.normalize_error(e)
 
@@ -726,8 +729,8 @@ def recompute_svn_backend():
             # Check that this is a valid SVN backend.
             if (not hasattr(mod, 'has_svn_backend') or
                 not hasattr(mod, 'Client')):
-                logging.error('Attempted to load invalid SVN backend %s',
-                              backend_path)
+                logger.error('Attempted to load invalid SVN backend %s',
+                             backend_path)
                 continue
 
             has_svn_backend = mod.has_svn_backend
@@ -739,11 +742,11 @@ def recompute_svn_backend():
 
             if has_svn_backend:
                 # We found a suitable backend.
-                logging.info('Using %s backend for SVN', backend_path)
+                logger.info('Using %s backend for SVN', backend_path)
                 Client = mod.Client
                 break
         except ImportError:
-            logging.error('Unable to load SVN backend %s',
-                          backend_path, exc_info=1)
+            logger.error('Unable to load SVN backend %s',
+                         backend_path, exc_info=1)
 
 recompute_svn_backend()
diff --git a/reviewboard/scmtools/svn/pysvn.py b/reviewboard/scmtools/svn/pysvn.py
index 129ca6fba81ab0c11e3baf16aef9220b8393040b..90138f793e24a711800b5718ddfa45b7a42b768c 100644
--- a/reviewboard/scmtools/svn/pysvn.py
+++ b/reviewboard/scmtools/svn/pysvn.py
@@ -29,6 +29,8 @@ from reviewboard.scmtools.svn import base, SVNTool
 from reviewboard.scmtools.svn.utils import (collapse_svn_keywords,
                                             has_expanded_svn_keywords)
 
+logger = logging.getLogger(__name__)
+
 
 class Client(base.Client):
     required_module = 'pysvn'
@@ -164,8 +166,8 @@ class Client(base.Client):
 
         try:
             info = self.client.info2(path, recurse=False)
-            logging.debug('SVN: Got repository information for %s: %s' %
-                          (path, info))
+            logger.debug('SVN: Got repository information for %s: %s' %
+                         (path, info))
         except ClientError as e:
             if on_failure:
                 on_failure(e, path, cert)
@@ -257,9 +259,9 @@ class Client(base.Client):
                 header_encoding='UTF-8',
                 diff_options=['-u']))
         except Exception as e:
-            logging.error('Failed to generate diff using pysvn for revisions '
-                          '%s:%s for path %s: %s',
-                          revision1, revision2, path, e, exc_info=1)
+            logger.error('Failed to generate diff using pysvn for revisions '
+                         '%s:%s for path %s: %s',
+                         revision1, revision2, path, e, exc_info=1)
             raise SCMError(
                 _('Unable to get diff revisions %s through %s: %s')
                 % (revision1, revision2, e))
diff --git a/reviewboard/scmtools/svn/subvertpy.py b/reviewboard/scmtools/svn/subvertpy.py
index 7dec677889b85f93933a5ec5eda22f6c404a6a45..3c6c83c2753f3b3d08b80104ed78687928e82050 100644
--- a/reviewboard/scmtools/svn/subvertpy.py
+++ b/reviewboard/scmtools/svn/subvertpy.py
@@ -33,6 +33,8 @@ from reviewboard.scmtools.svn.utils import (collapse_svn_keywords,
                                             has_expanded_svn_keywords)
 
 
+logger = logging.getLogger(__name__)
+
 
 class Client(base.Client):
     """Subvertpy-backed Subversion client."""
@@ -316,8 +318,8 @@ class Client(base.Client):
 
         try:
             info = client.info(path)
-            logging.debug('SVN: Got repository information for %s: %s' %
-                          (path, info))
+            logger.debug('SVN: Got repository information for %s: %s' %
+                         (path, info))
         except SubversionException as e:
             if on_failure:
                 on_failure(e, path, cert)
@@ -432,9 +434,9 @@ class Client(base.Client):
 
             diff = out.read()
         except Exception as e:
-            logging.error('Failed to generate diff using subvertpy for '
-                          'revisions %s:%s for path %s: %s',
-                          revision1, revision2, path, e, exc_info=1)
+            logger.error('Failed to generate diff using subvertpy for '
+                         'revisions %s:%s for path %s: %s',
+                         revision1, revision2, path, e, exc_info=1)
             raise SCMError(
                 _('Unable to get diff revisions %s through %s: %s')
                 % (revision1, revision2, e))
