diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/HttpPluginServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/HttpPluginServlet.java
index 55fa0cb..b64b3b3 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/HttpPluginServlet.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/HttpPluginServlet.java
@@ -190,7 +190,7 @@
       try {
         filter = plugin.getHttpInjector().getInstance(GuiceFilter.class);
       } catch (RuntimeException e) {
-        log.warn(String.format("Plugin %s cannot load GuiceFilter", name), e);
+        log.warn("Plugin {} cannot load GuiceFilter", name, e);
         return null;
       }
 
@@ -198,7 +198,7 @@
         ServletContext ctx = PluginServletContext.create(plugin, wrapper.getFullPath(name));
         filter.init(new WrappedFilterConfig(ctx));
       } catch (ServletException e) {
-        log.warn(String.format("Plugin %s failed to initialize HTTP", name), e);
+        log.warn("Plugin {} failed to initialize HTTP", name, e);
         return null;
       }
 
@@ -429,10 +429,11 @@
               && size.isPresent()) {
             if (size.get() <= 0 || size.get() > SMALL_RESOURCE) {
               log.warn(
-                  String.format(
-                      "Plugin %s: %s omitted from document index. "
-                          + "Size %d out of range (0,%d).",
-                      pluginName, name.substring(prefix.length()), size.get(), SMALL_RESOURCE));
+                  "Plugin {}: {} omitted from document index. Size {} out of range (0,{}).",
+                  pluginName,
+                  name.substring(prefix.length()),
+                  size.get(),
+                  SMALL_RESOURCE);
               return false;
             }
             return true;
@@ -455,9 +456,9 @@
           about = entry;
         } else {
           log.warn(
-              String.format(
-                  "Plugin %s: Multiple 'about' documents found; using %s",
-                  pluginName, about.getName().substring(prefix.length())));
+              "Plugin {}: Multiple 'about' documents found; using {}",
+              pluginName,
+              about.getName().substring(prefix.length()));
         }
       } else {
         docs.add(entry);
@@ -731,9 +732,7 @@
         }
         return def;
       } catch (IOException e) {
-        log.warn(
-            String.format("Error getting %s for plugin %s, using default", attr, plugin.getName()),
-            e);
+        log.warn("Error getting {} for plugin {}, using default", attr, plugin.getName(), e);
         return null;
       }
     }
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/LfsPluginServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/LfsPluginServlet.java
index 7e013e6..e13ea95 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/LfsPluginServlet.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/LfsPluginServlet.java
@@ -139,7 +139,7 @@
       try {
         guiceFilter = plugin.getHttpInjector().getInstance(GuiceFilter.class);
       } catch (RuntimeException e) {
-        log.warn(String.format("Plugin %s cannot load GuiceFilter", name), e);
+        log.warn("Plugin {} cannot load GuiceFilter", name, e);
         return null;
       }
 
@@ -147,7 +147,7 @@
         ServletContext ctx = PluginServletContext.create(plugin, "/");
         guiceFilter.init(new WrappedFilterConfig(ctx));
       } catch (ServletException e) {
-        log.warn(String.format("Plugin %s failed to initialize HTTP", name), e);
+        log.warn("Plugin {} failed to initialize HTTP", name, e);
         return null;
       }
 
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/PluginServletContext.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/PluginServletContext.java
index 53b49a4..8f64d9f 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/PluginServletContext.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/PluginServletContext.java
@@ -155,7 +155,7 @@
 
     @Override
     public void log(String msg, Throwable reason) {
-      log.warn(String.format("[plugin %s] %s", plugin.getName(), msg), reason);
+      log.warn("[plugin {}] {}", plugin.getName(), msg, reason);
     }
 
     @Override
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/ResourceServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/ResourceServlet.java
index 2b34f81..3ca1878 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/ResourceServlet.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/ResourceServlet.java
@@ -161,7 +161,7 @@
         r = cache.get(p, newLoader(p));
       }
     } catch (ExecutionException e) {
-      log.warn("Cannot load static resource " + req.getPathInfo(), e);
+      log.warn("Cannot load static resource {}", req.getPathInfo(), e);
       CacheHeaders.setNotCacheable(rsp);
       rsp.setStatus(SC_INTERNAL_SERVER_ERROR);
       return;
@@ -214,12 +214,12 @@
     try {
       Path p = getResourcePath(name);
       if (p == null) {
-        log.warn(String.format("Path doesn't exist %s", name));
+        log.warn("Path doesn't exist {}", name);
         return null;
       }
       return cache.get(p, newLoader(p));
     } catch (ExecutionException | IOException e) {
-      log.warn(String.format("Cannot load static resource %s", name), e);
+      log.warn("Cannot load static resource {}", name, e);
       return null;
     }
   }
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/RestApiServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/RestApiServlet.java
index d9dd5d4..bfa91d6 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/RestApiServlet.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/RestApiServlet.java
@@ -1094,7 +1094,7 @@
     if (!Strings.isNullOrEmpty(req.getQueryString())) {
       uri += "?" + req.getQueryString();
     }
