Switch to Flogger
Upstream gerrit switched to Flogger. So we should as well.
Change-Id: Ib18bffd16eeca468a95546b4deb8bb43a65325ae
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/base/its/ItsConfig.java b/src/main/java/com/googlesource/gerrit/plugins/its/base/its/ItsConfig.java
index 08f73c5..9dda01f 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/its/base/its/ItsConfig.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/base/its/ItsConfig.java
@@ -16,6 +16,7 @@
import static java.util.stream.Collectors.toList;
+import com.google.common.flogger.FluentLogger;
import com.google.gerrit.common.data.AccessSection;
import com.google.gerrit.entities.Project;
import com.google.gerrit.entities.Project.NameKey;
@@ -44,13 +45,11 @@
import java.util.Optional;
import java.util.regex.Pattern;
import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
public class ItsConfig {
private static final String PLUGIN = "plugin";
- private static final Logger log = LoggerFactory.getLogger(ItsConfig.class);
+ private static final FluentLogger logger = FluentLogger.forEnclosingClass();
private final String pluginName;
private final ProjectCache projectCache;
@@ -89,17 +88,16 @@
|| event instanceof RefUpdatedEvent) {
return isEnabled(event.getProjectNameKey(), event.getRefName());
}
- log.debug("Event {} not recognised and ignored", event);
+ logger.atFine().log("Event %s not recognised and ignored", event);
return false;
}
public boolean isEnabled(Project.NameKey projectNK, String refName) {
ProjectState projectState = projectCache.get(projectNK);
if (projectState == null) {
- log.error(
- "Failed to check if {} is enabled for project {}: Project not found",
- pluginName,
- projectNK.get());
+ logger.atSevere().log(
+ "Failed to check if %s is enabled for project %s: Project not found",
+ pluginName, projectNK.get());
return false;
}
return isEnforcedByAnyParentProject(refName, projectState)
@@ -257,7 +255,8 @@
try {
return pluginCfgFactory.getFromProjectConfigWithInheritance(projectName, pluginName);
} catch (NoSuchProjectException e) {
- log.error("Cannot access " + projectName + " configuration for plugin " + pluginName, e);
+ logger.atSevere().withCause(e).log(
+ "Cannot access %s configuration for plugin %s", projectName, pluginName);
}
}
return new PluginConfig(pluginName, new Config());
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/base/its/NoopItsFacade.java b/src/main/java/com/googlesource/gerrit/plugins/its/base/its/NoopItsFacade.java
index ecf3a6f..ba7fb14 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/its/base/its/NoopItsFacade.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/base/its/NoopItsFacade.java
@@ -14,73 +14,55 @@
package com.googlesource.gerrit.plugins.its.base.its;
+import com.google.common.flogger.FluentLogger;
import java.io.IOException;
import java.net.URL;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
/** An ITS facade doing nothing, it's configured when no ITS are referenced in config */
public class NoopItsFacade implements ItsFacade {
-
- private Logger log = LoggerFactory.getLogger(NoopItsFacade.class);
+ private static final FluentLogger logger = FluentLogger.forEnclosingClass();
@Override
public void addComment(String issueId, String comment) throws IOException {
- if (log.isDebugEnabled()) {
- log.debug("addComment({},{})", issueId, comment);
- }
+ logger.atFine().log("addComment(%s,%s)", issueId, comment);
}
@Override
public void addValueToField(String issueId, String value, String fieldId) throws IOException {
- if (log.isDebugEnabled()) {
- log.debug("addValueToField({},{},{})", issueId, fieldId, value);
- }
+ logger.atFine().log("addValueToField(%s,%s,%s)", issueId, fieldId, value);
}
@Override
public void addRelatedLink(String issueId, URL relatedUrl, String description)
throws IOException {
- if (log.isDebugEnabled()) {
- log.debug("addRelatedLink({},{},{})", issueId, relatedUrl, description);
- }
+ logger.atFine().log("addRelatedLink(%s,%s,%s)", issueId, relatedUrl, description);
}
@Override
public boolean exists(String issueId) throws IOException {
- if (log.isDebugEnabled()) {
- log.debug("exists({})", issueId);
- }
+ logger.atFine().log("exists(%s)", issueId);
return false;
}
@Override
public void performAction(String issueId, String actionName) throws IOException {
- if (log.isDebugEnabled()) {
- log.debug("performAction({},{})", issueId, actionName);
- }
+ logger.atFine().log("performAction(%s,%s)", issueId, actionName);
}
@Override
public void createVersion(String itsProject, String version) {
- if (log.isDebugEnabled()) {
- log.debug("createVersion({},{})", itsProject, version);
- }
+ logger.atFine().log("createVersion(%s,%s)", itsProject, version);
}
@Override
public String healthCheck(Check check) throws IOException {
- if (log.isDebugEnabled()) {
- log.debug("healthCheck()");
- }
+ logger.atFine().log("healthCheck()");
return "{\"status\"=\"ok\",\"system\"=\"not configured\",}";
}
@Override
public String createLinkForWebui(String url, String text) {
- if (log.isDebugEnabled()) {
- log.debug("createLinkForWebui({},{})", url, text);
- }
+ logger.atFine().log("createLinkForWebui(%s,%s)", url, text);
return "";
}
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/base/util/CommitMessageFetcher.java b/src/main/java/com/googlesource/gerrit/plugins/its/base/util/CommitMessageFetcher.java
index b34bd55..0fd523d 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/its/base/util/CommitMessageFetcher.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/base/util/CommitMessageFetcher.java
@@ -1,5 +1,6 @@
package com.googlesource.gerrit.plugins.its.base.util;
+import com.google.common.flogger.FluentLogger;
import com.google.gerrit.entities.Project;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.inject.Inject;
@@ -8,11 +9,9 @@
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevWalk;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
public class CommitMessageFetcher {
- private static final Logger log = LoggerFactory.getLogger(CommitMessageFetcher.class);
+ private static final FluentLogger logger = FluentLogger.forEnclosingClass();
private final GitRepositoryManager repoManager;
@@ -35,9 +34,8 @@
try {
ret = fetch(projectName, commitId);
} catch (IOException e) {
- log.error(
- "Could not fetch commit message for commit " + commitId + " of project " + projectName,
- e);
+ logger.atSevere().withCause(e).log(
+ "Could not fetch commit message for commit %s of project %s", commitId, projectName);
}
return ret;
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/base/util/IssueExtractor.java b/src/main/java/com/googlesource/gerrit/plugins/its/base/util/IssueExtractor.java
index 44611fe..6131ed4 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/its/base/util/IssueExtractor.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/base/util/IssueExtractor.java
@@ -5,6 +5,7 @@
import com.google.common.base.Strings;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
+import com.google.common.flogger.FluentLogger;
import com.google.gerrit.entities.PatchSet;
import com.google.gerrit.extensions.api.GerritApi;
import com.google.gerrit.extensions.client.ListChangesOption;
@@ -19,11 +20,9 @@
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
public class IssueExtractor {
- private static final Logger log = LoggerFactory.getLogger(IssueExtractor.class);
+ private static final FluentLogger logger = FluentLogger.forEnclosingClass();
private final CommitMessageFetcher commitMessageFetcher;
private final PatchSetDb db;
@@ -80,7 +79,7 @@
Pattern pattern = itsConfig.getIssuePattern();
if (pattern == null) return new String[] {};
- log.debug("Matching '{}' against {}", haystack, pattern.pattern());
+ logger.atFine().log("Matching '%s' against '%s'", haystack, pattern.pattern());
Set<String> issues = Sets.newHashSet();
Matcher matcher = pattern.matcher(haystack);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/base/validation/ItsValidateComment.java b/src/main/java/com/googlesource/gerrit/plugins/its/base/validation/ItsValidateComment.java
index c5799d2..074b882 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/its/base/validation/ItsValidateComment.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/base/validation/ItsValidateComment.java
@@ -15,6 +15,7 @@
package com.googlesource.gerrit.plugins.its.base.validation;
import com.google.common.collect.Lists;
+import com.google.common.flogger.FluentLogger;
import com.google.gerrit.entities.Project;
import com.google.gerrit.extensions.annotations.PluginName;
import com.google.gerrit.server.events.CommitReceivedEvent;
@@ -30,12 +31,10 @@
import java.util.Collections;
import java.util.List;
import org.eclipse.jgit.revwalk.RevCommit;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
public class ItsValidateComment implements CommitValidationListener {
- private static final Logger log = LoggerFactory.getLogger(ItsValidateComment.class);
+ private static final FluentLogger logger = FluentLogger.forEnclosingClass();
@Inject private ItsFacade client;
@@ -80,7 +79,7 @@
"Failed to check whether or not issue "
+ issueId
+ " exists, due to connectivity issue. Commit will be accepted.";
- log.warn(synopsis, e);
+ logger.atWarning().withCause(e).log(synopsis);
details = e.toString();
existenceCheckResult = ItsExistenceCheckResult.CONNECTIVITY_FAILURE;
ret.add(commitValidationFailure(synopsis, details, existenceCheckResult));
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/ActionController.java b/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/ActionController.java
index 4af8f1b..f9214c6 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/ActionController.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/ActionController.java
@@ -14,6 +14,7 @@
package com.googlesource.gerrit.plugins.its.base.workflow;
+import com.google.common.flogger.FluentLogger;
import com.google.gerrit.server.events.Event;
import com.google.gerrit.server.events.EventListener;
import com.google.gerrit.server.events.RefEvent;
@@ -23,8 +24,6 @@
import java.util.Collection;
import java.util.Map;
import java.util.Set;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
/**
* Controller that takes actions according to {@code ChangeEvents@}.
@@ -34,7 +33,7 @@
*/
public class ActionController implements EventListener {
- private static final Logger log = LoggerFactory.getLogger(ActionController.class);
+ private static final FluentLogger logger = FluentLogger.forEnclosingClass();
private final PropertyExtractor propertyExtractor;
private final RuleBase ruleBase;
@@ -90,8 +89,8 @@
}
if (!projectProperties.containsKey("its-project")) {
String project = projectProperties.get("project");
- log.error(
- "Could not process project event. No its-project associated with project {}. "
+ logger.atSevere().log(
+ "Could not process project event. No its-project associated with project %s. "
+ "Did you forget to configure the ITS project association in project.config?",
project);
return;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/ActionExecutor.java b/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/ActionExecutor.java
index b8682ad..3654e6f 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/ActionExecutor.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/ActionExecutor.java
@@ -14,6 +14,7 @@
package com.googlesource.gerrit.plugins.its.base.workflow;
+import com.google.common.flogger.FluentLogger;
import com.google.gerrit.entities.Project;
import com.google.gerrit.extensions.registration.DynamicMap;
import com.google.gerrit.extensions.registration.PluginName;
@@ -22,12 +23,10 @@
import com.googlesource.gerrit.plugins.its.base.its.ItsFacadeFactory;
import java.io.IOException;
import java.util.Map;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
/** Executes an {@link ActionRequest} */
public class ActionExecutor {
- private static final Logger log = LoggerFactory.getLogger(ActionExecutor.class);
+ private static final FluentLogger logger = FluentLogger.forEnclosingClass();
private final ItsFacadeFactory itsFactory;
private final AddComment.Factory addCommentFactory;
@@ -95,7 +94,7 @@
execute(action, issue, actionRequest, properties);
}
} catch (IOException e) {
- log.error("Error while executing action " + actionRequest, e);
+ logger.atSevere().withCause(e).log("Error while executing action %s", actionRequest);
}
}
@@ -111,7 +110,7 @@
String actionName = actionRequest.getName();
Action action = getAction(actionName);
if (action == null) {
- log.debug("No action found for name {}", actionName);
+ logger.atFine().log("No action found for name %s", actionName);
return;
}
if (action.getType() != ActionType.PROJECT) {
@@ -119,7 +118,7 @@
}
execute(action, itsProject, actionRequest, properties);
} catch (IOException e) {
- log.error("Error while executing action " + actionRequest, e);
+ logger.atSevere().withCause(e).log("Error while executing action %s", actionRequest);
}
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/AddPropertyToFieldParametersExtractor.java b/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/AddPropertyToFieldParametersExtractor.java
index 7a259f1..3b1f356 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/AddPropertyToFieldParametersExtractor.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/AddPropertyToFieldParametersExtractor.java
@@ -15,17 +15,14 @@
package com.googlesource.gerrit.plugins.its.base.workflow;
import com.google.common.base.Strings;
+import com.google.common.flogger.FluentLogger;
import com.google.inject.Inject;
import java.util.Arrays;
import java.util.Map;
import java.util.Optional;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
public class AddPropertyToFieldParametersExtractor {
-
- private static final Logger log =
- LoggerFactory.getLogger(AddPropertyToFieldParametersExtractor.class);
+ private static final FluentLogger logger = FluentLogger.forEnclosingClass();
@Inject
public AddPropertyToFieldParametersExtractor() {}
@@ -38,26 +35,26 @@
ActionRequest actionRequest, Map<String, String> properties) {
String[] parameters = actionRequest.getParameters();
if (parameters.length != 2) {
- log.error(
- "Wrong number of received parameters. Received parameters are {}. Exactly two parameters are expected. The first one is the ITS field id, the second one is the event property id",
+ logger.atSevere().log(
+ "Wrong number of received parameters. Received parameters are %s. Exactly two parameters are expected. The first one is the ITS field id, the second one is the event property id",
Arrays.toString(parameters));
return Optional.empty();
}
String propertyId = parameters[0];
if (Strings.isNullOrEmpty(propertyId)) {
- log.error("Received property id is blank");
+ logger.atSevere().log("Received property id is blank");
return Optional.empty();
}
String fieldId = parameters[1];
if (Strings.isNullOrEmpty(fieldId)) {
- log.error("Received field id is blank");
+ logger.atSevere().log("Received field id is blank");
return Optional.empty();
}
if (!properties.containsKey(propertyId)) {
- log.error("No event property found for id {}", propertyId);
+ logger.atSevere().log("No event property found for id %s", propertyId);
return Optional.empty();
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/AddSoyComment.java b/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/AddSoyComment.java
index c29d622..3ee4ca8 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/AddSoyComment.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/AddSoyComment.java
@@ -15,6 +15,7 @@
package com.googlesource.gerrit.plugins.its.base.workflow;
import com.google.common.base.Strings;
+import com.google.common.flogger.FluentLogger;
import com.google.common.io.CharStreams;
import com.google.inject.Inject;
import com.google.inject.ProvisionException;
@@ -31,8 +32,6 @@
import java.nio.file.Path;
import java.util.HashMap;
import java.util.Map;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
/**
* Adds a short predefined comments to an issue.
@@ -40,7 +39,7 @@
* <p>Comments are added for merging, abandoning, restoring of changes and adding of patch sets.
*/
public class AddSoyComment extends IssueAction {
- private static final Logger log = LoggerFactory.getLogger(AddSoyComment.class);
+ private static final FluentLogger logger = FluentLogger.forEnclosingClass();
public interface Factory {
AddSoyComment create();
@@ -99,7 +98,7 @@
if (!template.isEmpty()) {
return soyTextTemplate(SoyFileSet.builder(), template, properties);
}
- log.error("No template name given in {}", actionRequest);
+ logger.atSevere().log("No template name given in %s", actionRequest);
return "";
}
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/CreateVersionFromPropertyParametersExtractor.java b/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/CreateVersionFromPropertyParametersExtractor.java
index 1eb01ce..3f81485 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/CreateVersionFromPropertyParametersExtractor.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/CreateVersionFromPropertyParametersExtractor.java
@@ -15,17 +15,14 @@
package com.googlesource.gerrit.plugins.its.base.workflow;
import com.google.common.base.Strings;
+import com.google.common.flogger.FluentLogger;
import java.util.Arrays;
import java.util.Map;
import java.util.Optional;
import javax.inject.Inject;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
class CreateVersionFromPropertyParametersExtractor {
-
- private static final Logger log =
- LoggerFactory.getLogger(CreateVersionFromPropertyParametersExtractor.class);
+ private static final FluentLogger logger = FluentLogger.forEnclosingClass();
@Inject
public CreateVersionFromPropertyParametersExtractor() {}
@@ -34,20 +31,20 @@
ActionRequest actionRequest, Map<String, String> properties) {
String[] parameters = actionRequest.getParameters();
if (parameters.length != 1) {
- log.error(
- "Wrong number of received parameters. Received parameters are {}. Only one parameter is expected, the property id.",
+ logger.atSevere().log(
+ "Wrong number of received parameters. Received parameters are %s. Only one parameter is expected, the property id.",
Arrays.toString(parameters));
return Optional.empty();
}
String propertyId = parameters[0];
if (Strings.isNullOrEmpty(propertyId)) {
- log.error("Received property id is blank");
+ logger.atSevere().log("Received property id is blank");
return Optional.empty();
}
if (!properties.containsKey(propertyId)) {
- log.error("No event property found for id {}", propertyId);
+ logger.atSevere().log("No event property found for id %s", propertyId);
return Optional.empty();
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/ItsRulesProjectCacheImpl.java b/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/ItsRulesProjectCacheImpl.java
index 72fe43f..9790f7d 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/ItsRulesProjectCacheImpl.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/ItsRulesProjectCacheImpl.java
@@ -17,6 +17,7 @@
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import com.google.common.collect.ImmutableList;
+import com.google.common.flogger.FluentLogger;
import com.google.gerrit.entities.Project;
import com.google.gerrit.extensions.events.GitReferenceUpdatedListener;
import com.google.gerrit.extensions.registration.DynamicSet;
@@ -34,12 +35,10 @@
import java.util.List;
import java.util.concurrent.ExecutionException;
import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
@Singleton
public class ItsRulesProjectCacheImpl implements ItsRulesProjectCache {
- private static final Logger log = LoggerFactory.getLogger(ItsRulesProjectCacheImpl.class);
+ private static final FluentLogger logger = FluentLogger.forEnclosingClass();
private static final String CACHE_NAME = "its_rules_project";
private final LoadingCache<String, List<Rule>> cache;
@@ -54,7 +53,8 @@
try {
return cache.get(projectName);
} catch (ExecutionException e) {
- log.warn("Cannot get project specific rules for project {}", projectName, e);
+ logger.atWarning().withCause(e).log(
+ "Cannot get project specific rules for project %s", projectName);
return ImmutableList.of();
}
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/ItsRulesProjectCacheRefresher.java b/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/ItsRulesProjectCacheRefresher.java
index 6d19849..75b91f7 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/ItsRulesProjectCacheRefresher.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/ItsRulesProjectCacheRefresher.java
@@ -1,16 +1,15 @@
package com.googlesource.gerrit.plugins.its.base.workflow;
+import com.google.common.flogger.FluentLogger;
import com.google.gerrit.entities.RefNames;
import com.google.gerrit.extensions.api.GerritApi;
import com.google.gerrit.extensions.common.ProjectInfo;
import com.google.gerrit.extensions.events.GitReferenceUpdatedListener;
import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.inject.Inject;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
public class ItsRulesProjectCacheRefresher implements GitReferenceUpdatedListener {
- private static final Logger log = LoggerFactory.getLogger(ItsRulesProjectCacheRefresher.class);
+ private static final FluentLogger logger = FluentLogger.forEnclosingClass();
private final GerritApi gApi;
private final ItsRulesProjectCache itsRuleProjectCache;
@@ -33,7 +32,7 @@
itsRuleProjectCache.evict(childProject.name);
}
} catch (RestApiException e) {
- log.warn("Unable to evict ITS rules cache", e);
+ logger.atWarning().withCause(e).log("Unable to evict ITS rules cache");
}
}
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/LogEvent.java b/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/LogEvent.java
index 6eec9a4..f345227 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/LogEvent.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/LogEvent.java
@@ -14,13 +14,12 @@
package com.googlesource.gerrit.plugins.its.base.workflow;
+import com.google.common.flogger.FluentLogger;
import com.google.inject.Inject;
import com.googlesource.gerrit.plugins.its.base.its.ItsFacade;
import java.io.IOException;
import java.util.Map;
import java.util.Map.Entry;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
/**
* Dumps the event's properties to the log.
@@ -28,7 +27,7 @@
* <p>This event helps when developing rules as available properties become visible.
*/
public class LogEvent extends IssueAction {
- private static final Logger log = LoggerFactory.getLogger(LogEvent.class);
+ private static final FluentLogger logger = FluentLogger.forEnclosingClass();
private enum Level {
ERROR,
@@ -56,23 +55,25 @@
public LogEvent() {}
private void logProperty(Level level, Entry<String, String> property) {
- String message = String.format("[%s = %s]", property.getKey(), property.getValue());
+ final java.util.logging.Level logLevel;
switch (level) {
case ERROR:
- log.error(message);
+ logLevel = java.util.logging.Level.SEVERE;
break;
case WARN:
- log.warn(message);
+ logLevel = java.util.logging.Level.WARNING;
break;
case INFO:
- log.info(message);
+ logLevel = java.util.logging.Level.INFO;
break;
case DEBUG:
- log.debug(message);
+ logLevel = java.util.logging.Level.FINE;
break;
default:
- log.error("Undefined log level.");
+ logger.atSevere().log("Undefined log level.");
+ return;
}
+ logger.at(logLevel).log("[%s = %s]", property.getKey(), property.getValue());
}
@Override
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/RuleBase.java b/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/RuleBase.java
index fa96242..b051dfe 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/RuleBase.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/RuleBase.java
@@ -15,6 +15,7 @@
package com.googlesource.gerrit.plugins.its.base.workflow;
import com.google.common.collect.ImmutableList;
+import com.google.common.flogger.FluentLogger;
import com.google.inject.Inject;
import com.googlesource.gerrit.plugins.its.base.GlobalRulesFileName;
import com.googlesource.gerrit.plugins.its.base.ItsPath;
@@ -29,12 +30,10 @@
import org.eclipse.jgit.errors.ConfigInvalidException;
import org.eclipse.jgit.storage.file.FileBasedConfig;
import org.eclipse.jgit.util.FS;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
/** Collection and matcher against {@link Rule}s. */
public class RuleBase {
- private static final Logger log = LoggerFactory.getLogger(RuleBase.class);
+ private static final FluentLogger logger = FluentLogger.forEnclosingClass();
private final File globalRuleFile;
private final File itsSpecificRuleFile;
@@ -81,7 +80,7 @@
cfg.load();
return rulesConfigReader.getRulesFromConfig(cfg);
} catch (IOException | ConfigInvalidException e) {
- log.error("Invalid ITS action configuration", e);
+ logger.atSevere().withCause(e).log("Invalid ITS action configuration");
}
}
return Collections.emptyList();
@@ -98,12 +97,10 @@
Collection<Rule> fromProjectConfig = rulesProjectCache.get(projectName);
Collection<Rule> rulesToAdd = !fromProjectConfig.isEmpty() ? fromProjectConfig : rules;
if (rulesToAdd.isEmpty() && !globalRuleFile.exists() && !itsSpecificRuleFile.exists()) {
- log.debug(
- "Neither global rule file {} nor Its specific rule file {} exist and no rules are "
- + "configured for project {}. Please configure rules.",
- globalRuleFile,
- itsSpecificRuleFile,
- projectName);
+ logger.atFine().log(
+ "Neither global rule file %s nor Its specific rule file %s exist and no rules are "
+ + "configured for project %s. Please configure rules.",
+ globalRuleFile, itsSpecificRuleFile, projectName);
return Collections.emptyList();
}
Collection<ActionRequest> actions = new ArrayList<>();
diff --git a/src/test/java/com/googlesource/gerrit/plugins/its/base/testutil/LoggingMockingTestCase.java b/src/test/java/com/googlesource/gerrit/plugins/its/base/testutil/LoggingMockingTestCase.java
index 03dda08..e7a137a 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/its/base/testutil/LoggingMockingTestCase.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/its/base/testutil/LoggingMockingTestCase.java
@@ -22,9 +22,9 @@
import com.googlesource.gerrit.plugins.its.base.testutil.log.LogUtil;
import java.sql.Timestamp;
import java.util.Iterator;
+import java.util.logging.LogRecord;
import junit.framework.TestCase;
import org.apache.log4j.Level;
-import org.apache.log4j.spi.LoggingEvent;
import org.junit.After;
public abstract class LoggingMockingTestCase extends TestCase {
@@ -34,22 +34,21 @@
protected final Change.Id testChangeId = Change.id(1);
protected final Account.Id testAccountId = Account.id(1);
- private java.util.Collection<LoggingEvent> loggedEvents;
+ private java.util.Collection<LogRecord> records;
protected final void assertLogMessageContains(String needle, Level level) {
- LoggingEvent hit = null;
- Iterator<LoggingEvent> iter = loggedEvents.iterator();
+ LogRecord hit = null;
+ Iterator<LogRecord> iter = records.iterator();
while (hit == null && iter.hasNext()) {
- LoggingEvent event = iter.next();
- if (event.getRenderedMessage().contains(needle)) {
- if (level == null || level.equals(event.getLevel())) {
- hit = event;
+ LogRecord record = iter.next();
+ if (record.getMessage().contains(needle)) {
+ if (level == null || LogUtil.equalLevels(record.getLevel(), level)) {
+ hit = record;
}
}
}
assertNotNull("Could not find log message containing '" + needle + "'", hit);
- assertTrue(
- "Could not remove log message containing '" + needle + "'", loggedEvents.remove(hit));
+ assertTrue("Could not remove log message containing '" + needle + "'", records.remove(hit));
}
protected final void assertLogMessageContains(String needle) {
@@ -57,31 +56,33 @@
}
protected final void assertLogThrowableMessageContains(String needle) {
- LoggingEvent hit = null;
- Iterator<LoggingEvent> iter = loggedEvents.iterator();
+ LogRecord hit = null;
+ Iterator<LogRecord> iter = records.iterator();
while (hit == null && iter.hasNext()) {
- LoggingEvent event = iter.next();
+ LogRecord record = iter.next();
- if (event.getThrowableInformation().getThrowable().toString().contains(needle)) {
- hit = event;
+ Throwable t = record.getThrown();
+ if (t != null && t.toString().contains(needle)) {
+ hit = record;
}
}
assertNotNull("Could not find log message with a Throwable containing '" + needle + "'", hit);
assertTrue(
"Could not remove log message with a Throwable containing '" + needle + "'",
- loggedEvents.remove(hit));
+ records.remove(hit));
}
// As the PowerMock runner does not pass through runTest, we inject log
// verification through @After
@After
public final void assertNoUnassertedLogEvents() {
- if (loggedEvents.size() > 0) {
- LoggingEvent event = loggedEvents.iterator().next();
+ if (records.size() > 0) {
+ LogRecord record = records.iterator().next();
String msg = "Found untreated logged events. First one is:\n";
- msg += event.getRenderedMessage();
- if (event.getThrowableInformation() != null) {
- msg += "\n" + event.getThrowableInformation().getThrowable();
+ msg += record.getMessage();
+ Throwable t = record.getThrown();
+ if (t != null) {
+ msg += "\n" + t;
}
fail(msg);
}
@@ -90,7 +91,7 @@
@Override
public void setUp() throws Exception {
super.setUp();
- loggedEvents = Lists.newArrayList();
+ records = Lists.newArrayList();
// The logger we're interested is class name without the trailing "Test".
// While this is not the most general approach it is sufficient for now,
@@ -98,7 +99,7 @@
// to check.
String logName = this.getClass().getCanonicalName();
logName = logName.substring(0, logName.length() - 4);
- LogUtil.logToCollection(logName, loggedEvents);
+ LogUtil.logToCollection(logName, records, Level.DEBUG);
}
@Override
diff --git a/src/test/java/com/googlesource/gerrit/plugins/its/base/testutil/log/CollectionAppender.java b/src/test/java/com/googlesource/gerrit/plugins/its/base/testutil/log/CollectionAppender.java
index c122676..8d918b2 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/its/base/testutil/log/CollectionAppender.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/its/base/testutil/log/CollectionAppender.java
@@ -17,18 +17,19 @@
import com.google.common.collect.Lists;
import java.util.Collection;
import java.util.LinkedList;
+import java.util.logging.LogRecord;
import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.spi.LoggingEvent;
/** Log4j appender that logs into a list */
public class CollectionAppender extends AppenderSkeleton {
- private Collection<LoggingEvent> events;
+ private Collection<LogRecord> events;
public CollectionAppender() {
events = new LinkedList<>();
}
- public CollectionAppender(Collection<LoggingEvent> events) {
+ public CollectionAppender(Collection<LogRecord> events) {
this.events = events;
}
@@ -39,15 +40,20 @@
@Override
protected void append(LoggingEvent event) {
- if (!events.add(event)) {
- throw new RuntimeException("Could not append event " + event);
+ LogRecord logRecord = LogUtil.logRecordFromLog4jLoggingEvent(event);
+ append(logRecord);
+ }
+
+ public void append(LogRecord record) {
+ if (!events.add(record)) {
+ throw new RuntimeException("Could not append event " + record);
}
}
@Override
public void close() {}
- public Collection<LoggingEvent> getLoggedEvents() {
+ public Collection<LogRecord> getLoggedEvents() {
return Lists.newLinkedList(events);
}
}
diff --git a/src/test/java/com/googlesource/gerrit/plugins/its/base/testutil/log/LogUtil.java b/src/test/java/com/googlesource/gerrit/plugins/its/base/testutil/log/LogUtil.java
index 6cd633d..adccee8 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/its/base/testutil/log/LogUtil.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/its/base/testutil/log/LogUtil.java
@@ -14,18 +14,123 @@
package com.googlesource.gerrit.plugins.its.base.testutil.log;
+import com.google.common.collect.ImmutableMap;
import java.util.Collection;
+import java.util.logging.Handler;
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.apache.log4j.spi.LoggingEvent;
+import org.apache.log4j.spi.ThrowableInformation;
+/** Utility functions for dealing with various Loggers */
public class LogUtil {
+ private static final ImmutableMap<org.apache.log4j.Level, Level> log4jToJul =
+ new ImmutableMap.Builder<org.apache.log4j.Level, Level>()
+ .put(org.apache.log4j.Level.OFF, Level.OFF)
+ .put(org.apache.log4j.Level.FATAL, Level.SEVERE)
+ .put(org.apache.log4j.Level.ERROR, Level.SEVERE)
+ .put(org.apache.log4j.Level.WARN, Level.WARNING)
+ .put(org.apache.log4j.Level.INFO, Level.INFO)
+ .put(org.apache.log4j.Level.DEBUG, Level.FINE)
+ .put(org.apache.log4j.Level.TRACE, Level.FINEST)
+ .put(org.apache.log4j.Level.ALL, Level.FINEST)
+ .build();
+
+ /**
+ * Makes sure that Loggers for a given name add their events to a collection
+ *
+ * <p>This is useful for capturing logged events during testing and being able to run assertions
+ * on them.
+ *
+ * <p>We will never be able to cover all possible backends of the Logging flavour of the day. For
+ * now we cover Log4j and JUL. If you use a different default logging backend, please send in
+ * patches.
+ *
+ * @param logName The name of the loggers to make log to the given collection.
+ * @param collection The collection to add log events to.
+ * @param level The level the logger should be set to.
+ */
public static CollectionAppender logToCollection(
- String logName, Collection<LoggingEvent> collection) {
+ String logName, Collection<LogRecord> collection, org.apache.log4j.Level level) {
+
+ CollectionAppender appender = new CollectionAppender(collection);
+
+ logToCollectionLog4j(logName, appender, level);
+ logToCollectionJul(logName, appender, log4jToJul.get(level));
+
+ return appender;
+ }
+
+ /**
+ * Make a Log4j logger log to a given appender at a certain level
+ *
+ * @param logName The logger that should log to the appender.
+ * @param appender The appender to log to.
+ * @param level The level to user for the logger.
+ */
+ private static void logToCollectionLog4j(
+ String logName, CollectionAppender appender, org.apache.log4j.Level level) {
Logger log = LogManager.getLogger(logName);
- CollectionAppender listAppender = new CollectionAppender(collection);
+ log.setLevel(level);
log.removeAllAppenders();
- log.addAppender(listAppender);
- return listAppender;
+ log.addAppender(appender);
+ }
+
+ /**
+ * Make a java.util.logging logger log to a given appender at a certain level
+ *
+ * @param logName The logger that should log to the appender.
+ * @param appender The appender to log to.
+ * @param level The level to user for the logger.
+ */
+ private static void logToCollectionJul(String logName, CollectionAppender appender, Level level) {
+ java.util.logging.Logger julLogger = java.util.logging.Logger.getLogger(logName);
+ julLogger.setLevel(level);
+
+ julLogger.addHandler(
+ new Handler() {
+ @Override
+ public void publish(LogRecord record) {
+ appender.append(record);
+ }
+
+ @Override
+ public void flush() {}
+
+ @Override
+ public void close() throws SecurityException {}
+ });
+ }
+
+ /**
+ * Converts a Log4j Logging Event to a JUL LogRecord
+ *
+ * <p>This is not a full conversion, but covers only the fields we care about. That is the logged
+ * message and eventual thrown Throwables.
+ *
+ * @param event The Log4j LoggingEvent to convert
+ * @return The corresponding JUL LogRecord
+ */
+ public static LogRecord logRecordFromLog4jLoggingEvent(LoggingEvent event) {
+ LogRecord logRecord = new LogRecord(Level.ALL, event.getRenderedMessage());
+ ThrowableInformation tInfo = event.getThrowableInformation();
+ if (tInfo != null) {
+ logRecord.setThrown(tInfo.getThrowable());
+ }
+ return logRecord;
+ }
+
+ /**
+ * Check if a JUL and a Log4j Level correspond
+ *
+ * @param left The JUL Level to check.
+ * @param right The Log4j Level to check.
+ * @return True, if and only if the levels correspond.
+ */
+ public static boolean equalLevels(Level left, org.apache.log4j.Level right) {
+ Level julRight = log4jToJul.get(right);
+ return (left == null && right == null) || (left != null && left.equals(julRight));
}
}