//Dstl (c) Crown Copyright 2017
package uk.gov.dstl.baleen.core.history.logging;
import java.time.Instant;
import org.apache.uima.fit.descriptor.ConfigurationParameter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import uk.gov.dstl.baleen.core.history.AbstractBaleenHistory;
import uk.gov.dstl.baleen.core.history.DocumentHistory;
import uk.gov.dstl.baleen.core.history.HistoryEvent;
import uk.gov.dstl.baleen.exceptions.BaleenException;
/**
* A history implement which outputs history events to the logger.
*
* This history system does not allow history to be read back into the
* application, hence the get methods return empty collections.
*
*
* @baleen.javadoc
*/
public class LoggingBaleenHistory extends AbstractBaleenHistory {
private static final Logger LOGGER = LoggerFactory.getLogger(LoggingBaleenHistory.class);
private static final String DEFAULT_FORMAT = "{} [{}-{}] {}:{}";
/**
* The log level to output.
* Valid values are trace, debug, info, warn and error.
*
* @baleen.config info
*/
public static final String PARAM_LEVEL = "history.level";
@ConfigurationParameter(name = PARAM_LEVEL, defaultValue = "info")
private String loggerLevel;
/**
* The name of the logger
*
* @baleen.config history
*/
public static final String PARAM_NAME = "history.name";
@ConfigurationParameter(name = PARAM_NAME, defaultValue = "history")
private String loggerName;
private Logger historyLogger;
/**
* New instance
*
*/
public LoggingBaleenHistory() {
//Empty constructor, do nothing
}
@Override
protected void initialize() throws BaleenException {
super.initialize();
// (re)setting this way makes sure it's non-null
setLevel(loggerLevel);
historyLogger = LoggerFactory.getLogger(loggerName);
LOGGER.info("Configured a logging history with name '{}' at level '{}'", loggerName, loggerLevel);
}
@Override
public void destroy() {
super.destroy();
historyLogger = null;
}
@Override
public DocumentHistory getHistory(String documentId) {
return new LoggingDocumentHistory(this, documentId);
}
@Override
public void closeHistory(String documentId) {
// Do nothing
}
/** Set the current logging level.
* @param level (trace,debug,warn,error)
*/
public void setLevel(String level) {
this.loggerLevel = level != null ? level : "info";
}
/** Get the current logging level
* @return the level
*/
public String getLevel() {
return this.loggerLevel;
}
/**
* Add the event to the specific document.
*
* @param documentId
* the document id
* @param event
* the event to add to the document
*/
public void add(String documentId, HistoryEvent event) {
if (historyLogger == null) {
LOGGER.error("Logging history event withouth an initialised logger");
return;
}
switch (loggerLevel) {
case "warn":
historyLogger.warn(DEFAULT_FORMAT, Instant.ofEpochMilli(event.getTimestamp()), documentId, event
.getRecordable().getInternalId(), event.getReferrer(), event.getAction());
break;
case "error":
historyLogger.error(DEFAULT_FORMAT, Instant.ofEpochMilli(event.getTimestamp()), documentId, event
.getRecordable().getInternalId(), event.getReferrer(), event.getAction());
break;
case "trace":
historyLogger.trace(DEFAULT_FORMAT, Instant.ofEpochMilli(event.getTimestamp()), documentId, event
.getRecordable().getInternalId(), event.getReferrer(), event.getAction());
break;
case "info":
default:
historyLogger.info(DEFAULT_FORMAT, Instant.ofEpochMilli(event.getTimestamp()), documentId, event
.getRecordable().getInternalId(), event.getReferrer(), event.getAction());
break;
}
}
}