diff --git a/pom.xml b/pom.xml
index 6218c0f10..f35a79dd4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -53,16 +53,17 @@
dropwizard-metrics-graphite
${dropwizard.version}
-
- com.papertrailapp
- logback-syslog4j
- 1.0.0
-
org.bouncycastle
bcprov-jdk16
1.46
+
+ org.syslog4j
+ syslog4j
+ 0.9.30
+
+
com.amazonaws
diff --git a/src/main/java/org/whispersystems/textsecuregcm/metrics/LoggingNetworkAppenderFactory.java b/src/main/java/org/whispersystems/textsecuregcm/metrics/LoggingNetworkAppenderFactory.java
index 1e7fa7cd1..8070ba026 100644
--- a/src/main/java/org/whispersystems/textsecuregcm/metrics/LoggingNetworkAppenderFactory.java
+++ b/src/main/java/org/whispersystems/textsecuregcm/metrics/LoggingNetworkAppenderFactory.java
@@ -1,22 +1,28 @@
package org.whispersystems.textsecuregcm.metrics;
-import ch.qos.logback.classic.LoggerContext;
-import ch.qos.logback.classic.spi.ILoggingEvent;
-import ch.qos.logback.core.Appender;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonTypeName;
-import com.papertrailapp.logback.Syslog4jAppender;
+import org.hibernate.validator.constraints.NotEmpty;
+import org.productivity.java.syslog4j.SyslogConfigIF;
+import org.productivity.java.syslog4j.SyslogIF;
+import org.productivity.java.syslog4j.SyslogRuntimeException;
+import org.productivity.java.syslog4j.impl.net.tcp.ssl.SSLTCPNetSyslogConfig;
+
+import javax.validation.constraints.NotNull;
+import java.util.TimeZone;
+
+import ch.qos.logback.classic.LoggerContext;
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.classic.util.LevelToSyslogSeverity;
+import ch.qos.logback.core.Appender;
+import ch.qos.logback.core.AppenderBase;
+import ch.qos.logback.core.Layout;
import io.dropwizard.logging.AbstractAppenderFactory;
import io.dropwizard.logging.async.AsyncAppenderFactory;
import io.dropwizard.logging.filter.LevelFilterFactory;
import io.dropwizard.logging.layout.LayoutFactory;
import io.dropwizard.validation.PortRange;
-import org.hibernate.validator.constraints.NotEmpty;
-import org.productivity.java.syslog4j.impl.net.tcp.ssl.SSLTCPNetSyslogConfig;
-
-import javax.validation.constraints.NotNull;
-import java.util.TimeZone;
@JsonTypeName("papertrail")
public class LoggingNetworkAppenderFactory extends AbstractAppenderFactory {
@@ -118,4 +124,75 @@ public class LoggingNetworkAppenderFactory extends AbstractAppenderFactory extends AppenderBase {
+ SyslogIF syslog;
+ SyslogConfigIF syslogConfig;
+ Layout layout;
+
+ @Override
+ protected void append(E loggingEvent) {
+ syslog.log(getSeverityForEvent(loggingEvent), layout.doLayout(loggingEvent));
+ }
+
+ @Override
+ public void start() {
+ super.start();
+
+ synchronized (this) {
+ try {
+ Class syslogClass = syslogConfig.getSyslogClass();
+ syslog = (SyslogIF) syslogClass.newInstance();
+
+ syslog.initialize(syslogClass.getSimpleName(), syslogConfig);
+ } catch (ClassCastException | IllegalAccessException | InstantiationException cse) {
+ throw new SyslogRuntimeException(cse);
+ }
+ }
+ }
+
+ @Override
+ public void stop() {
+ super.stop();
+
+ synchronized(this) {
+ if (syslog != null) {
+ syslog.shutdown();
+ syslog = null;
+ }
+ }
+ }
+
+ /**
+ * Convert a level to equivalent syslog severity. Only levels for printing
+ * methods i.e DEBUG, WARN, INFO and ERROR are converted.
+ *
+ * @see ch.qos.logback.core.net.SyslogAppenderBase#getSeverityForEvent(java.lang.Object)
+ */
+ public int getSeverityForEvent(Object eventObject) {
+ if (eventObject instanceof ILoggingEvent) {
+ ILoggingEvent event = (ILoggingEvent) eventObject;
+ return LevelToSyslogSeverity.convert(event);
+ } else {
+ return SyslogIF.LEVEL_INFO;
+ }
+ }
+
+ public SyslogConfigIF getSyslogConfig() {
+ return syslogConfig;
+ }
+
+ public void setSyslogConfig(SyslogConfigIF syslogConfig) {
+ this.syslogConfig = syslogConfig;
+ }
+
+ public Layout getLayout() {
+ return layout;
+ }
+
+ public void setLayout(Layout layout) {
+ this.layout = layout;
+ }
+ }
}
\ No newline at end of file