-    log.error(String.format("Error in %s %s", req.getMethod(), uri), err);
+    log.error("Error in {} {}", req.getMethod(), uri, err);
 
     if (!res.isCommitted()) {
       res.reset();
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/SwitchSecureStore.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/SwitchSecureStore.java
index 58876ce..1a22162 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/SwitchSecureStore.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/SwitchSecureStore.java
@@ -68,7 +68,7 @@
     SitePaths sitePaths = new SitePaths(getSitePath());
     Path newSecureStorePath = Paths.get(newSecureStoreLib);
     if (!Files.exists(newSecureStorePath)) {
-      log.error(String.format("File %s doesn't exist", newSecureStorePath.toAbsolutePath()));
+      log.error("File {} doesn't exist", newSecureStorePath.toAbsolutePath());
       return -1;
     }
 
@@ -77,8 +77,7 @@
 
     if (currentSecureStoreName.equals(newSecureStore)) {
       log.error(
-          "Old and new SecureStore implementation names "
-              + "are the same. Migration will not work");
+          "Old and new SecureStore implementation names are the same. Migration will not work");
       return -1;
     }
 
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/HiddenErrorHandler.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/HiddenErrorHandler.java
index 4c2455a..2fbbb97 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/HiddenErrorHandler.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/HiddenErrorHandler.java
@@ -79,7 +79,7 @@
       if (!Strings.isNullOrEmpty(req.getQueryString())) {
         uri += "?" + req.getQueryString();
       }
-      log.error(String.format("Error in %s %s", req.getMethod(), uri), err);
+      log.error("Error in {} {}", req.getMethod(), uri, err);
     }
   }
 }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/WebLinks.java b/gerrit-server/src/main/java/com/google/gerrit/server/WebLinks.java
index 0566804..4ca77bc 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/WebLinks.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/WebLinks.java
@@ -49,7 +49,7 @@
         if (link == null) {
           return false;
         } else if (Strings.isNullOrEmpty(link.name) || Strings.isNullOrEmpty(link.url)) {
-          log.warn(String.format("%s is missing name and/or url", link.getClass().getName()));
+          log.warn("{} is missing name and/or url", link.getClass().getName());
           return false;
         }
         return true;
@@ -60,7 +60,7 @@
         if (link == null) {
           return false;
         } else if (Strings.isNullOrEmpty(link.name) || Strings.isNullOrEmpty(link.url)) {
-          log.warn(String.format("%s is missing name and/or url", link.getClass().getName()));
+          log.warn("{} is missing name and/or url", link.getClass().getName());
           return false;
         }
         return true;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupCacheImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupCacheImpl.java
index effaa8d..06a4680 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupCacheImpl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/GroupCacheImpl.java
@@ -92,7 +92,7 @@
       Optional<AccountGroup> g = byId.get(groupId);
       return g.isPresent() ? g.get() : missing(groupId);
     } catch (ExecutionException e) {
-      log.warn("Cannot load group " + groupId, e);
+      log.warn("Cannot load group {}", groupId, e);
       return missing(groupId);
     }
   }
@@ -131,7 +131,7 @@
     try {
       return byName.get(name.get()).orElse(null);
     } catch (ExecutionException e) {
-      log.warn(String.format("Cannot lookup group %s by name", name.get()), e);
+      log.warn("Cannot lookup group {} by name", name.get(), e);
       return null;
     }
   }
