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

la.serendipity.ThreadMemoryzeAppender Maven / Gradle / Ivy

The newest version!
package la.serendipity;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;

import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.classic.spi.LoggingEvent;
import ch.qos.logback.core.UnsynchronizedAppenderBase;
import la.serendipity.thread_memorize_appender.internal.EvictionList;
import lombok.Getter;
import lombok.NonNull;
import lombok.Setter;
import lombok.val;

public class ThreadMemoryzeAppender extends UnsynchronizedAppenderBase {
	private static final int MEMORY_SIZE = 1024;
	private static final ThreadLocal> THREAD_LOCAL = new InheritableThreadLocal>() {
		@Override
		protected EvictionList initialValue() {
			return new EvictionList(MEMORY_SIZE);
		};
	};

	@Override
	protected void append(Object eventObject) {
		val loggingEvent = (LoggingEvent)eventObject;
		if (!targetThreadPattern.matcher(loggingEvent.getThreadName()).matches()) {
			return;
		}

		val memory = THREAD_LOCAL.get();
		if (memory.size() >= MEMORY_SIZE) {
			return;
		}

		memory.add(loggingEvent);
	}

	@Setter
	@Getter
	@NonNull
	PatternLayoutEncoder encoder = new PatternLayoutEncoder();

	@Getter
	@NonNull
	Pattern targetThreadPattern = Pattern.compile(".*");

	public void setTargetThread(final String targetThreadRegex) {
		targetThreadPattern = Pattern.compile(targetThreadRegex);
	}

	public static List getMemorized() {
		return new ArrayList<>(THREAD_LOCAL.get());
	}

	public static void remove() {
		THREAD_LOCAL.remove();
	}
}