diff --git a/src/main/java/com/cloudbees/syslog/MessageFormat.java b/src/main/java/com/cloudbees/syslog/MessageFormat.java index 5e03f09..23f336e 100644 --- a/src/main/java/com/cloudbees/syslog/MessageFormat.java +++ b/src/main/java/com/cloudbees/syslog/MessageFormat.java @@ -28,5 +28,9 @@ public enum MessageFormat { /** * RFC 5424 - The Syslog Protocol */ - RFC_5424 + RFC_5424, + /** + * RFC 5425 - Transport Layer Security (TLS) Transport Mapping for Syslog + */ + RFC_5425 } diff --git a/src/main/java/com/cloudbees/syslog/SyslogMessage.java b/src/main/java/com/cloudbees/syslog/SyslogMessage.java index f9a4e6d..765ccb2 100755 --- a/src/main/java/com/cloudbees/syslog/SyslogMessage.java +++ b/src/main/java/com/cloudbees/syslog/SyslogMessage.java @@ -17,12 +17,14 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; + import java.io.CharArrayWriter; import java.io.IOException; import java.io.StringWriter; import java.io.Writer; import java.net.InetAddress; import java.net.UnknownHostException; +import java.nio.charset.StandardCharsets; import java.util.Date; import java.util.HashSet; import java.util.Locale; @@ -249,6 +251,8 @@ public String toSyslogMessage(MessageFormat messageFormat) { return toRfc3164SyslogMessage(); case RFC_5424: return toRfc5424SyslogMessage(); + case RFC_5425: + return toRfc5425SyslogMessage(); default: throw new IllegalStateException("Unsupported message format '" + messageFormat + "'"); } @@ -269,11 +273,40 @@ public void toSyslogMessage(@Nonnull MessageFormat messageFormat, @Nonnull Write case RFC_5424: toRfc5424SyslogMessage(out); break; + case RFC_5425: + toRfc5425SyslogMessage(out); + break; default: throw new IllegalStateException("Unsupported message format '" + messageFormat + "'"); } } + /** + * Generates an RFC-5425 message. + */ + public String toRfc5425SyslogMessage() { + + StringWriter sw = new StringWriter(msg == null ? 32 : msg.size() + 32); + try { + toRfc5425SyslogMessage(sw); + } catch (IOException e) { + throw new IllegalStateException(e); + } + return sw.toString(); + } + + /** + * Generates an RFC-5425 message. + */ + public void toRfc5425SyslogMessage(Writer out) throws IOException { + + String rfc5424Message = toRfc5424SyslogMessage(); + int length = rfc5424Message.getBytes(StandardCharsets.UTF_8).length; + out.write(String.valueOf(length)); + out.write(SP); + out.write(rfc5424Message); + } + /** * Generates an RFC-5424 message. */ diff --git a/src/test/java/com/cloudbees/syslog/SyslogMessageTest.java b/src/test/java/com/cloudbees/syslog/SyslogMessageTest.java index 576ed77..3f615cb 100755 --- a/src/test/java/com/cloudbees/syslog/SyslogMessageTest.java +++ b/src/test/java/com/cloudbees/syslog/SyslogMessageTest.java @@ -28,6 +28,35 @@ */ public class SyslogMessageTest { + @Test + public void testRfc5425Format() throws Exception { + // GIVEN + Calendar cal = Calendar.getInstance(); + cal.setTimeZone(TimeZone.getTimeZone("GMT")); + cal.set(2013, Calendar.DECEMBER, 5, 10, 30, 5); + cal.set(Calendar.MILLISECOND, 0); + + System.out.println(SyslogMessage.rfc3339DateFormat.format(cal.getTime())); + System.out.println(cal.getTimeInMillis()); + + + SyslogMessage message = new SyslogMessage() + .withTimestamp(cal.getTimeInMillis()) + .withAppName("my_app") + .withHostname("myserver.example.com") + .withFacility(Facility.USER) + .withSeverity(Severity.INFORMATIONAL) + .withTimestamp(cal.getTimeInMillis()) + .withMsg("a syslog message"); + + // WHEN + String actual = message.toRfc5425SyslogMessage(); + + // THEN + String expected = "81 <14>1 2013-12-05T10:30:05.000Z myserver.example.com my_app - - - a syslog message"; + assertThat(actual, is(expected)); + } + @Test public void testRfc5424Format() throws Exception {