@@ -144,7 +144,7 @@
     try {
       return byUUID.get(uuid.get()).orElse(null);
     } catch (ExecutionException e) {
-      log.warn(String.format("Cannot lookup group %s by uuid", uuid.get()), e);
+      log.warn("Cannot lookup group {} by uuid", uuid.get(), e);
       return null;
     }
   }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapGroupBackend.java b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapGroupBackend.java
index 7feb745..c748ddc 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapGroupBackend.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapGroupBackend.java
@@ -126,7 +126,7 @@
           return null;
         }
       } catch (ExecutionException e) {
-        log.warn(String.format("Cannot lookup group %s in LDAP", groupDn), e);
+        log.warn("Cannot lookup group {} in LDAP", groupDn, e);
         return null;
       }
     }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapGroupMembership.java b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapGroupMembership.java
index 7bef2e7..39c8a2f 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapGroupMembership.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapGroupMembership.java
@@ -65,7 +65,7 @@
       try {
         membership = new ListGroupMembership(membershipCache.get(id));
       } catch (ExecutionException e) {
-        LdapGroupBackend.log.warn(String.format("Cannot lookup membershipsOf %s in LDAP", id), e);
+        LdapGroupBackend.log.warn("Cannot lookup membershipsOf {} in LDAP", id, e);
         membership = GroupMembership.EMPTY;
       }
     }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapRealm.java b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapRealm.java
index 49ff6e8..122d4bc 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapRealm.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapRealm.java
@@ -313,7 +313,7 @@
       Optional<Account.Id> id = usernameCache.get(accountName);
       return id != null ? id.orElse(null) : null;
     } catch (ExecutionException e) {
-      log.warn(String.format("Cannot lookup account %s in LDAP", accountName), e);
+      log.warn("Cannot lookup account {} in LDAP", accountName, e);
       return null;
     }
   }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/AbandonUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/AbandonUtil.java
index 7c408c8..1dd321f 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/AbandonUtil.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/AbandonUtil.java
@@ -96,7 +96,7 @@
           log.error(msg.toString(), e);
         }
       }
-      log.info(String.format("Auto-Abandoned %d of %d changes.", count, changesToAbandon.size()));
+      log.info("Auto-Abandoned {} of {} changes.", count, changesToAbandon.size());
     } catch (QueryParseException | OrmException e) {
       log.error("Failed to query inactive open changes for auto-abandoning.", e);
     }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/events/EventFactory.java b/gerrit-server/src/main/java/com/google/gerrit/server/events/EventFactory.java
index 2584559..5c3da33 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/events/EventFactory.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/events/EventFactory.java
@@ -150,7 +150,7 @@
     try {
       a.commitMessage = changeDataFactory.create(db, change).commitMessage();
     } catch (Exception e) {
-      log.error("Error while getting full commit message for change " + a.number, e);
+      log.error("Error while getting full commit message for change {}", a.number, e);
     }
     a.url = getChangeUrl(change);
     a.owner = asAccountAttribute(change.getOwner());
@@ -498,9 +498,9 @@
       }
       p.kind = changeKindCache.getChangeKind(db, change, patchSet);
     } catch (IOException e) {
-      log.error("Cannot load patch set data for " + patchSet.getId(), e);
+      log.error("Cannot load patch set data for {}", patchSet.getId(), e);
     } catch (PatchListNotAvailableException e) {
-      log.error(String.format("Cannot get size information for %s.", pId), e);
+      log.error("Cannot get size information for {}.", pId, e);
     }
     return p;
   }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/EventUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/EventUtil.java
