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

com.alicp.jetcache.support.SquashedLogger Maven / Gradle / Ivy

The newest version!
/**
 * Created on 2022/7/6.
 */
package com.alicp.jetcache.support;

import org.slf4j.Logger;

import java.time.Duration;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicLong;

/**
 * @author huangli
 */
public class SquashedLogger {
    private static final int DEFAULT_INTERVAL_SECONDS = 10;

    private static final ConcurrentHashMap MAP = new ConcurrentHashMap<>();
    private final Logger logger;
    private final long interval;

    private final AtomicLong lastLogTime;

    private SquashedLogger(Logger logger, int intervalSeconds) {
        this.logger = logger;
        this.interval = Duration.ofSeconds(intervalSeconds).toNanos();
        this.lastLogTime = new AtomicLong(System.nanoTime() - interval);
    }

    public static SquashedLogger getLogger(Logger target, int intervalSeconds) {
        SquashedLogger result = MAP.get(target);
        if (result == null) {
            result = MAP.computeIfAbsent(target, k -> new SquashedLogger(k, intervalSeconds));
        }
        return result;
    }

    public static SquashedLogger getLogger(Logger target) {
        return getLogger(target, DEFAULT_INTERVAL_SECONDS);
    }

    private boolean shouldLogEx() {
        long now = System.nanoTime();
        long last = lastLogTime.get();
        if (Math.abs(now - last) >= interval) {
            return lastLogTime.compareAndSet(last, now);
        } else {
            return false;
        }
    }

    public void error(CharSequence msg, Throwable e) {
        if (shouldLogEx()) {
            logger.error(msg.toString(), e);
        } else {
            StringBuilder sb;
            if (msg instanceof StringBuilder) {
                sb = (StringBuilder) msg;
            } else {
                sb = new StringBuilder(msg.length() + 256);
                sb.append(msg);
            }
            sb.append(' ');
            int i = 0;
            while (e != null && i++ < 20) {
                sb.append(e);
                e = e.getCause();
                if (e != null) {
                    sb.append("\ncause by ");
                }
            }
            logger.error(sb.toString());
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy