@Test public void testFilter() { final KeyValuePair[] pairs = new KeyValuePair[] { new KeyValuePair("id.name", "AccountTransfer"), new KeyValuePair("ToAccount", "123456")}; StructuredDataFilter filter = StructuredDataFilter.createFilter(pairs, "and", null, null); filter.start(); StructuredDataMessage msg = new StructuredDataMessage("AccountTransfer@18060", "Transfer Successful", "Audit"); msg.put("ToAccount", "123456"); msg.put("FromAccount", "211000"); msg.put("Amount", "1000.00"); assertTrue(filter.isStarted()); assertSame(Filter.Result.NEUTRAL, filter.filter(null, Level.DEBUG, null, msg, null)); msg.put("ToAccount", "111111"); assertSame(Filter.Result.DENY, filter.filter(null, Level.ERROR, null, msg, null)); filter = StructuredDataFilter.createFilter(pairs, "or", null, null); filter.start(); msg = new StructuredDataMessage("AccountTransfer@18060", "Transfer Successful", "Audit"); msg.put("ToAccount", "123456"); msg.put("FromAccount", "211000"); msg.put("Amount", "1000.00"); assertTrue(filter.isStarted()); assertSame(Filter.Result.NEUTRAL, filter.filter(null, Level.DEBUG, null, msg, null)); msg.put("ToAccount", "111111"); assertSame(Filter.Result.NEUTRAL, filter.filter(null, Level.ERROR, null, msg, null)); }
@Test public void testConfig() { final Configuration config = context.getConfiguration(); final Filter filter = config.getFilter(); assertNotNull("No StructuredDataFilter", filter); assertTrue("Not a StructuredDataFilter", filter instanceof StructuredDataFilter); final StructuredDataFilter sdFilter = (StructuredDataFilter) filter; assertFalse("Should not be And filter", sdFilter.isAnd()); final Map<String, List<String>> map = sdFilter.getMap(); assertNotNull("No Map", map); assertFalse("No elements in Map", map.isEmpty()); assertEquals("Incorrect number of elements in Map", 1, map.size()); assertTrue("Map does not contain key eventId", map.containsKey("eventId")); assertEquals("List does not contain 2 elements", 2, map.get("eventId").size()); } }
protected Result filter(final StructuredDataMessage message) { boolean match = false; final IndexedReadOnlyStringMap map = getStringMap(); for (int i = 0; i < map.size(); i++) { final StringBuilder toMatch = getValue(message, map.getKeyAt(i)); if (toMatch != null) { match = listContainsValue((List<String>) map.getValueAt(i), toMatch); } else { match = false; } if ((!isAnd() && match) || (isAnd() && !match)) { break; } } return match ? onMatch : onMismatch; }
@Override public Result filter(final Logger logger, final Level level, final Marker marker, final Message msg, final Throwable t) { if (msg instanceof StructuredDataMessage) { return filter((StructuredDataMessage) msg); } return Result.NEUTRAL; }
private StringBuilder getValue(final StructuredDataMessage data, final String key) { final StringBuilder sb = getStringBuilder(); if (key.equalsIgnoreCase("id")) { data.getId().formatTo(sb); return sb; } else if (key.equalsIgnoreCase("id.name")) { return appendOrNull(data.getId().getName(), sb); } else if (key.equalsIgnoreCase("type")) { return appendOrNull(data.getType(), sb); } else if (key.equalsIgnoreCase("message")) { data.formatTo(sb); return sb; } else { return appendOrNull(data.get(key), sb); } }
return new StructuredDataFilter(map, isAnd, match, mismatch);
@Override public Result filter(final LogEvent event) { final Message msg = event.getMessage(); if (msg instanceof StructuredDataMessage) { return filter((StructuredDataMessage) msg); } return super.filter(event); }