index 531d95a..57382f6 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/EventUtil.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/extensions/events/EventUtil.java
@@ -118,9 +118,9 @@
   public void logEventListenerError(Object event, Object listener, Exception error) {
     if (log.isDebugEnabled()) {
       log.debug(
-          String.format(
-              "Error in event listener %s for event %s",
-              listener.getClass().getName(), event.getClass().getName()),
+          "Error in event listener {} for event {}",
+          listener.getClass().getName(),
+          event.getClass().getName(),
           error);
     } else {
       log.warn(
@@ -133,7 +133,7 @@
 
   public static void logEventListenerError(Object listener, Exception error) {
     if (log.isDebugEnabled()) {
-      log.debug(String.format("Error in event listener %s", listener.getClass().getName()), error);
+      log.debug("Error in event listener {}", listener.getClass().getName(), error);
     } else {
       log.warn("Error in event listener {}: {}", listener.getClass().getName(), error.getMessage());
     }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/GarbageCollectionRunner.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/GarbageCollectionRunner.java
index ea93f96..4d8a61f 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/GarbageCollectionRunner.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/GarbageCollectionRunner.java
@@ -52,7 +52,7 @@
       if (delay == MISSING_CONFIG && interval == MISSING_CONFIG) {
         log.info("Ignoring missing gc schedule configuration");
       } else if (delay < 0 || interval <= 0) {
-        log.warn(String.format("Ignoring invalid gc schedule configuration: %s", scheduleConfig));
+        log.warn("Ignoring invalid gc schedule configuration: {}", scheduleConfig);
       } else {
         @SuppressWarnings("unused")
         Future<?> possiblyIgnoredError =
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/LocalDiskRepositoryManager.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/LocalDiskRepositoryManager.java
index ca19d47..5f836ae 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/LocalDiskRepositoryManager.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/LocalDiskRepositoryManager.java
@@ -100,7 +100,7 @@
         } else {
           desc = String.format("%d", limit);
         }
-        log.info(String.format("Defaulting core.streamFileThreshold to %s", desc));
+        log.info("Defaulting core.streamFileThreshold to {}", desc);
         cfg.setStreamFileThreshold(limit);
       }
       cfg.install();
@@ -226,9 +226,7 @@
       //
       File metaConfigLog = new File(db.getDirectory(), "logs/" + RefNames.REFS_CONFIG);
       if (!metaConfigLog.getParentFile().mkdirs() || !metaConfigLog.createNewFile()) {
-        log.error(
-            String.format(
-                "Failed to create ref log for %s in repository %s", RefNames.REFS_CONFIG, name));
+        log.error("Failed to create ref log for {} in repository {}", RefNames.REFS_CONFIG, name);
       }
 
       onCreateProject(name);
@@ -304,7 +302,7 @@
           Integer.MAX_VALUE,
           visitor);
     } catch (IOException e) {
-      log.error("Error walking repository tree " + visitor.startFolder.toAbsolutePath(), e);
+      log.error("Error walking repository tree {}", visitor.startFolder.toAbsolutePath(), e);
     }
   }
 
@@ -359,7 +357,7 @@
       Project.NameKey nameKey = getProjectName(startFolder, p);
       if (getBasePath(nameKey).equals(startFolder)) {
         if (isUnreasonableName(nameKey)) {
-          log.warn("Ignoring unreasonably named repository " + p.toAbsolutePath());
+          log.warn("Ignoring unreasonably named repository {}", p.toAbsolutePath());
         } else {
           found.add(nameKey);
         }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java
index e652935..79e3c12 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java
@@ -650,7 +650,7 @@
           try {
             repo.setGitwebDescription(ps.getProject().getDescription());
           } catch (IOException e) {
-            log.warn("cannot update description of " + project.getName(), e);
+            log.warn("cannot update description of {}", project.getName(), e);
           }
         }
 
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/Schema.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/Schema.java
index 5e06242..c7e5755 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/Schema.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/Schema.java
@@ -186,7 +186,7 @@
                 try {
                   v = f.get(obj, fillArgs);
                 } catch (OrmException e) {
-                  log.error(String.format("error getting field %s of %s", f.getName(), obj), e);
+                  log.error("error getting field {} of {}", f.getName(), obj, e);
                   return null;
                 }
                 if (v == null) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/StalenessChecker.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/change/StalenessChecker.java
index 872dfaf..0c43c85 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/StalenessChecker.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/change/StalenessChecker.java
@@ -206,7 +206,7 @@
       }
       return false;
     } catch (IOException e) {
-      log.warn(String.format("error checking staleness of %s in %s", id, project), e);
+      log.warn("error checking staleness of {} in {}", id, project, e);
       return true;
     }
   }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/MailProcessor.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/MailProcessor.java
