@Test public void testJsonEscaping() throws Exception { final LogEvent event = Log4jLogEvent.newBuilder() .setLoggerName(getClass().getName()) .setLevel(Level.DEBUG) .setMessage(new SimpleMessage("This string contains \"quotes\" and \\ backslash and \u001F control and\nnewline")) .build(); final String expected = "This string contains \\\"quotes\\\" and \\\\ backslash and \\u001F control and\\nnewline"; final StringBuilder sb = new StringBuilder(); final LoggerContext ctx = LoggerContext.getContext(); final String[] options = new String[]{"%msg", "JSON"}; final EncodingPatternConverter converter = EncodingPatternConverter.newInstance(ctx.getConfiguration(), options); assertNotNull("Error creating converter", converter); converter.format(event, sb); assertEquals(expected, sb.toString()); }
/** * Creates an EncodingPatternConverter using a pattern string and an optional escape format. * * @param config the current Configuration * @param options first option is the nested pattern format; second option is the escape format (optional) * @return instance of pattern converter. */ public static EncodingPatternConverter newInstance(final Configuration config, final String[] options) { if (options.length > 2 || options.length == 0) { LOGGER.error("Incorrect number of options on escape. Expected 1 or 2, but received {}", options.length); return null; } if (options[0] == null) { LOGGER.error("No pattern supplied on escape"); return null; } final EscapeFormat escapeFormat = options.length < 2 ? EscapeFormat.HTML : EnglishEnums.valueOf(EscapeFormat.class, options[1], EscapeFormat.HTML); final PatternParser parser = PatternLayout.createPatternParser(config); final List<PatternFormatter> formatters = parser.parse(options[0]); return new EncodingPatternConverter(formatters, escapeFormat); }
@Test public void testXmlEscaping() { final LogEvent event = Log4jLogEvent.newBuilder() // .setLoggerName(EncodingPatternConverterTest.class.getName()) // .setLevel(Level.DEBUG) // .setMessage(new SimpleMessage("Test \r\n<div class=\"test\">this</div> & <div class='test'>that</div>")) .build(); final StringBuilder sb = new StringBuilder(); final LoggerContext ctx = LoggerContext.getContext(); final String[] options = new String[]{"%msg", "XML"}; final EncodingPatternConverter converter = EncodingPatternConverter .newInstance(ctx.getConfiguration(), options); assertNotNull("Error creating converter", converter); converter.format(event, sb); assertEquals( "Test \r\n<div class="test">this</div> & <div class='test'>that</div>", sb.toString()); }
@Test public void testCrlfEscaping() { final LogEvent event = Log4jLogEvent.newBuilder() // .setLoggerName(EncodingPatternConverterTest.class.getName()) // .setLevel(Level.DEBUG) // .setMessage(new SimpleMessage("Test \r\n<div class=\"test\">this\r</div> & \n<div class='test'>that</div>")) .build(); final StringBuilder sb = new StringBuilder(); final LoggerContext ctx = LoggerContext.getContext(); final String[] options = new String[]{"%msg", "CRLF"}; final EncodingPatternConverter converter = EncodingPatternConverter .newInstance(ctx.getConfiguration(), options); assertNotNull("Error creating converter", converter); converter.format(event, sb); assertEquals( "Test \\r\\n<div class=\"test\">this\\r</div> & \\n<div class='test'>that</div>", sb.toString()); }
@Test public void testReplacement() { final LogEvent event = Log4jLogEvent.newBuilder() // .setLoggerName(EncodingPatternConverterTest.class.getName()) // .setLevel(Level.DEBUG) // .setMessage(new SimpleMessage("Test \r\n<div class=\"test\">this</div> & <div class='test'>that</div>")) .build(); final StringBuilder sb = new StringBuilder(); final LoggerContext ctx = LoggerContext.getContext(); final String[] options = new String[]{"%msg"}; final EncodingPatternConverter converter = EncodingPatternConverter .newInstance(ctx.getConfiguration(), options); assertNotNull("Error creating converter", converter); converter.format(event, sb); assertEquals( "Test \\r\\n<div class="test">this</div> & <div class='test'>that</div>", sb.toString()); }