/** * Creates a new instance of the class. Required by Log4J2. * @param config the configuration * @param options the options * @return a new instance, or {@code null} if the options are invalid */ public static ColorConverter newInstance(Configuration config, String[] options) { if (options.length < 1) { LOGGER.error("Incorrect number of options on style. " + "Expected at least 1, received {}", options.length); return null; } if (options[0] == null) { LOGGER.error("No pattern supplied on style"); return null; } PatternParser parser = PatternLayout.createPatternParser(config); List<PatternFormatter> formatters = parser.parse(options[0]); AnsiElement element = (options.length != 1) ? ELEMENTS.get(options[1]) : null; return new ColorConverter(formatters, element); }
private void parse(final String pattern, final boolean convert, final StringBuilder buf, final Date date, final int i) { final PatternParser parser0 = new PatternParser(null, "Converter", null); final List<PatternConverter> converters = new ArrayList<>(); final List<FormattingInfo> fields = new ArrayList<>(); parser0.parse(pattern, converters, fields, false, false, convert); final FormattingInfo[] infoArray = new FormattingInfo[fields.size()]; final FormattingInfo[] patternFields = fields.toArray(infoArray); final ArrayPatternConverter[] converterArray = new ArrayPatternConverter[converters.size()]; final ArrayPatternConverter[] patternConverters = converters.toArray(converterArray); formatFileName(patternConverters, patternFields, buf, date, i); }
private void testFirstConverter(final String pattern, final Class<?> checkClass) { final List<PatternFormatter> formatters = parser.parse(pattern); assertNotNull(formatters); final String msg = formatters.toString(); assertEquals(msg, 1, formatters.size()); assertTrue(msg, checkClass.isInstance(formatters.get(0).getConverter())); }
/** * Test the default pattern */ @Test public void defaultPattern() { final List<PatternFormatter> formatters = parser.parse(msgPattern); assertNotNull(formatters); assertTrue(formatters.size() == 2); validateConverter(formatters, 0, "Message"); validateConverter(formatters, 1, "Line Sep"); }
@Test public void testClosingBracketButWrongPlace() { final List<PatternFormatter> formatters = parser.parse("}%d{"); assertNotNull(formatters); assertEquals(2, formatters.size()); validateConverter(formatters, 0, "Literal"); validateConverter(formatters, 1, "Date"); }
@Test public void testDeeplyNestedPattern() { final List<PatternFormatter> formatters = parser.parse(deeplyNestedPattern); assertNotNull(formatters); assertEquals(1, formatters.size()); final StringMap mdc = ContextDataFactory.createContextData(); mdc.putValue("var", "1234"); final Log4jLogEvent event = Log4jLogEvent.newBuilder() // .setContextData(mdc).build(); final StringBuilder buf = new StringBuilder(); formatters.get(0).format(event, buf); final String expected = " 123 "; assertEquals(expected, buf.toString()); }
@Test public void testExceptionWithFilters() { final List<PatternFormatter> formatters = parser .parse("%d{DEFAULT} - %msg - %xEx{full}{filters(org.junit,org.eclipse)}%n"); assertNotNull(formatters); assertEquals(6, formatters.size()); final PatternFormatter patternFormatter = formatters.get(4); final LogEventPatternConverter converter = patternFormatter.getConverter(); assertEquals(ExtendedThrowablePatternConverter.class, converter.getClass()); final ExtendedThrowablePatternConverter exConverter = (ExtendedThrowablePatternConverter) converter; final ThrowableFormatOptions options = exConverter.getOptions(); assertTrue(options.getIgnorePackages().contains("org.junit")); assertTrue(options.getIgnorePackages().contains("org.eclipse")); assertEquals(System.lineSeparator(), options.getSeparator()); }
@Test public void testExceptionWithFiltersAndSeparator() { final List<PatternFormatter> formatters = parser .parse("%d{DEFAULT} - %msg - %xEx{full}{filters(org.junit,org.eclipse)}{separator(|)}%n"); assertNotNull(formatters); assertEquals(6, formatters.size()); final PatternFormatter patternFormatter = formatters.get(4); final LogEventPatternConverter converter = patternFormatter.getConverter(); assertEquals(ExtendedThrowablePatternConverter.class, converter.getClass()); final ExtendedThrowablePatternConverter exConverter = (ExtendedThrowablePatternConverter) converter; final ThrowableFormatOptions options = exConverter.getOptions(); final List<String> ignorePackages = options.getIgnorePackages(); assertNotNull(ignorePackages); final String ignorePackagesString = ignorePackages.toString(); assertTrue(ignorePackagesString, ignorePackages.contains("org.junit")); assertTrue(ignorePackagesString, ignorePackages.contains("org.eclipse")); assertEquals("|", options.getSeparator()); }
@Test public void testBadPattern() { final Calendar cal = Calendar.getInstance(); cal.set(2001, Calendar.FEBRUARY, 3, 4, 5, 6); cal.set(Calendar.MILLISECOND, 789); final long timestamp = cal.getTimeInMillis(); final List<PatternFormatter> formatters = parser.parse(badPattern); assertNotNull(formatters); final Throwable t = new Throwable(); final StackTraceElement[] elements = t.getStackTrace(); final LogEvent event = Log4jLogEvent.newBuilder() // .setLoggerName("a.b.c") // .setLoggerFqcn(Logger.class.getName()) // .setLevel(Level.INFO) // .setMessage(new SimpleMessage("Hello, world")) // .setThreadName("Thread1") // .setSource(elements[0]) // .setTimeMillis(timestamp) // .build(); final StringBuilder buf = new StringBuilder(); for (final PatternFormatter formatter : formatters) { formatter.format(event, buf); } final String str = buf.toString(); // eats all characters until the closing '}' character final String expected = "[2001-02-03 04:05:06,789] - Hello, world"; assertTrue("Expected to start with: " + expected + ". Actual: " + str, str.startsWith(expected)); }
private void testNestedPatternHighlight(final Level level, final String expectedStart) { final List<PatternFormatter> formatters = parser.parse(nestedPatternHighlight); assertNotNull(formatters); final Throwable t = new Throwable(); t.getStackTrace(); final LogEvent event = Log4jLogEvent.newBuilder() // .setLoggerName("org.apache.logging.log4j.PatternParserTest") // .setMarker(MarkerManager.getMarker("TEST")) // .setLoggerFqcn(Logger.class.getName()) // .setLevel(level) // .setMessage(new SimpleMessage("Hello, world")) // .setThreadName("Thread1") // .setSource(/*stackTraceElement[0]*/ null) // .setTimeMillis(System.currentTimeMillis()) // .build(); final StringBuilder buf = new StringBuilder(); for (final PatternFormatter formatter : formatters) { formatter.format(event, buf); } final String str = buf.toString(); final String expectedEnd = String.format("] %-5s: Hello, world%s\u001B[m", level, Strings.LINE_SEPARATOR); assertTrue("Expected to start with: " + expectedStart + ". Actual: " + str, str.startsWith(expectedStart)); assertTrue("Expected to end with: \"" + expectedEnd + "\". Actual: \"" + str, str.endsWith(expectedEnd)); }
@Test public void testNanoPatternLongChangesNanoClockFactoryMode() { final Configuration config = new NullConfiguration(); assertTrue(config.getNanoClock() instanceof DummyNanoClock); final PatternParser pp = new PatternParser(config, KEY, null); assertTrue(config.getNanoClock() instanceof DummyNanoClock); pp.parse("%m"); assertTrue(config.getNanoClock() instanceof DummyNanoClock); pp.parse("%N"); assertTrue(config.getNanoClock() instanceof SystemNanoClock); }
@Test public void testPatternTruncateFromBeginning() { final List<PatternFormatter> formatters = parser.parse(patternTruncateFromBeginning); assertNotNull(formatters); final LogEvent event = Log4jLogEvent.newBuilder() // .setLoggerName("org.apache.logging.log4j.PatternParserTest") // .setLoggerFqcn(Logger.class.getName()) // .setLevel(Level.INFO) // .setMessage(new SimpleMessage("Hello, world")) // .setThreadName("Thread1") // .setTimeMillis(System.currentTimeMillis()) // .build(); final StringBuilder buf = new StringBuilder(); for (final PatternFormatter formatter : formatters) { formatter.format(event, buf); } final String str = buf.toString(); final String expected = "INFO rTest Hello, world" + Strings.LINE_SEPARATOR; assertTrue("Expected to end with: " + expected + ". Actual: " + str, str.endsWith(expected)); }
@Test public void testNanoPatternShortChangesConfigurationNanoClock() { final Configuration config = new NullConfiguration(); assertTrue(config.getNanoClock() instanceof DummyNanoClock); final PatternParser pp = new PatternParser(config, KEY, null); assertTrue(config.getNanoClock() instanceof DummyNanoClock); pp.parse("%m"); assertTrue(config.getNanoClock() instanceof DummyNanoClock); pp.parse("%nano"); // this changes the config clock assertTrue(config.getNanoClock() instanceof SystemNanoClock); }
@Test public void testPatternTruncateFromEnd() { final List<PatternFormatter> formatters = parser.parse(patternTruncateFromEnd); assertNotNull(formatters); final LogEvent event = Log4jLogEvent.newBuilder() // .setLoggerName("org.apache.logging.log4j.PatternParserTest") // .setLoggerFqcn(Logger.class.getName()) // .setLevel(Level.INFO) // .setMessage(new SimpleMessage("Hello, world")) // .setThreadName("Thread1") // .setTimeMillis(System.currentTimeMillis()) // .build(); final StringBuilder buf = new StringBuilder(); for (final PatternFormatter formatter : formatters) { formatter.format(event, buf); } final String str = buf.toString(); final String expected = "INFO org.a Hello, world" + Strings.LINE_SEPARATOR; assertTrue("Expected to end with: " + expected + ". Actual: " + str, str.endsWith(expected)); }
/** * Test the custom pattern */ @Test public void testCustomPattern() { final List<PatternFormatter> formatters = parser.parse(customPattern); assertNotNull(formatters); final StringMap mdc = ContextDataFactory.createContextData(); mdc.putValue("loginId", "Fred"); final Throwable t = new Throwable(); final StackTraceElement[] elements = t.getStackTrace(); final Log4jLogEvent event = Log4jLogEvent.newBuilder() // .setLoggerName("org.apache.logging.log4j.PatternParserTest") // .setMarker(MarkerManager.getMarker("TEST")) // .setLoggerFqcn(Logger.class.getName()) // .setLevel(Level.INFO) // .setMessage(new SimpleMessage("Hello, world")) // .setContextData(mdc) // .setThreadName("Thread1") // .setSource(elements[0]) .setTimeMillis(System.currentTimeMillis()).build(); final StringBuilder buf = new StringBuilder(); for (final PatternFormatter formatter : formatters) { formatter.format(event, buf); } final String str = buf.toString(); final String expected = "INFO [PatternParserTest :104 ] - Hello, world" + Strings.LINE_SEPARATOR; assertTrue("Expected to end with: " + expected + ". Actual: " + str, str.endsWith(expected)); }
public List<PatternFormatter> parse(final String pattern, final boolean alwaysWriteExceptions, final boolean noConsoleNoAnsi) { return parse(pattern, alwaysWriteExceptions, false, noConsoleNoAnsi); }
public List<PatternFormatter> parse(final String pattern) { return parse(pattern, false, false, false); }
/** * Construct the converter. * * @param name converter name * @param style converter style * @param formatters The PatternFormatters to generate the text to manipulate. * @param testString The test string. * @param substitution The substitution string. * @param parser The PatternParser. */ protected EqualsBaseReplacementConverter(final String name, final String style, final List<PatternFormatter> formatters, final String testString, final String substitution, final PatternParser parser) { super(name, style); this.testString = testString; this.substitution = substitution; this.formatters = formatters; // check if substitution needs to be parsed substitutionFormatters = substitution.contains("%") ? parser.parse(substitution) : null; }
/** * Creates a list of PatternFormatter from the given configuration and options or null if no pattern is supplied. * * @param config A configuration. * @param options pattern options. * @return a list of PatternFormatter from the given configuration and options or null if no pattern is supplied. */ private static List<PatternFormatter> toPatternFormatterList(final Configuration config, final String[] options) { if (options.length == 0 || options[0] == null) { LOGGER.error("No pattern supplied on style for config=" + config); return null; } final PatternParser parser = PatternLayout.createPatternParser(config); if (parser == null) { LOGGER.error("No PatternParser created for config=" + config + ", options=" + Arrays.toString(options)); return null; } return parser.parse(options[0]); }
@Override public Serializer build() { if (Strings.isEmpty(pattern) && Strings.isEmpty(defaultPattern)) { return null; } if (patternSelector == null) { try { final PatternParser parser = createPatternParser(configuration); final List<PatternFormatter> list = parser.parse(pattern == null ? defaultPattern : pattern, alwaysWriteExceptions, disableAnsi, noConsoleNoAnsi); final PatternFormatter[] formatters = list.toArray(new PatternFormatter[0]); return new PatternSerializer(formatters, replace); } catch (final RuntimeException ex) { throw new IllegalArgumentException("Cannot parse pattern '" + pattern + "'", ex); } } return new PatternSelectorSerializer(patternSelector, replace); }