[LOG4J2-1147] Add %equalsIgnoreCase to PatternLayout to test and replace patterns with strings.
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/13a62572 Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/13a62572 Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/13a62572 Branch: refs/heads/LOG4J2-1136 Commit: 13a62572004b4efad53094ef7b15388aa07bb6b3 Parents: 8978274 Author: ggregory <[email protected]> Authored: Thu Oct 1 16:17:43 2015 -0700 Committer: Ralph Goers <[email protected]> Committed: Sat Oct 3 23:08:06 2015 -0700 ---------------------------------------------------------------------- .../EqualsIgnoreCaseReplacementConverter.java | 101 +++++++++++++++++++ ...qualsIgnoreCaseReplacementConverterTest.java | 63 ++++++++++++ src/changes/changes.xml | 3 + src/site/xdoc/manual/layouts.xml.vm | 3 +- 4 files changed, 169 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/13a62572/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsIgnoreCaseReplacementConverter.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsIgnoreCaseReplacementConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsIgnoreCaseReplacementConverter.java new file mode 100644 index 0000000..1265108 --- /dev/null +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsIgnoreCaseReplacementConverter.java @@ -0,0 +1,101 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache license, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the license for the specific language governing permissions and + * limitations under the license. + */ +package org.apache.logging.log4j.core.pattern; + +import java.util.List; + +import org.apache.logging.log4j.core.LogEvent; +import org.apache.logging.log4j.core.config.Configuration; +import org.apache.logging.log4j.core.config.plugins.Plugin; +import org.apache.logging.log4j.core.layout.PatternLayout; + +/** + * Equals ignore case pattern converter. + */ +@Plugin(name = "equalsIgnoreCase", category = PatternConverter.CATEGORY) +@ConverterKeys({ "equalsIgnoreCase" }) +public final class EqualsIgnoreCaseReplacementConverter extends LogEventPatternConverter { + + /** + * Gets an instance of the class. + * + * @param config + * The current Configuration. + * @param options + * pattern options, an array of three elements: pattern, testString, and substitution. + * @return instance of class. + */ + public static EqualsIgnoreCaseReplacementConverter newInstance(final Configuration config, final String[] options) { + if (options.length != 3) { + LOGGER.error("Incorrect number of options on equalsIgnoreCase. Expected 3 received " + options.length); + return null; + } + if (options[0] == null) { + LOGGER.error("No pattern supplied on equalsIgnoreCase"); + return null; + } + if (options[1] == null) { + LOGGER.error("No test string supplied on equalsIgnoreCase"); + return null; + } + if (options[2] == null) { + LOGGER.error("No substitution supplied on equalsIgnoreCase"); + return null; + } + final String p = options[1]; + final PatternParser parser = PatternLayout.createPatternParser(config); + final List<PatternFormatter> formatters = parser.parse(options[0]); + return new EqualsIgnoreCaseReplacementConverter(formatters, p, options[2]); + } + + private final List<PatternFormatter> formatters; + + private final String substitution; + + private final String testString; + + /** + * Construct the converter. + * + * @param formatters + * The PatternFormatters to generate the text to manipulate. + * @param testString + * The test string. + * @param substitution + * The substitution string. + */ + private EqualsIgnoreCaseReplacementConverter(final List<PatternFormatter> formatters, final String testString, + final String substitution) { + super("equals", "equals"); + this.testString = testString; + this.substitution = substitution; + this.formatters = formatters; + } + + /** + * {@inheritDoc} + */ + @Override + public void format(final LogEvent event, final StringBuilder toAppendTo) { + final StringBuilder buf = new StringBuilder(); + for (final PatternFormatter formatter : formatters) { + formatter.format(event, buf); + } + final String string = buf.toString(); + toAppendTo.append(testString.equalsIgnoreCase(string) ? substitution : string); + } +} http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/13a62572/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/EqualsIgnoreCaseReplacementConverterTest.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/EqualsIgnoreCaseReplacementConverterTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/EqualsIgnoreCaseReplacementConverterTest.java new file mode 100644 index 0000000..26200eb --- /dev/null +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/EqualsIgnoreCaseReplacementConverterTest.java @@ -0,0 +1,63 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache license, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the license for the specific language governing permissions and + * limitations under the license. + */ +package org.apache.logging.log4j.core.pattern; + +import static org.junit.Assert.assertEquals; + +import org.apache.logging.log4j.Level; +import org.apache.logging.log4j.core.LogEvent; +import org.apache.logging.log4j.core.LoggerContext; +import org.apache.logging.log4j.core.impl.Log4jLogEvent; +import org.apache.logging.log4j.message.SimpleMessage; +import org.apache.logging.log4j.util.Strings; +import org.junit.Test; + +/** + * + */ +public class EqualsIgnoreCaseReplacementConverterTest { + + @Test + public void testMarkerReplacement() { + testReplacement("%marker", Strings.EMPTY); + } + + @Test + public void testMarkerSimpleNameReplacement() { + testReplacement("%markerSimpleName", Strings.EMPTY); + } + + @Test + public void testLoggerNameReplacement() { + testReplacement("%logger", "aaa[" + EqualsIgnoreCaseReplacementConverterTest.class.getName() + "]zzz"); + } + + private void testReplacement(String tag, String expectedValue) { + final LogEvent event = Log4jLogEvent.newBuilder() // + .setLoggerName(EqualsIgnoreCaseReplacementConverterTest.class.getName()) // + .setLevel(Level.DEBUG) // + .setMessage(new SimpleMessage("This is a test")) // + .build(); + final StringBuilder sb = new StringBuilder(); + final LoggerContext ctx = LoggerContext.getContext(); + final String[] options = new String[] { "aaa[" + tag + "]zzz", "AAA[]ZZZ", expectedValue }; + final EqualsIgnoreCaseReplacementConverter converter = EqualsIgnoreCaseReplacementConverter + .newInstance(ctx.getConfiguration(), options); + converter.format(event, sb); + assertEquals(expectedValue, sb.toString()); + } +} http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/13a62572/src/changes/changes.xml ---------------------------------------------------------------------- diff --git a/src/changes/changes.xml b/src/changes/changes.xml index db5fc73..cd86147 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -30,6 +30,9 @@ <action issue="LOG4J2-1145" dev="ggregory" type="add"> Add %equals to PatternLayout to test and replace patterns with strings. </action> + <action issue="LOG4J2-1147" dev="ggregory" type="add"> + Add %equalsIgnoreCase to PatternLayout to test and replace patterns with strings. + </action> <action issue="LOG4J2-1020" dev="mikes" type="fix"> Possibility to set shutdown timeout on AsyncAppender </action> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/13a62572/src/site/xdoc/manual/layouts.xml.vm ---------------------------------------------------------------------- diff --git a/src/site/xdoc/manual/layouts.xml.vm b/src/site/xdoc/manual/layouts.xml.vm index f05827a..e1c0e12 100644 --- a/src/site/xdoc/manual/layouts.xml.vm +++ b/src/site/xdoc/manual/layouts.xml.vm @@ -652,7 +652,8 @@ WARN [main]: Message 2</pre> </tr> <tr> <td align="center"> - <b>equals</b>{pattern}{test}{substitution} + <b>equals</b>{pattern}{test}{substitution}<br /> + <b>equalsIgnoreCase</b>{pattern}{test}{substitution} </td> <td> <p>Replaces occurrences of 'test', a string, with its replacement 'substitution' in the
