diff --git a/events/pom.xml b/events/pom.xml index b6a0a3c540..17d8553a7f 100755 --- a/events/pom.xml +++ b/events/pom.xml @@ -20,6 +20,7 @@ email jpa jboss-logging + syslog mongo diff --git a/events/syslog/pom.xml b/events/syslog/pom.xml new file mode 100644 index 0000000000..4d5bf534df --- /dev/null +++ b/events/syslog/pom.xml @@ -0,0 +1,47 @@ + + + + keycloak-events-parent + org.keycloak + 1.2.0.Beta1-SNAPSHOT + + + 4.0.0 + + keycloak-events-syslog + Keycloak Events Syslog Provider + + + + + org.syslog4j + syslog4j + ${syslog4j.version} + provided + + + org.keycloak + keycloak-core + ${project.version} + provided + + + org.keycloak + keycloak-model-api + ${project.version} + provided + + + org.keycloak + keycloak-events-api + ${project.version} + provided + + + junit + junit + test + + + + diff --git a/events/syslog/src/main/java/org/keycloak/events/log/SysLoggingEventListenerProvider.java b/events/syslog/src/main/java/org/keycloak/events/log/SysLoggingEventListenerProvider.java new file mode 100755 index 0000000000..32ed137bc6 --- /dev/null +++ b/events/syslog/src/main/java/org/keycloak/events/log/SysLoggingEventListenerProvider.java @@ -0,0 +1,65 @@ +package org.keycloak.events.log; + +import java.util.Map; + +import org.keycloak.events.Event; +import org.keycloak.events.EventListenerProvider; +import org.productivity.java.syslog4j.SyslogConstants; +import org.productivity.java.syslog4j.SyslogIF; + +/** + * @author Giriraj Sharma + */ +public class SysLoggingEventListenerProvider implements EventListenerProvider { + + private final SyslogIF syslogger; + + public SysLoggingEventListenerProvider(SyslogIF syslogger) { + this.syslogger = syslogger; + } + + @Override + public void onEvent(Event event) { + int level = event.getError() != null ? SyslogConstants.LEVEL_ERROR : SyslogConstants.LEVEL_INFO; + + StringBuilder sb = new StringBuilder(); + + sb.append("type="); + sb.append(event.getType()); + sb.append(", realmId="); + sb.append(event.getRealmId()); + sb.append(", clientId="); + sb.append(event.getClientId()); + sb.append(", userId="); + sb.append(event.getUserId()); + sb.append(", ipAddress="); + sb.append(event.getIpAddress()); + + if (event.getError() != null) { + sb.append(", error="); + sb.append(event.getError()); + } + + if (event.getDetails() != null) { + for (Map.Entry e : event.getDetails().entrySet()) { + sb.append(", "); + sb.append(e.getKey()); + if (e.getValue() == null || e.getValue().indexOf(' ') == -1) { + sb.append("="); + sb.append(e.getValue()); + } else { + sb.append("='"); + sb.append(e.getValue()); + sb.append("'"); + } + } + } + + syslogger.log(level, sb.toString()); + } + + @Override + public void close() { + } + +} diff --git a/events/syslog/src/main/java/org/keycloak/events/log/SysLoggingEventListenerProviderFactory.java b/events/syslog/src/main/java/org/keycloak/events/log/SysLoggingEventListenerProviderFactory.java new file mode 100644 index 0000000000..15157f0be5 --- /dev/null +++ b/events/syslog/src/main/java/org/keycloak/events/log/SysLoggingEventListenerProviderFactory.java @@ -0,0 +1,47 @@ +package org.keycloak.events.log; + +import org.keycloak.Config; +import org.keycloak.events.EventListenerProvider; +import org.keycloak.events.EventListenerProviderFactory; +import org.keycloak.models.KeycloakSession; +import org.productivity.java.syslog4j.Syslog; +import org.productivity.java.syslog4j.SyslogIF; + +/** + * @author Giriraj Sharma + */ +public class SysLoggingEventListenerProviderFactory implements EventListenerProviderFactory { + + public static final String ID = "sys-logging"; + + private SyslogIF syslogger; + private String protocol; + private String host; + private int port; + + @Override + public EventListenerProvider create(KeycloakSession session) { + return new SysLoggingEventListenerProvider(syslogger); + } + + @Override + public void init(Config.Scope config) { + protocol = config.get("protocol"); + host = config.get("host"); + port = config.getInt("port"); + + syslogger = Syslog.getInstance(protocol); + syslogger.getConfig().setHost(host); + syslogger.getConfig().setPort(port); + } + + @Override + public void close() { + } + + @Override + public String getId() { + return ID; + } + +} diff --git a/events/syslog/src/main/resources/META-INF/services/org.keycloak.events.EventListenerProviderFactory b/events/syslog/src/main/resources/META-INF/services/org.keycloak.events.EventListenerProviderFactory new file mode 100644 index 0000000000..9c9938ca6a --- /dev/null +++ b/events/syslog/src/main/resources/META-INF/services/org.keycloak.events.EventListenerProviderFactory @@ -0,0 +1 @@ +org.keycloak.events.log.SysLoggingEventListenerProviderFactory \ No newline at end of file diff --git a/pom.xml b/pom.xml index 7ae9a0776e..7afa93790b 100755 --- a/pom.xml +++ b/pom.xml @@ -1,5 +1,5 @@ + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 4.0.0 Keycloak @@ -25,6 +25,7 @@ 1.0.2.Final 2.11.3 3.1.4.GA + 0.9.30 1.2.0.Beta1 1.0.1.Final 4.0.1.Final @@ -316,6 +317,11 @@ jboss-logging ${jboss.logging.version} + + org.syslog4j + syslog4j + ${syslog4j.version} + log4j log4j