INT-3712: Syslog: fix pattern according RFC 3164

JIRA: https://jira.spring.io/browse/INT-3712

Add `@author Karol Dowbecki` to affected classes
This commit is contained in:
Karol Dowbecki
2015-05-06 13:32:22 +03:00
committed by Artem Bilan
parent e5f03d4d4b
commit 8059566b9b
3 changed files with 60 additions and 49 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2014 the original author or authors.
* Copyright 2002-2015 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -26,6 +26,7 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
/**
* Transforms a packet in Syslog (RFC3164) format to a Map.
@@ -35,6 +36,7 @@ import org.springframework.util.Assert;
*
* @author Gary Russell
* @author Artem Bilan
* @author Karol Dowbecki
* @since 2.2
*
*/
@@ -54,7 +56,7 @@ public class SyslogToMapTransformer extends AbstractPayloadTransformer<Object, M
public static final String UNDECODED = "UNDECODED";
private final Pattern pattern = Pattern.compile("<([^>]+)>(.{15}) ([^ ]+) (?:([^:]+): )?(.*)", Pattern.DOTALL);
private final Pattern pattern = Pattern.compile("<([^>]+)>(.{15}) ([^ ]+) ([a-zA-Z0-9]{0,32})(.*)", Pattern.DOTALL);
private final SimpleDateFormat dateFormat = new SimpleDateFormat("MMM dd HH:mm:ss");
@@ -126,7 +128,7 @@ public class SyslogToMapTransformer extends AbstractPayloadTransformer<Object, M
map.put(TIMESTAMP, timestamp);
}
map.put(HOST, matcher.group(3));
if (matcher.group(4) != null) {
if (StringUtils.isNotEmpty(matcher.group(4))) {
map.put(TAG, matcher.group(4));
}
map.put(MESSAGE, matcher.group(5));

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2012 the original author or authors.
* Copyright 2012-2015 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -35,6 +35,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* @author Gary Russell
* @author Artem Bilan
* @author Karol Dowbecki
* @since 2.2
*
*/
@@ -59,7 +60,8 @@ public class SyslogTransformerParserTests {
Object date = map.get(SyslogToMapTransformer.TIMESTAMP);
assertTrue(date instanceof Date || date instanceof String);
assertEquals("WEBERN", map.get(SyslogToMapTransformer.HOST));
assertEquals("TESTING[70729]", map.get(SyslogToMapTransformer.TAG));
assertEquals("TEST SYSLOG MESSAGE", map.get(SyslogToMapTransformer.MESSAGE));
assertEquals("TESTING", map.get(SyslogToMapTransformer.TAG));
assertEquals("[70729]: TEST SYSLOG MESSAGE", map.get(SyslogToMapTransformer.MESSAGE));
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2014 the original author or authors.
* Copyright 2002-2015 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -27,69 +27,53 @@ import org.junit.Test;
/**
* @author Gary Russell
* @author Artem Bilan
* @author Karol Dowbecki
* @since 2.2
*
*/
public class SysLogTransformerTests {
private SyslogToMapTransformer sut = new SyslogToMapTransformer();
@Test
public void testMap() throws Exception {
SyslogToMapTransformer t = new SyslogToMapTransformer();
Map<String, ?> transformed = t.transformPayload(
"<158>JUL 26 22:08:35 WEBERN TESTING[70729]: TEST SYSLOG MESSAGE".getBytes());
String syslog = "<158>JUL 26 22:08:35 WEBERN TESTING[70729]: TEST SYSLOG MESSAGE";
Map<String, ?> transformed = sut.transformPayload(syslog.getBytes());
assertEquals(6, transformed.size());
assertEquals(19, transformed.get(SyslogToMapTransformer.FACILITY));
assertEquals(6, transformed.get(SyslogToMapTransformer.SEVERITY));
Object date = transformed.get(SyslogToMapTransformer.TIMESTAMP);
assertTrue(date instanceof Date || date instanceof String);
assertEquals("WEBERN", transformed.get(SyslogToMapTransformer.HOST));
assertEquals("TESTING[70729]", transformed.get(SyslogToMapTransformer.TAG));
assertEquals("TEST SYSLOG MESSAGE", transformed.get(SyslogToMapTransformer.MESSAGE));
assertEquals("TESTING", transformed.get(SyslogToMapTransformer.TAG));
assertEquals("[70729]: TEST SYSLOG MESSAGE", transformed.get(SyslogToMapTransformer.MESSAGE));
String[] fields = new String[] {SyslogToMapTransformer.FACILITY,
SyslogToMapTransformer.SEVERITY, SyslogToMapTransformer.TIMESTAMP, SyslogToMapTransformer.HOST,
String[] fields = {SyslogToMapTransformer.FACILITY, SyslogToMapTransformer.SEVERITY,
SyslogToMapTransformer.TIMESTAMP, SyslogToMapTransformer.HOST,
SyslogToMapTransformer.TAG, SyslogToMapTransformer.MESSAGE};
Object[] values = new Object[] {19, 6, date, "WEBERN", "TESTING[70729]", "TEST SYSLOG MESSAGE"};
// check iteration order
int n = 0;
for (Entry<String, ?> entry : transformed.entrySet()) {
assertEquals(fields[n++], entry.getKey());
}
n = 0;
for (String key : transformed.keySet()) {
assertEquals(fields[n++], key);
}
n = 0;
for (Object value : transformed.values()) {
assertEquals(values[n++], value);
}
Object[] values = {19, 6, date, "WEBERN", "TESTING", "[70729]: TEST SYSLOG MESSAGE"};
assertIterationOrder(fields, values, transformed);
}
@Test
public void testBadPattern() throws Exception {
SyslogToMapTransformer t = new SyslogToMapTransformer();
String syslog = "&158>JUL 26 22:08:35 WEBERN TESTING[70729]: TEST SYSLOG MESSAGE";
Map<String, ?> transformed = t.transformPayload(
syslog.getBytes());
Map<String, ?> transformed = sut.transformPayload(syslog.getBytes());
assertEquals(1, transformed.size());
assertEquals(syslog, transformed.get(SyslogToMapTransformer.UNDECODED));
}
@Test
public void testBadFacilitySeverity() throws Exception {
SyslogToMapTransformer t = new SyslogToMapTransformer();
String syslog = "<X58>JUL 26 22:08:35 WEBERN TESTING[70729]: TEST SYSLOG MESSAGE";
Map<String, ?> transformed = t.transformPayload(
syslog.getBytes());
Map<String, ?> transformed = sut.transformPayload(syslog.getBytes());
assertEquals(1, transformed.size());
assertEquals(syslog, transformed.get(SyslogToMapTransformer.UNDECODED));
}
@Test
public void testWithoutTag() throws Exception {
SyslogToMapTransformer t = new SyslogToMapTransformer();
Map<String, ?> transformed = t.transformPayload(
"<158>JUL 26 22:08:35 WEBERN TEST SYSLOG MESSAGE".getBytes());
String syslog = "<158>JUL 26 22:08:35 WEBERN [70729]: TEST SYSLOG MESSAGE";
Map<String, ?> transformed = sut.transformPayload(syslog.getBytes());
assertEquals(5, transformed.size());
assertEquals(19, transformed.get(SyslogToMapTransformer.FACILITY));
assertEquals(6, transformed.get(SyslogToMapTransformer.SEVERITY));
@@ -97,25 +81,48 @@ public class SysLogTransformerTests {
assertTrue(date instanceof Date || date instanceof String);
assertEquals("WEBERN", transformed.get(SyslogToMapTransformer.HOST));
assertFalse(transformed.containsKey(SyslogToMapTransformer.TAG));
assertEquals("TEST SYSLOG MESSAGE", transformed.get(SyslogToMapTransformer.MESSAGE));
assertEquals("[70729]: TEST SYSLOG MESSAGE", transformed.get(SyslogToMapTransformer.MESSAGE));
String[] fields = new String[] {SyslogToMapTransformer.FACILITY,
SyslogToMapTransformer.SEVERITY, SyslogToMapTransformer.TIMESTAMP, SyslogToMapTransformer.HOST,
String[] fields = {SyslogToMapTransformer.FACILITY, SyslogToMapTransformer.SEVERITY,
SyslogToMapTransformer.TIMESTAMP, SyslogToMapTransformer.HOST,
SyslogToMapTransformer.MESSAGE};
Object[] values = {19, 6, date, "WEBERN", "[70729]: TEST SYSLOG MESSAGE"};
assertIterationOrder(fields, values, transformed);
}
Object[] values = new Object[] {19, 6, date, "WEBERN", "TEST SYSLOG MESSAGE"};
// check iteration order
@Test
public void testTagMaxLength() throws Exception {
String syslog = "<158>JUL 26 22:08:35 WEBERN ABCDE1234567890ABCDE1234567890UVXYZ TEST SYSLOG MESSAGE";
Map<String, ?> transformed = sut.transformPayload(syslog.getBytes());
assertEquals(6, transformed.size());
assertEquals(19, transformed.get(SyslogToMapTransformer.FACILITY));
assertEquals(6, transformed.get(SyslogToMapTransformer.SEVERITY));
Object date = transformed.get(SyslogToMapTransformer.TIMESTAMP);
assertTrue(date instanceof Date || date instanceof String);
assertEquals("WEBERN", transformed.get(SyslogToMapTransformer.HOST));
assertEquals("ABCDE1234567890ABCDE1234567890UV", transformed.get(SyslogToMapTransformer.TAG));
assertEquals("XYZ TEST SYSLOG MESSAGE", transformed.get(SyslogToMapTransformer.MESSAGE));
String[] fields = {SyslogToMapTransformer.FACILITY, SyslogToMapTransformer.SEVERITY,
SyslogToMapTransformer.TIMESTAMP, SyslogToMapTransformer.HOST,
SyslogToMapTransformer.TAG, SyslogToMapTransformer.MESSAGE};
Object[] values = {19, 6, date, "WEBERN", "ABCDE1234567890ABCDE1234567890UV", "XYZ TEST SYSLOG MESSAGE"};
assertIterationOrder(fields, values, transformed);
}
private static void assertIterationOrder(String[] expectedFields, Object[] expectedValues,
Map<String, ?> actualTransformed) {
int n = 0;
for (Entry<String, ?> entry : transformed.entrySet()) {
assertEquals(fields[n++], entry.getKey());
for (Entry<String, ?> entry : actualTransformed.entrySet()) {
assertEquals(expectedFields[n++], entry.getKey());
}
n = 0;
for (String key : transformed.keySet()) {
assertEquals(fields[n++], key);
for (String key : actualTransformed.keySet()) {
assertEquals(expectedFields[n++], key);
}
n = 0;
for (Object value : transformed.values()) {
assertEquals(values[n++], value);
for (Object value : actualTransformed.values()) {
assertEquals(expectedValues[n++], value);
}
}