index accf7ba..07cbc20 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/MailProcessor.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/receive/MailProcessor.java
@@ -128,9 +128,10 @@
     for (DynamicMap.Entry<MailFilter> filter : mailFilters) {
       if (!filter.getProvider().get().shouldProcessMessage(message)) {
         log.warn(
-            String.format(
-                "Message %s filtered by plugin %s %s. Will delete message.",
-                message.id(), filter.getPluginName(), filter.getExportName()));
+            "Message {} filtered by plugin {} {}. Will delete message.",
+            message.id(),
+            filter.getPluginName(),
+            filter.getExportName());
         return;
       }
     }
@@ -138,23 +139,24 @@
     MailMetadata metadata = MetadataParser.parse(message);
     if (!metadata.hasRequiredFields()) {
       log.error(
-          String.format(
-              "Message %s is missing required metadata, have %s. Will delete message.",
-              message.id(), metadata));
+          "Message {} is missing required metadata, have {}. Will delete message.",
+          message.id(),
+          metadata);
       return;
     }
 
     Set<Account.Id> accounts = accountByEmailCache.get(metadata.author);
     if (accounts.size() != 1) {
       log.error(
-          String.format(
-              "Address %s could not be matched to a unique account. It was matched to %s. Will delete message.",
-              metadata.author, accounts));
+          "Address {} could not be matched to a unique account. It was matched to {}."
+              + " Will delete message.",
+          metadata.author,
+          accounts);
       return;
     }
     Account.Id account = accounts.iterator().next();
     if (!accountCache.get(account).getAccount().isActive()) {
-      log.warn(String.format("Mail: Account %s is inactive. Will delete message.", account));
+      log.warn("Mail: Account {} is inactive. Will delete message.", account);
       return;
     }
 
@@ -163,14 +165,16 @@
           queryProvider.get().byLegacyChangeId(new Change.Id(metadata.changeNumber));
       if (changeDataList.size() != 1) {
         log.error(
-            String.format(
-                "Message %s references unique change %s, but there are %d matching changes in the index. Will delete message.",
-                message.id(), metadata.changeNumber, changeDataList.size()));
+            "Message {} references unique change {}, but there are {} matching changes in "
+                + "the index. Will delete message.",
+            message.id(),
+            metadata.changeNumber,
+            changeDataList.size());
         return;
       }
       ChangeData cd = changeDataList.get(0);
       if (existingMessageIds(cd).contains(message.id())) {
-        log.info("Message " + message.id() + " was already processed. Will delete message.");
+        log.info("Message {} was already processed. Will delete message.", message.id());
         return;
       }
       // Get all comments; filter and sort them to get the original list of
@@ -193,7 +197,7 @@
       }
 
       if (parsedComments.isEmpty()) {
-        log.warn("Could not parse any comments from " + message.id() + ". Will delete message.");
+        log.warn("Could not parse any comments from {}. Will delete message.", message.id());
         return;
       }
 
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/CommentSender.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/CommentSender.java
index b572e8d..d3c456c 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/CommentSender.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/CommentSender.java
@@ -254,11 +254,10 @@
             currentGroup.fileData = new PatchFile(repo, patchList, c.key.filename);
           } catch (IOException e) {
             log.warn(
-                String.format(
-                    "Cannot load %s from %s in %s",
-                    c.key.filename,
-                    patchList.getNewId().name(),
-                    projectState.getProject().getName()),
+                "Cannot load {} from {} in {}",
+                c.key.filename,
+                patchList.getNewId().name(),
+                projectState.getProject().getName(),
                 e);
             currentGroup.fileData = null;
           }
@@ -352,10 +351,10 @@
       maxLines = currentFileData.getLineCount(side);
     } catch (IOException err) {
       // The file could not be read, leave the max as is.
-      log.warn(String.format("Failed to read file %s on side %d", comment.key.filename, side), err);
+      log.warn("Failed to read file {} on side {}", comment.key.filename, side, err);
     } catch (NoSuchEntityException err) {
       // The file could not be read, leave the max as is.
-      log.warn(String.format("Side %d of file %s didn't exist", side, comment.key.filename), err);
+      log.warn("Side {} of file {} didn't exist", side, comment.key.filename, err);
     }
 
     int startLine = Math.max(1, lineNbr - contextLines + 1);
