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

org.molgenis.data.elasticsearch.logback.MolgenisAppender Maven / Gradle / Ivy

The newest version!
package org.molgenis.data.elasticsearch.logback;

import java.util.Date;
import java.util.Map;
import java.util.UUID;

import org.elasticsearch.action.bulk.BulkProcessor;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.common.unit.TimeValue;
import org.molgenis.data.Entity;
import org.molgenis.data.elasticsearch.ElasticsearchEntityFactory;
import org.molgenis.data.elasticsearch.factory.EmbeddedElasticSearchServiceFactory;
import org.molgenis.data.support.MapEntity;
import org.molgenis.util.ApplicationContextProvider;
import org.springframework.context.ApplicationContext;

import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.classic.spi.IThrowableProxy;
import ch.qos.logback.classic.spi.StackTraceElementProxy;
import ch.qos.logback.core.AppenderBase;
import ch.qos.logback.core.CoreConstants;

public class MolgenisAppender extends AppenderBase
{
	private static final String TRACE_PREFIX = CoreConstants.LINE_SEPARATOR + "    ";
	private static final TimeValue FLUSH_INTERVAL = TimeValue.timeValueSeconds(10);
	private static final String INDEX_NAME = "molgenis";

	private BulkProcessor bulkProcessor;
	private ElasticsearchEntityFactory elasticsearchEntityFactory;

	@Override
	protected void append(ILoggingEvent eventObject)
	{
		try
		{
			if (bulkProcessor == null)
			{
				ApplicationContext ctx = ApplicationContextProvider.getApplicationContext();
				if (ctx == null) return;

				EmbeddedElasticSearchServiceFactory embeddedElasticSearchServiceFactory = ctx
						.getBean(EmbeddedElasticSearchServiceFactory.class);

				bulkProcessor = BulkProcessor
						.builder(embeddedElasticSearchServiceFactory.getClient(), new BulkProcessor.Listener()
						{
							@Override
							public void beforeBulk(long executionId, BulkRequest request)
							{
							}

							@Override
							public void afterBulk(long executionId, BulkRequest request, BulkResponse response)
							{
							}

							@Override
							public void afterBulk(long executionId, BulkRequest request, Throwable failure)
							{
							}
						}).setFlushInterval(FLUSH_INTERVAL).build();

			}
			if (elasticsearchEntityFactory == null)
			{
				ApplicationContext ctx = ApplicationContextProvider.getApplicationContext();
				elasticsearchEntityFactory = ctx.getBean(ElasticsearchEntityFactory.class);
			}

			Entity entity = toEntity(eventObject);
			String id = entity.getString(LoggingEventMetaData.IDENTIFIER);
			Map source = elasticsearchEntityFactory.create(LoggingEventMetaData.INSTANCE, entity);

			bulkProcessor.add(new IndexRequest(INDEX_NAME, LoggingEventMetaData.INSTANCE.getName(), id).source(source));
		}
		catch (Throwable t)
		{
			t.printStackTrace();
		}
	}

	private Entity toEntity(ILoggingEvent eventObject)
	{
		Entity e = new MapEntity(LoggingEventMetaData.IDENTIFIER);
		e.set(LoggingEventMetaData.IDENTIFIER, UUID.randomUUID().toString());
		e.set(LoggingEventMetaData.THREAD, eventObject.getThreadName());
		if (eventObject.getLevel() != null)
		{
			e.set(LoggingEventMetaData.LEVEL, eventObject.getLevel().levelStr);
		}
		e.set(LoggingEventMetaData.LOGGER, eventObject.getLoggerName());
		e.set(LoggingEventMetaData.MESSAGE, eventObject.getMessage());
		e.set(LoggingEventMetaData.TIMESTAMP, new Date(eventObject.getTimeStamp()));
		if (eventObject.getThrowableProxy() != null)
		{
			e.set(LoggingEventMetaData.STACKTRACE, renderStacktrace(eventObject));
		}

		return e;
	}

	public String renderStacktrace(ILoggingEvent event)
	{
		StringBuilder sbuf = new StringBuilder();

		IThrowableProxy tp = event.getThrowableProxy();
		while (tp != null)
		{
			renderStacktrace(sbuf, tp);
			tp = tp.getCause();
		}

		return sbuf.toString();
	}

	private void renderStacktrace(StringBuilder sbuf, IThrowableProxy tp)
	{
		printFirstLine(sbuf, tp);

		int commonFrames = tp.getCommonFrames();
		StackTraceElementProxy[] stepArray = tp.getStackTraceElementProxyArray();

		for (int i = 0; i < stepArray.length - commonFrames; i++)
		{
			StackTraceElementProxy step = stepArray[i];
			sbuf.append(TRACE_PREFIX);
			sbuf.append(step.toString());
		}

		if (commonFrames > 0)
		{
			sbuf.append(TRACE_PREFIX);
			sbuf.append("\t... ").append(commonFrames).append(" common frames omitted");
		}
	}

	private void printFirstLine(StringBuilder sb, IThrowableProxy tp)
	{
		int commonFrames = tp.getCommonFrames();
		if (commonFrames > 0)
		{
			sb.append(CoreConstants.LINE_SEPARATOR).append(CoreConstants.CAUSED_BY);
		}
		sb.append(tp.getClassName()).append(": ").append(tp.getMessage());
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy