Merge branch 'stable-2.14' into stable-2.15

* stable-2.14:
  More logging improvements to help tracking down hook problems
  Clarify usage of logging set-level command in documentation
  Update debug documentation to enable debugging for the whole package

Change-Id: I9d345784c32e4c682ea8110af9323934d8c2ce52
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 4a5f6bb..42d4e75 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/hooks/HookExecutor.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/hooks/HookExecutor.java
@@ -46,6 +46,7 @@
 
   HookResult submit(String projectName, Path hook, HookArgs args) {
     if (!Files.exists(hook)) {
+      log.debug("Hook file not found: {}", hook);
       return null;
     }
     HookTask.Sync hookTask = new HookTask.Sync(projectName, hook, args);
@@ -56,10 +57,10 @@
     try {
       return task.get(timeout, TimeUnit.SECONDS);
     } catch (TimeoutException e) {
-      message = "Synchronous hook timed out " + hook.toAbsolutePath();
+      message = "Synchronous hook timed out " + hook;
       log.error(message);
     } catch (Exception e) {
-      message = "Error running hook " + hook.toAbsolutePath();
+      message = "Error running hook " + hook;
       log.error(message, e);
     }
     task.cancel(true);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/hooks/HookFactory.java b/src/main/java/com/googlesource/gerrit/plugins/hooks/HookFactory.java
index c3ca6e1..f3d8293 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/hooks/HookFactory.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/hooks/HookFactory.java
@@ -23,9 +23,13 @@
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import org.eclipse.jgit.lib.Config;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 @Singleton
 public class HookFactory {
+  private static final Logger log = LoggerFactory.getLogger(HookFactory.class);
+
   private final HookQueue queue;
   private final HookExecutor syncHookExecutor;
   private final Config config;
@@ -50,11 +54,14 @@
     } else {
       this.hooksPath = sitePaths.hooks_dir;
     }
+    log.info("hooks.path: {}", this.hooksPath);
   }
 
   private Path getHookPath(String configName, String defaultName) {
     String v = config.getString("hooks", null, configName);
-    return hooksPath.resolve(firstNonNull(v, defaultName));
+    Path hookPath = hooksPath.resolve(firstNonNull(v, defaultName));
+    log.info("hooks.{} resolved to {}", configName, hookPath);
+    return hookPath;
   }
 
   public Hook createAsync(String configName, String defaultName) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/hooks/HookQueue.java b/src/main/java/com/googlesource/gerrit/plugins/hooks/HookQueue.java
index bc7e5eb..fb3c5a8 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/hooks/HookQueue.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/hooks/HookQueue.java
@@ -20,8 +20,12 @@
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.concurrent.ScheduledExecutorService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 class HookQueue implements LifecycleListener {
+  private static final Logger log = LoggerFactory.getLogger(HookQueue.class);
+
   private final WorkQueue workQueue;
 
   private ScheduledExecutorService queue;
@@ -36,9 +40,11 @@
   }
 
   void submit(String projectName, Path hook, HookArgs args) {
-    if (Files.exists(hook)) {
-      queue.submit(new HookTask.Async(projectName, hook, args));
+    if (!Files.exists(hook)) {
+      log.debug("Hook file not found: {}", hook.toAbsolutePath());
+      return;
     }
+    queue.submit(new HookTask.Async(projectName, hook, args));
   }
 
   @Override
diff --git a/src/main/resources/Documentation/config.md b/src/main/resources/Documentation/config.md
index 778f4cc..e3aa1b9 100644
--- a/src/main/resources/Documentation/config.md
+++ b/src/main/resources/Documentation/config.md
@@ -102,12 +102,18 @@
 debug level.
 
 To make debug logs visible in Gerrit's log file, debug logging must be
-enabled for `com.googlesource.gerrit.plugins.hooks.HookTask`. This can be
-done by editing the `log4j.properties` file (requires a Gerrit restart) or
-by setting the log level at runtime with the ssh command:
+enabled for the `com.googlesource.gerrit.plugins.hooks` package. This can be
+done by setting the log level at runtime with the ssh command:
 
 ```
-  ssh -p 29418 user@gerrit gerrit logging set-level DEBUG com.googlesource.gerrit.plugins.hooks.HookTask
+  ssh -p 29418 user@gerrit gerrit logging set-level DEBUG com.googlesource.gerrit.plugins.hooks
 ```
 
+Note that setting the log level at runtime only works for loggers that
+have already been created. Loggers that get created after the level was
+set will still be created with the default level.
+
+To set the level for all loggers, it is necessary to do it by editing the
+`log4j.properties` file. This requires the Gerrit server to be restarted.
+
 [1]: ../../../Documentation/config-gerrit.html#gerrit.canonicalWebUrl