@@ -404,7 +403,7 @@
     try {
       return commentsUtil.get(args.db.get(), changeData.notes(), key);
     } catch (OrmException e) {
-      log.warn("Could not find the parent of this comment: " + child.toString());
+      log.warn("Could not find the parent of this comment: {}", child.toString());
       return Optional.empty();
     }
   }
@@ -595,16 +594,16 @@
       return fileInfo.getLine(side, lineNbr);
     } catch (IOException err) {
       // Default to the empty string if the file cannot be safely read.
-      log.warn(String.format("Failed to read file on side %d", side), err);
+      log.warn("Failed to read file on side {}", side, err);
       return "";
     } catch (IndexOutOfBoundsException err) {
       // Default to the empty string if the given line number does not appear
       // in the file.
-      log.debug(String.format("Failed to get line number of file on side %d", side), err);
+      log.debug("Failed to get line number of file on side {}", side, err);
       return "";
     } catch (NoSuchEntityException err) {
       // Default to the empty string if the side cannot be found.
-      log.warn(String.format("Side %d of file didn't exist", side), err);
+      log.warn("Side {} of file didn't exist", side, err);
       return "";
     }
   }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotes.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotes.java
index d35fd12..d821a78 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotes.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotes.java
@@ -140,7 +140,7 @@
         throw new NoSuchChangeException(changeId);
       }
       if (changes.size() != 1) {
-        log.error(String.format("Multiple changes found for %d", changeId.get()));
+        log.error("Multiple changes found for {}", changeId.get());
         throw new NoSuchChangeException(changeId);
       }
       return changes.get(0).notes();
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JarPluginProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JarPluginProvider.java
index 06a1a68..b10d8ab 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JarPluginProvider.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/JarPluginProvider.java
@@ -131,7 +131,7 @@
       if (overlay != null) {
         Path classes = Paths.get(overlay).resolve(name).resolve("main");
         if (Files.isDirectory(classes)) {
-          log.info(String.format("plugin %s: including %s", name, classes));
+          log.info("plugin {}: including {}", name, classes);
           urls.add(classes.toUri().toURL());
         }
       }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginLoader.java b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginLoader.java
index 9b37bad..c99b797 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginLoader.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/plugins/PluginLoader.java
@@ -195,9 +195,9 @@
     String name = MoreObjects.firstNonNull(getGerritPluginName(tmp), nameOf(fileName));
     if (!originalName.equals(name)) {
       log.warn(
-          String.format(
-              "Plugin provides its own name: <%s>, use it instead of the input name: <%s>",
-              name, originalName));
+          "Plugin provides its own name: <{}>, use it instead of the input name: <{}>",
+          name,
+          originalName);
     }
 
     String fileExtension = getExtension(fileName);
