All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.almworks.jira.structure.util.ConsiderateLogger Maven / Gradle / Ivy

There is a newer version: 17.25.3
Show newest version
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