package de.slackspace.alfa.domain; import java.util.Map; import java.util.regex.Pattern; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.microsoft.windowsazure.services.table.models.Entity; import de.slackspace.alfa.date.DateFormatter; public class LogEntryMapper implements EntryMapper { private static final Logger LOGGER = LoggerFactory.getLogger(LogEntryMapper.class); @Override public ElasticSearchEntry mapToEntry(Entity entity, Map<String, String> deploymentMap) { LogEntry entry = new LogEntry(); entry.setLevel(entity.getProperty("Level").getValue().toString()); entry.setPartitionKey(entity.getPartitionKey()); entry.setRowKey(entity.getRowKey()); entry.setDeploymentId(entity.getProperty("DeploymentId").getValue().toString()); entry.setEventId(entity.getProperty("EventId").getValue().toString()); entry.setRole(entity.getProperty("Role").getValue().toString()); entry.setRoleInstance(entity.getProperty("RoleInstance").getValue().toString()); entry.setTimestamp(entity.getTimestamp().getTime()); entry.setDateTime(DateFormatter.toYYYYMMDDHHMMSS(entity.getTimestamp())); entry.setElasticIndex(DateFormatter.toYYYYMMDD(entity.getTimestamp())); String name = deploymentMap.get(entry.getDeploymentId()); entry.setEnvironment(name); String message = entity.getProperty("Message").getValue().toString(); entry.setMessage(message); // format message to avoid ugly messages (Azure SDK >2.5) try { if(message.startsWith("EventName=")) { entry.setFormattedMessage(replacePlaceholders(message)); } } catch(Exception e) { LOGGER.error("Could not replace placeholders in message '" + message + "'. Leaving message as is.", e); entry.setFormattedMessage(message); } return entry; } public String replacePlaceholders(String originalMsg) { String msg = originalMsg; // remove everything until the second = int firstEqualIdx = msg.indexOf("="); int secondEqualIdx = msg.indexOf("=", firstEqualIdx + 1); msg = msg.substring(secondEqualIdx + 2); for (int i = 0; i < 20; i++) { if(msg.contains("{" + i + "}")) { // retrieve argument int argumentIdx = msg.indexOf("Argument" + i); int equalIdx = msg.indexOf("=", argumentIdx); int nextArgumentIdx = msg.indexOf(" Argument", equalIdx); String argumentValue; if(nextArgumentIdx > 0) { // substring from =" until ", leave out quote argumentValue = msg.substring(equalIdx + 2, nextArgumentIdx - 1); } else { // leave out quote argumentValue = msg.substring(equalIdx + 2, msg.length() - 1); } // remove argument from msg msg = msg.replace("Argument" + i + "=", ""); // remove argument value from msg msg = msg.replaceFirst(Pattern.quote("\"" + argumentValue + "\""), ""); // replace placeholder with argument value msg = msg.replace("{" + i + "}", argumentValue); } } // remove quotes msg = msg.replace("\"", ""); // remove WaWorkerHost msg = msg.replace("TraceSource=WaWorkerHost.exe", ""); return msg.trim(); } }