@@ -206,7 +206,7 @@
       Plugin active = running.get(name);
       if (active != null) {
         fileName = active.getSrcFile().getFileName().toString();
-        log.info(String.format("Replacing plugin %s", active.getName()));
+        log.info("Replacing plugin {}", active.getName());
         Path old = pluginsDir.resolve(".last_" + fileName);
         Files.deleteIfExists(old);
         Files.move(active.getSrcFile(), old);
@@ -217,7 +217,7 @@
       try {
         Plugin plugin = runPlugin(name, dst, active);
         if (active == null) {
-          log.info(String.format("Installed plugin %s", plugin.getName()));
+          log.info("Installed plugin {}", plugin.getName());
         }
       } catch (PluginInstallException e) {
         Files.deleteIfExists(dst);
@@ -247,7 +247,7 @@
   private synchronized void unloadPlugin(Plugin plugin) {
     persistentCacheFactory.onStop(plugin);
     String name = plugin.getName();
-    log.info(String.format("Unloading plugin %s, version %s", name, plugin.getVersion()));
+    log.info("Unloading plugin {}, version {}", name, plugin.getVersion());
     plugin.stop(env);
     env.onStopPlugin(plugin);
     running.remove(name);
@@ -257,7 +257,7 @@
 
   public void disablePlugins(Set<String> names) {
     if (!isRemoteAdminEnabled()) {
-      log.warn("Remote plugin administration is disabled, ignoring disablePlugins(" + names + ")");
+      log.warn("Remote plugin administration is disabled, ignoring disablePlugins({})", names);
       return;
     }
 
@@ -268,7 +268,7 @@
           continue;
         }
 
-        log.info(String.format("Disabling plugin %s", active.getName()));
+        log.info("Disabling plugin {}", active.getName());
         Path off =
             active.getSrcFile().resolveSibling(active.getSrcFile().getFileName() + ".disabled");
         try {
@@ -288,7 +288,7 @@
           disabled.put(name, offPlugin);
         } catch (Throwable e) {
           // This shouldn't happen, as the plugin was loaded earlier.
-          log.warn(String.format("Cannot load disabled plugin %s", active.getName()), e.getCause());
+          log.warn("Cannot load disabled plugin {}", active.getName(), e.getCause());
         }
       }
       cleanInBackground();
@@ -297,7 +297,7 @@
 
   public void enablePlugins(Set<String> names) throws PluginInstallException {
     if (!isRemoteAdminEnabled()) {
-      log.warn("Remote plugin administration is disabled, ignoring enablePlugins(" + names + ")");
+      log.warn("Remote plugin administration is disabled, ignoring enablePlugins({})", names);
       return;
     }
 
@@ -308,7 +308,7 @@
           continue;
         }
 
-        log.info(String.format("Enabling plugin %s", name));
+        log.info("Enabling plugin {}", name);
         String n = off.getSrcFile().toFile().getName();
         if (n.endsWith(".disabled")) {
           n = n.substring(0, n.lastIndexOf('.'));
@@ -317,7 +317,7 @@
         try {
           Files.move(off.getSrcFile(), on);
         } catch (IOException e) {
-          log.error("Failed to move plugin " + name + " into place", e);
+          log.error("Failed to move plugin {} into place", name, e);
           continue;
         }
         disabled.remove(name);
@@ -337,25 +337,23 @@
         };
     try (DirectoryStream<Path> files = Files.newDirectoryStream(tempDir, filter)) {
       for (Path file : files) {
-        log.info("Removing stale plugin file: " + file.toFile().getName());
+        log.info("Removing stale plugin file: {}", file.toFile().getName());
         try {
           Files.delete(file);
         } catch (IOException e) {
           log.error(
-              String.format(
-                  "Failed to remove stale plugin file %s: %s",
-                  file.toFile().getName(), e.getMessage()));
+              "Failed to remove stale plugin file {}: {}", file.toFile().getName(), e.getMessage());
         }
       }
     } catch (IOException e) {
-      log.warn("Unable to discover stale plugin files: " + e.getMessage());
+      log.warn("Unable to discover stale plugin files: {}", e.getMessage());
     }
   }
 
   @Override
   public synchronized void start() {
     removeStalePluginFiles();
-    log.info("Loading plugins from " + pluginsDir.toAbsolutePath());
+    log.info("Loading plugins from {}", pluginsDir.toAbsolutePath());
     srvInfoImpl.state = ServerInformation.State.STARTUP;
     rescan();
     srvInfoImpl.state = ServerInformation.State.RUNNING;
@@ -404,13 +402,11 @@
       for (Plugin active : reload) {
         String name = active.getName();
         try {
-          log.info(String.format("Reloading plugin %s", name));
+          log.info("Reloading plugin {}", name);
           Plugin newPlugin = runPlugin(name, active.getSrcFile(), active);
-          log.info(
-              String.format(
-                  "Reloaded plugin %s, version %s", newPlugin.getName(), newPlugin.getVersion()));
+          log.info("Reloaded plugin {}, version {}", newPlugin.getName(), newPlugin.getVersion());
         } catch (PluginInstallException e) {
-          log.warn(String.format("Cannot reload plugin %s", name), e.getCause());
+          log.warn("Cannot reload plugin {}", name, e.getCause());
           throw e;
         }
       }
@@ -448,21 +444,20 @@
       }
 
       if (active != null) {
-        log.info(String.format("Reloading plugin %s", active.getName()));
+        log.info("Reloading plugin {}", active.getName());
       }
 
       try {
         Plugin loadedPlugin = runPlugin(name, path, active);
         if (!loadedPlugin.isDisabled()) {
           log.info(
-              String.format(
-                  "%s plugin %s, version %s",
-                  active == null ? "Loaded" : "Reloaded",
-                  loadedPlugin.getName(),
-                  loadedPlugin.getVersion()));
+              "{} plugin {}, version {}",
+              active == null ? "Loaded" : "Reloaded",
+              loadedPlugin.getName(),
+              loadedPlugin.getVersion());
         }
       } catch (PluginInstallException e) {
-        log.warn(String.format("Cannot load plugin %s", name), e.getCause());
+        log.warn("Cannot load plugin {}", name, e.getCause());
       }
     }
 
