From e3c9709ee9898cf21ef475a9b3c437900e356e11 Mon Sep 17 00:00:00 2001 From: Negar Safinianaini Date: Tue, 9 Feb 2016 13:33:11 +0100 Subject: [PATCH] Implemented compatibility with frame header. Frame header is for instance used by syslog() driver in syslog-ng server and is used to support RFC5424. --- .../impl/net/tcp/TCPNetSyslogConfig.java | 19 ++++++++++++++ .../impl/net/tcp/TCPNetSyslogConfigIF.java | 4 +++ .../impl/net/tcp/TCPNetSyslogWriter.java | 25 ++++++++++++------- .../impl/unix/socket/UnixSocketSyslog.java | 7 ++++++ 4 files changed, 46 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/graylog2/syslog4j/impl/net/tcp/TCPNetSyslogConfig.java b/src/main/java/org/graylog2/syslog4j/impl/net/tcp/TCPNetSyslogConfig.java index f80dee9..5a63cb6 100644 --- a/src/main/java/org/graylog2/syslog4j/impl/net/tcp/TCPNetSyslogConfig.java +++ b/src/main/java/org/graylog2/syslog4j/impl/net/tcp/TCPNetSyslogConfig.java @@ -45,6 +45,17 @@ public class TCPNetSyslogConfig extends AbstractNetSyslogConfig implements TCPNe protected int freshConnectionInterval = TCP_FRESH_CONNECTION_INTERVAL_DEFAULT; + /** + * useFrameHeader flag enables frame header. + * + * Frame header is sometimes used when writing the syslog message (for example in syslog-ng server syslog() driver). + * It does not allow delimiterSequence; its structure is : digit(size of message byte array) + space + syslog message + * e.g. where the size of message (byte array) is 89: + * 89 <165>1 2003-10-11T22:14:15.003Z mymachine.example.com evntslog - ID47 [exampleSDID@32473] + * + */ + private boolean useFrameHeader; + public TCPNetSyslogConfig() { initialize(); } @@ -149,6 +160,14 @@ public class TCPNetSyslogConfig extends AbstractNetSyslogConfig implements TCPNe public void setFreshConnectionInterval(int freshConnectionInterval) { this.freshConnectionInterval = freshConnectionInterval; } + + public void setUseFrameHeader(boolean useFrameHeader) { + this.useFrameHeader = useFrameHeader; + } + + public boolean isUseFrameHeader() { + return this.useFrameHeader; + } public Class getSyslogWriterClass() { return TCPNetSyslogWriter.class; diff --git a/src/main/java/org/graylog2/syslog4j/impl/net/tcp/TCPNetSyslogConfigIF.java b/src/main/java/org/graylog2/syslog4j/impl/net/tcp/TCPNetSyslogConfigIF.java index 66b00c9..5e5ea65 100644 --- a/src/main/java/org/graylog2/syslog4j/impl/net/tcp/TCPNetSyslogConfigIF.java +++ b/src/main/java/org/graylog2/syslog4j/impl/net/tcp/TCPNetSyslogConfigIF.java @@ -45,4 +45,8 @@ public interface TCPNetSyslogConfigIF extends AbstractNetSyslogConfigIF { public int getFreshConnectionInterval(); public void setFreshConnectionInterval(int interval); + + public void setUseFrameHeader(boolean useFrameHeader); + + public boolean isUseFrameHeader(); } diff --git a/src/main/java/org/graylog2/syslog4j/impl/net/tcp/TCPNetSyslogWriter.java b/src/main/java/org/graylog2/syslog4j/impl/net/tcp/TCPNetSyslogWriter.java index aa7e84a..0401e7c 100644 --- a/src/main/java/org/graylog2/syslog4j/impl/net/tcp/TCPNetSyslogWriter.java +++ b/src/main/java/org/graylog2/syslog4j/impl/net/tcp/TCPNetSyslogWriter.java @@ -129,7 +129,6 @@ public class TCPNetSyslogWriter extends AbstractSyslogWriter { public void write(byte[] message) throws SyslogRuntimeException { Socket currentSocket = null; - int attempts = 0; while (attempts != -1 && attempts < (this.tcpNetSyslogConfig.getWriteRetries() + 1)) { try { @@ -140,17 +139,25 @@ public class TCPNetSyslogWriter extends AbstractSyslogWriter { } OutputStream os = currentSocket.getOutputStream(); - - if (this.tcpNetSyslogConfig.isSetBufferSize()) { - currentSocket.setSendBufferSize(message.length); + + String frameHeader = ""; + if(this.tcpNetSyslogConfig.isUseFrameHeader()){ + frameHeader = message.length + " "; } - + + if (this.tcpNetSyslogConfig.isSetBufferSize()) { + currentSocket.setSendBufferSize(message.length + frameHeader.length()); + } + + os.write(frameHeader.getBytes()); os.write(message); - byte[] delimiterSequence = this.tcpNetSyslogConfig.getDelimiterSequence(); - if (delimiterSequence != null && delimiterSequence.length > 0) { - os.write(delimiterSequence); - } + if(!this.tcpNetSyslogConfig.isUseFrameHeader()) { + byte[] delimiterSequence = this.tcpNetSyslogConfig.getDelimiterSequence(); + if (delimiterSequence != null && delimiterSequence.length > 0) { + os.write(delimiterSequence); + } + } this.syslog.setBackLogStatus(false); diff --git a/src/main/java/org/graylog2/syslog4j/impl/unix/socket/UnixSocketSyslog.java b/src/main/java/org/graylog2/syslog4j/impl/unix/socket/UnixSocketSyslog.java index c8f43b0..5c1a2f8 100644 --- a/src/main/java/org/graylog2/syslog4j/impl/unix/socket/UnixSocketSyslog.java +++ b/src/main/java/org/graylog2/syslog4j/impl/unix/socket/UnixSocketSyslog.java @@ -1,6 +1,7 @@ package org.graylog2.syslog4j.impl.unix.socket; import java.nio.ByteBuffer; +import java.util.List; import org.graylog2.syslog4j.SyslogRuntimeException; import org.graylog2.syslog4j.impl.AbstractSyslog; @@ -39,6 +40,12 @@ public class UnixSocketSyslog extends AbstractSyslog { System.arraycopy(sunPath.getBytes(), 0, this.sun_path, 0, sunPath.length()); System.arraycopy(ZERO_BYTE, 0, this.sun_path, sunPath.length(), 1); } + + @Override + protected List getFieldOrder() { + // TODO Auto-generated method stub + return null; + } } protected interface CLibrary extends Library {