
com.almworks.jira.structure.util.ConsiderateLogger Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of structure-api Show documentation
Show all versions of structure-api Show documentation
Public API for the Structure Plugin for JIRA
package com.almworks.jira.structure.util;
import org.slf4j.Logger;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;
/**
* Utility class that is used to log errors that are likely to happen often. Muffles repetitive errors.
*/
public class ConsiderateLogger {
private static long DEFAULT_INTERVAL = TimeUnit.MINUTES.toNanos(5);
private final Logger myLogger;
private final ConcurrentMap myStats = new ConcurrentHashMap<>();
private volatile long myInterval = DEFAULT_INTERVAL;
public ConsiderateLogger(Logger logger) {
myLogger = logger;
}
public ConsiderateLogger(Logger logger, long interval) {
myLogger = logger;
myInterval = interval;
}
public void warn(String source, String message) {
if (acceptWarning(source)) {
myLogger.warn(source + " " + message);
}
}
public void warn(String source, String message, Throwable throwable) {
if (acceptWarning(source)) {
myLogger.warn(source + " " + message, throwable);
}
}
private boolean acceptWarning(String source) {
SourceStats stats = myStats.get(source);
if (stats == null) {
stats = new SourceStats(source);
myStats.putIfAbsent(source, stats);
}
return stats.acceptWarning();
}
public void reset() {
myStats.clear();
}
public void setInterval(long interval) {
myInterval = interval;
}
private class SourceStats {
private final String mySource;
private final AtomicInteger myCount = new AtomicInteger();
private volatile long myLastLogTime;
public SourceStats(String source) {
mySource = source;
}
public boolean acceptWarning() {
long now = System.nanoTime();
if (myLastLogTime != 0 && now - myLastLogTime <= myInterval) {
myCount.incrementAndGet();
return false;
}
myLastLogTime = now;
int count = myCount.getAndSet(0);
if (count > 0) {
myLogger.warn(count + " warnings from " + mySource + " were not shown");
}
return true;
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy