package se.fishtank; import java.net.URI; import java.util.Map; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.sift.Discriminator; import ch.qos.logback.core.spi.ContextAwareBase; public class AkkaSourceDiscriminator extends ContextAwareBase implements Discriminator { private String key; private String defaultValue; private String actorPathContains; private boolean onlyUseActorName = true; private boolean started = false; @Override public String getDiscriminatingValue(ILoggingEvent event) { Map mdc = event.getMDCPropertyMap(); if (mdc == null) return defaultValue; String value = mdc.get("akkaSource"); if (value == null || !value.contains(actorPathContains)) return defaultValue; String path = getPath(value); if (path == null || "/".equals(path)) return defaultValue; if (onlyUseActorName) { int idx = path.lastIndexOf('/'); if (idx == -1) return defaultValue; return path.substring(idx + 1); } else { if (path.charAt(0) == '/') path = path.substring(1); return path.replace('/', '-'); } } @Override public String getKey() { return key; } public void setKey(String key) { this.key = key; } public void setDefaultValue(String defaultValue) { this.defaultValue = defaultValue; } public void setActorPathContains(String actorPathContains) { this.actorPathContains = actorPathContains; } public void setOnlyUseActorName(String value) { if (value != null) { if ("true".equals(value)) { onlyUseActorName = true; } else if ("false".equals(value)) { onlyUseActorName = false; } else { throw new IllegalArgumentException("Expected \"true\" or \"false\" for property \"OnlyUseActorName\""); } } } @Override public void start() { started = isValid("Key", key) && isValid("DefaultValue", defaultValue) && isValid("ActorPathContains", actorPathContains); } @Override public void stop() { started = false; } @Override public boolean isStarted() { return started; } private String getPath(String akkaSource) { try { return new URI(akkaSource).getPath(); } catch (Exception e) { return null; } } private boolean isValid(String property, String value) { if (value == null || value.isEmpty()) { addError("The \"" + property + "\" property must be set"); return false; } return true; } }