@@ -716,18 +711,19 @@
       Collection<Path> elementsToAdd = new ArrayList<>();
       for (Path loser : Iterables.skip(enabled, 1)) {
         log.warn(
-            String.format(
-                "Plugin <%s> was disabled, because"
-                    + " another plugin <%s>"
-                    + " with the same name <%s> already exists",
-                loser, winner, plugin));
+            "Plugin <{}> was disabled, because"
+                + " another plugin <{}>"
+                + " with the same name <{}> already exists",
+            loser,
+            winner,
+            plugin);
         Path disabledPlugin = Paths.get(loser + ".disabled");
         elementsToAdd.add(disabledPlugin);
         elementsToRemove.add(loser);
         try {
           Files.move(loser, disabledPlugin);
         } catch (IOException e) {
-          log.warn("Failed to fully disable plugin " + loser, e);
+          log.warn("Failed to fully disable plugin {}", loser, e);
         }
       }
       Iterables.removeAll(files, elementsToRemove);
@@ -740,7 +736,7 @@
     try {
       return listPlugins(pluginsDir);
     } catch (IOException e) {
-      log.error("Cannot list " + pluginsDir.toAbsolutePath(), e);
+      log.error("Cannot list {}", pluginsDir.toAbsolutePath(), e);
       return ImmutableList.of();
     }
   }
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/PutConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/PutConfig.java
index 59e0044..2132ef4 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/PutConfig.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/PutConfig.java
@@ -168,7 +168,7 @@
           throw new ResourceConflictException(
               "Cannot update " + projectName + ": " + e.getCause().getMessage());
         }
-        log.warn(String.format("Failed to update config of project %s.", projectName), e);
+        log.warn("Failed to update config of project {}.", projectName, e);
         throw new ResourceConflictException("Cannot update " + projectName);
       }
 
@@ -202,9 +202,7 @@
         ProjectConfigEntry projectConfigEntry = pluginConfigEntries.get(pluginName, v.getKey());
         if (projectConfigEntry != null) {
           if (!isValidParameterName(v.getKey())) {
-            log.warn(
-                String.format(
-                    "Parameter name '%s' must match '^[a-zA-Z0-9]+[a-zA-Z0-9-]*$'", v.getKey()));
+            log.warn("Parameter name '{}' must match '^[a-zA-Z0-9]+[a-zA-Z0-9-]*$'", v.getKey());
             continue;
           }
           String oldValue = cfg.getString(v.getKey());
@@ -253,9 +251,9 @@
                     break;
                   default:
                     log.warn(
-                        String.format(
-                            "The type '%s' of parameter '%s' is not supported.",
-                            projectConfigEntry.getType().name(), v.getKey()));
+                        "The type '{}' of parameter '{}' is not supported.",
+                        projectConfigEntry.getType().name(),
+                        v.getKey());
                 }
               } catch (NumberFormatException ex) {
                 throw new BadRequestException(
diff --git a/plugins/download-commands b/plugins/download-commands
index b88b58b..d2f0920 160000
--- a/plugins/download-commands
+++ b/plugins/download-commands
@@ -1 +1 @@
-Subproject commit b88b58b670be36f332285e1818695ac45b5be5b3
+Subproject commit d2f0920fac4838da70e83a03237ab97413960ec6
diff --git a/plugins/reviewnotes b/plugins/reviewnotes
index 7070ce2..72a0860 160000
--- a/plugins/reviewnotes
+++ b/plugins/reviewnotes
@@ -1 +1 @@
-Subproject commit 7070ce225267cd024d0a2f06d0c03f8011774def
+Subproject commit 72a086028fbfb3e597276f2a2984534965645883
