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)); } }