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