Merge branch 'stable-2.14' into stable-2.15

* stable-2.14:
  Log a warning when a hook exits with error status
  Include hook name in error message when logging output failed
  Log a warning when a hook times out
  Use Logger's built-in string formatting

Change-Id: I8dbc6b71eb46adfcd06b0e64684d78d33c327110
diff --git a/src/main/java/com/googlesource/gerrit/plugins/hooks/HookExecutor.java b/src/main/java/com/googlesource/gerrit/plugins/hooks/HookExecutor.java
index 5409227..4a5f6bb 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/hooks/HookExecutor.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/hooks/HookExecutor.java
@@ -22,7 +22,7 @@
       new UncaughtExceptionHandler() {
         @Override
         public void uncaughtException(Thread t, Throwable e) {
-          log.error("HookExecutor thread " + t.getName() + " threw exception", e);
+          log.error("HookExecutor thread {} threw exception", t.getName(), e);
         }
       };
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/hooks/HookTask.java b/src/main/java/com/googlesource/gerrit/plugins/hooks/HookTask.java
index 20bb088..7a7189a 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/hooks/HookTask.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/hooks/HookTask.java
@@ -113,22 +113,28 @@
     } catch (InterruptedException iex) {
       // InterruptedException - timeout or cancel
       args.metrics.timeout(name);
+      log.warn("hook[{}] timed out: {}", name, iex.getMessage());
     } catch (Throwable err) {
       args.metrics.error(name);
-      log.error("Error running hook " + hook.toAbsolutePath(), err);
+      log.error("Error running hook {}", hook.toAbsolutePath(), err);
     }
 
-    if (result != null && log.isDebugEnabled()) {
-      log.debug(String.format("hook[%s] exitValue: %d", name, result.getExitValue()));
+    if (result != null) {
+      int exitValue = result.getExitValue();
+      if (exitValue != 0) {
+        log.warn("hook[{}] exited with error status: {}", name, exitValue);
+      }
 
-      BufferedReader br = new BufferedReader(new StringReader(result.getOutput()));
-      try {
-        String line;
-        while ((line = br.readLine()) != null) {
-          log.debug(String.format("hook[%s] output: %s", name, line));
+      if (log.isDebugEnabled()) {
+        BufferedReader br = new BufferedReader(new StringReader(result.getOutput()));
+        try {
+          String line;
+          while ((line = br.readLine()) != null) {
+            log.debug("hook[{}] output: {}", name, line);
+          }
+        } catch (IOException iox) {
+          log.error("Error writing hook [{}] output", name, iox);
         }
-      } catch (IOException iox) {
-        log.error("Error writing hook output", iox);
       }
     }