package com.constellio.data.dao.services;
import static java.util.Arrays.asList;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrInputDocument;
import org.apache.solr.common.params.SolrParams;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.constellio.data.dao.dto.records.RecordDTO;
import com.constellio.data.dao.dto.records.RecordDeltaDTO;
import com.constellio.data.dao.dto.records.TransactionDTO;
import com.constellio.data.dao.services.bigVault.solr.BigVaultServerTransaction;
import com.constellio.data.utils.LoggerUtils;
public class DataLayerLogger {
private static final Logger LOGGER = LoggerFactory.getLogger(DataLayerLogger.class);
private List<String> monitoredIds = new ArrayList<>();
private int printAllQueriesLongerThanMS = 100;
private int slowQueryDuration = 1000;
private int verySlowQueryDuration = 2000;
private boolean logAllTransactions = false;
public void logQueryResponse(SolrParams params, QueryResponse response) {
String prefix = null;
if (response.getQTime() >= verySlowQueryDuration) {
prefix = "VERY SLOW QUERY : ";
} else if (response.getQTime() >= slowQueryDuration) {
prefix = "SLOW QUERY : ";
} else if (response.getQTime() >= printAllQueriesLongerThanMS) {
prefix = "QUERY : ";
}
if (prefix != null) {
LOGGER.info(prefix + "qtime=" + response.getQTime() + ", numfound=" + response.getResults().getNumFound()
+ ", query=' : '" + LoggerUtils.toParamsString(params) + "'");
}
}
public void logTransaction(TransactionDTO transaction) {
StringBuilder logBuilder = new StringBuilder();
for (RecordDTO recordDTO : transaction.getNewRecords()) {
if (logAllTransactions || monitoredIds.contains(recordDTO.getId())) {
logBuilder.append("\n\t" + toString(recordDTO));
}
}
for (RecordDeltaDTO recordDeltaDTO : transaction.getModifiedRecords()) {
if (logAllTransactions || monitoredIds.contains(recordDeltaDTO.getId())) {
logBuilder.append("\n\t" + toString(recordDeltaDTO));
}
}
String log = logBuilder.toString();
if (!log.isEmpty()) {
LOGGER.info("Transaction #" + transaction.getTransactionId() + log);
}
}
public void logTransaction(BigVaultServerTransaction transaction) {
StringBuilder logBuilder = new StringBuilder();
for (SolrInputDocument recordDTO : transaction.getNewDocuments()) {
String id = (String) recordDTO.getFieldValue("id");
if (logAllTransactions || monitoredIds.contains(id)) {
logBuilder.append("\n\t" + toString(recordDTO));
}
}
for (SolrInputDocument recordDTO : transaction.getUpdatedDocuments()) {
String id = (String) recordDTO.getFieldValue("id");
if (logAllTransactions || monitoredIds.contains(id)) {
logBuilder.append("\n\t" + toString(recordDTO));
}
}
String log = logBuilder.toString();
if (!log.isEmpty()) {
LOGGER.info("Transaction #" + transaction.getTransactionId() + log);
}
}
private static List<String> hiddenFieldsInLogs = asList("modifiedOn_dt", "createdOn_dt");
private String toString(RecordDeltaDTO recordDeltaDTO) {
StringBuilder log = new StringBuilder();
log.append(recordDeltaDTO.getId() + ">> ");
for (String modifiedField : recordDeltaDTO.getModifiedFields().keySet()) {
if (!hiddenFieldsInLogs.contains(modifiedField)) {
log.append(modifiedField);
log.append(":");
log.append(recordDeltaDTO.getInitialFields().get(modifiedField));
log.append("=>");
log.append(recordDeltaDTO.getModifiedFields().get(modifiedField));
log.append("; ");
}
}
return log.toString();
}
private String toString(RecordDTO recordDTO) {
StringBuilder log = new StringBuilder();
log.append(recordDTO.getId() + ">> ");
for (Map.Entry<String, Object> field : recordDTO.getFields().entrySet()) {
if (!hiddenFieldsInLogs.contains(field.getKey())) {
log.append(field.getKey());
log.append(":");
log.append(field.getValue());
log.append("; ");
}
}
for (Map.Entry<String, Object> field : recordDTO.getCopyFields().entrySet()) {
if (!hiddenFieldsInLogs.contains(field.getKey())) {
log.append(field.getKey());
log.append(":");
log.append(field.getValue());
log.append("; ");
}
}
return log.toString();
}
private String toString(SolrInputDocument document) {
StringBuilder log = new StringBuilder();
String id = (String) document.getFieldValue("id");
log.append(id + ">> ");
for (String fieldName : document.getFieldNames()) {
Object fieldValues = document.getFieldValues(fieldName);
if (!hiddenFieldsInLogs.contains(fieldName)) {
log.append(fieldName);
log.append(":");
log.append(fieldValues);
log.append("; ");
}
}
return log.toString();
}
public void setMonitoredIds(List<String> monitoredIds) {
this.monitoredIds = monitoredIds;
}
public void monitor(String monitoredId) {
this.monitoredIds.add(monitoredId);
}
public void setPrintAllQueriesLongerThanMS(int printAllQueriesLongerThanMS) {
this.printAllQueriesLongerThanMS = printAllQueriesLongerThanMS;
}
public void logAllTransactions() {
this.logAllTransactions = true;
}
public void setSlowQueryDuration(int slowQueryDuration) {
this.slowQueryDuration = slowQueryDuration;
}
public void setVerySlowQueryDuration(int verySlowQueryDuration) {
this.verySlowQueryDuration = verySlowQueryDuration;
}
}