You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by mi...@apache.org on 2016/11/11 13:44:36 UTC

[1/6] logging-log4j2 git commit: Add option disableAnsi to color converters

Repository: logging-log4j2
Updated Branches:
  refs/heads/LOG4J2-1685 [created] 028ae4b45


Add option disableAnsi to color converters

Option `disableAnsi` turns off ANSI color output in the
HighlightConverter and StyleConverter unconditionally. The existing
option `noConsoleNoAnsi` option only takes effect if System.console() is
null, which is not always the case. An example of this is when running
an application that writes to standard output inside a container or a
service wrapper.


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/42f8f080
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/42f8f080
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/42f8f080

Branch: refs/heads/LOG4J2-1685
Commit: 42f8f0801776c0b9706fe5a0e3518bfa5c11c6b4
Parents: abf29af
Author: Raman Gupta <ro...@gmail.com>
Authored: Thu Nov 10 14:38:36 2016 -0500
Committer: Mikael St�ldal <mi...@magine.com>
Committed: Fri Nov 11 13:15:36 2016 +0100

----------------------------------------------------------------------
 .../core/appender/rolling/PatternProcessor.java |  2 +-
 .../log4j/core/layout/AbstractCsvLayout.java    |  4 +--
 .../logging/log4j/core/layout/JsonLayout.java   |  4 +--
 .../core/layout/MarkerPatternSelector.java      | 13 +++++----
 .../log4j/core/layout/PatternLayout.java        | 29 +++++++++++++++-----
 .../log4j/core/layout/Rfc5424Layout.java        |  4 +--
 .../core/layout/ScriptPatternSelector.java      | 11 ++++----
 .../logging/log4j/core/layout/YamlLayout.java   |  4 +--
 .../logging/log4j/core/net/SmtpManager.java     |  2 +-
 .../log4j/core/pattern/HighlightConverter.java  | 15 ++++++++--
 .../log4j/core/pattern/PatternParser.java       | 29 +++++++++++++-------
 .../log4j/core/pattern/StyleConverter.java      |  8 +++++-
 .../log4j/core/layout/PatternLayoutTest.java    |  2 +-
 .../log4j/core/layout/PatternSelectorTest.java  |  2 +-
 .../core/pattern/HighlightConverterTest.java    |  8 +++---
 .../log4j/core/pattern/PatternParserTest2.java  |  2 +-
 .../log4j/perf/jmh/PatternLayoutBenchmark.java  | 24 ++++++++--------
 .../jmh/PatternLayoutComparisonBenchmark.java   |  2 +-
 .../perf/jmh/TextEncoderHelperBenchmark.java    |  2 +-
 .../perf/jmh/ThreadLocalVsPoolBenchmark.java    |  2 +-
 20 files changed, 107 insertions(+), 62 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/42f8f080/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/PatternProcessor.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/PatternProcessor.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/PatternProcessor.java
index ca13769..6cfec53 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/PatternProcessor.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/PatternProcessor.java
@@ -78,7 +78,7 @@ public class PatternProcessor {
         final PatternParser parser = createPatternParser();
         final List<PatternConverter> converters = new ArrayList<>();
         final List<FormattingInfo> fields = new ArrayList<>();
-        parser.parse(pattern, converters, fields, false, false);
+        parser.parse(pattern, converters, fields, false, false, false);
         final FormattingInfo[] infoArray = new FormattingInfo[fields.size()];
         patternFields = fields.toArray(infoArray);
         final ArrayPatternConverter[] converterArray = new ArrayPatternConverter[converters.size()];

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/42f8f080/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractCsvLayout.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractCsvLayout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractCsvLayout.java
index ffa6ea6..d56bc89 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractCsvLayout.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractCsvLayout.java
@@ -67,8 +67,8 @@ public abstract class AbstractCsvLayout extends AbstractStringLayout {
 
     protected AbstractCsvLayout(final Configuration config, final Charset charset, final CSVFormat csvFormat,
             final String header, final String footer) {
-        super(config, charset, PatternLayout.createSerializer(config, null, header, null, null, false, false),
-                PatternLayout.createSerializer(config, null, footer, null, null, false, false));
+        super(config, charset, PatternLayout.createSerializer(config, null, header, null, null, false, false, false),
+                PatternLayout.createSerializer(config, null, footer, null, null, false, false, false));
         this.format = csvFormat;
     }
 

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/42f8f080/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/JsonLayout.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/JsonLayout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/JsonLayout.java
index df1d4ea..a03ce65 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/JsonLayout.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/JsonLayout.java
@@ -814,8 +814,8 @@ public final class JsonLayout extends AbstractJacksonLayout {
         super(config, new JacksonFactory.JSON(encodeThreadContextAsList, includeStacktrace).newWriter(
                     locationInfo, properties, compact),
                 charset, compact, complete, eventEol,
-                PatternLayout.createSerializer(config, null, headerPattern, DEFAULT_HEADER, null, false, false),
-                PatternLayout.createSerializer(config, null, footerPattern, DEFAULT_FOOTER, null, false, false));
+                PatternLayout.createSerializer(config, null, headerPattern, DEFAULT_HEADER, null, false, false, false),
+                PatternLayout.createSerializer(config, null, footerPattern, DEFAULT_FOOTER, null, false, false, false));
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/42f8f080/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/MarkerPatternSelector.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/MarkerPatternSelector.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/MarkerPatternSelector.java
index 17242cb..172df82 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/MarkerPatternSelector.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/MarkerPatternSelector.java
@@ -52,12 +52,13 @@ public class MarkerPatternSelector implements PatternSelector {
 
 
     public MarkerPatternSelector(final PatternMatch[] properties, final String defaultPattern,
-                                 final boolean alwaysWriteExceptions, final boolean noConsoleNoAnsi,
-                                 final Configuration config) {
+                                 final boolean alwaysWriteExceptions, final boolean disableAnsi,
+                                 final boolean noConsoleNoAnsi, final Configuration config) {
         final PatternParser parser = PatternLayout.createPatternParser(config);
         for (final PatternMatch property : properties) {
             try {
-                final List<PatternFormatter> list = parser.parse(property.getPattern(), alwaysWriteExceptions, noConsoleNoAnsi);
+                final List<PatternFormatter> list = parser.parse(property.getPattern(), alwaysWriteExceptions,
+                        disableAnsi, noConsoleNoAnsi);
                 formatterMap.put(property.getKey(), list.toArray(new PatternFormatter[list.size()]));
                 patternMap.put(property.getKey(), property.getPattern());
             } catch (final RuntimeException ex) {
@@ -65,7 +66,8 @@ public class MarkerPatternSelector implements PatternSelector {
             }
         }
         try {
-            final List<PatternFormatter> list = parser.parse(defaultPattern, alwaysWriteExceptions, noConsoleNoAnsi);
+            final List<PatternFormatter> list = parser.parse(defaultPattern, alwaysWriteExceptions, disableAnsi,
+                    noConsoleNoAnsi);
             defaultFormatters = list.toArray(new PatternFormatter[list.size()]);
             this.defaultPattern = defaultPattern;
         } catch (final RuntimeException ex) {
@@ -92,6 +94,7 @@ public class MarkerPatternSelector implements PatternSelector {
     public static MarkerPatternSelector createSelector(@PluginElement("PatternMatch") final PatternMatch[] properties,
                                                        @PluginAttribute("defaultPattern") String defaultPattern,
                                                        @PluginAttribute(value = "alwaysWriteExceptions", defaultBoolean = true) final boolean alwaysWriteExceptions,
+                                                       @PluginAttribute(value = "disableAnsi", defaultBoolean = false) final boolean disableAnsi,
                                                        @PluginAttribute(value = "noConsoleNoAnsi", defaultBoolean = false) final boolean noConsoleNoAnsi,
                                                        @PluginConfiguration final Configuration config) {
         if (defaultPattern == null) {
@@ -102,7 +105,7 @@ public class MarkerPatternSelector implements PatternSelector {
             return null;
         }
         return new MarkerPatternSelector(properties, defaultPattern, alwaysWriteExceptions,
-                noConsoleNoAnsi, config);
+                disableAnsi, noConsoleNoAnsi, config);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/42f8f080/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java
index 2c235f4..284222d 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java
@@ -93,6 +93,8 @@ public final class PatternLayout extends AbstractStringLayout {
      * @param charset The character set.
      * @param alwaysWriteExceptions Whether or not exceptions should always be handled in this pattern (if {@code true},
      *                         exceptions will be written even if the pattern does not specify so).
+     * @param disableAnsi
+     *            If {@code "true"}, do not output ANSI escape codes
      * @param noConsoleNoAnsi
      *            If {@code "true"} (default) and {@link System#console()} is null, do not output ANSI escape codes
      * @param headerPattern header conversion pattern.
@@ -100,21 +102,22 @@ public final class PatternLayout extends AbstractStringLayout {
      */
     private PatternLayout(final Configuration config, final RegexReplacement replace, final String eventPattern,
             final PatternSelector patternSelector, final Charset charset, final boolean alwaysWriteExceptions,
-            final boolean noConsoleNoAnsi, final String headerPattern, final String footerPattern) {
+          final boolean disableAnsi, final boolean noConsoleNoAnsi, final String headerPattern,
+          final String footerPattern) {
         super(config, charset,
                 createSerializer(config, replace, headerPattern, null, patternSelector, alwaysWriteExceptions,
-                        noConsoleNoAnsi),
+                        disableAnsi, noConsoleNoAnsi),
                 createSerializer(config, replace, footerPattern, null, patternSelector, alwaysWriteExceptions,
-                        noConsoleNoAnsi));
+                        disableAnsi, noConsoleNoAnsi));
         this.conversionPattern = eventPattern;
         this.patternSelector = patternSelector;
         this.eventSerializer = createSerializer(config, replace, eventPattern, DEFAULT_CONVERSION_PATTERN,
-                patternSelector, alwaysWriteExceptions, noConsoleNoAnsi);
+                patternSelector, alwaysWriteExceptions, disableAnsi, noConsoleNoAnsi);
     }
 
     public static Serializer createSerializer(final Configuration configuration, final RegexReplacement replace,
             final String pattern, final String defaultPattern, final PatternSelector patternSelector,
-            final boolean alwaysWriteExceptions, final boolean noConsoleNoAnsi) {
+            final boolean alwaysWriteExceptions, boolean disableAnsi, final boolean noConsoleNoAnsi) {
         if (Strings.isEmpty(pattern) && Strings.isEmpty(defaultPattern)) {
             return null;
         }
@@ -122,7 +125,7 @@ public final class PatternLayout extends AbstractStringLayout {
             try {
                 final PatternParser parser = createPatternParser(configuration);
                 final List<PatternFormatter> list = parser.parse(pattern == null ? defaultPattern : pattern,
-                        alwaysWriteExceptions, noConsoleNoAnsi);
+                        alwaysWriteExceptions, disableAnsi, noConsoleNoAnsi);
                 final PatternFormatter[] formatters = list.toArray(new PatternFormatter[0]);
                 return new PatternSerializer(formatters, replace);
             } catch (final RuntimeException ex) {
@@ -233,6 +236,8 @@ public final class PatternLayout extends AbstractStringLayout {
      *        The character set. The platform default is used if not specified.
      * @param alwaysWriteExceptions
      *        If {@code "true"} (default) exceptions are always written even if the pattern contains no exception tokens.
+     * @param disableAnsi
+     *        If {@code "true"} (default is false), do not output ANSI escape codes
      * @param noConsoleNoAnsi
      *        If {@code "true"} (default is false) and {@link System#console()} is null, do not output ANSI escape codes
      * @param headerPattern
@@ -250,6 +255,7 @@ public final class PatternLayout extends AbstractStringLayout {
             // LOG4J2-783 use platform default by default, so do not specify defaultString for charset
             @PluginAttribute(value = "charset") final Charset charset,
             @PluginAttribute(value = "alwaysWriteExceptions", defaultBoolean = true) final boolean alwaysWriteExceptions,
+            @PluginAttribute(value = "disableAnsi", defaultBoolean = false) final boolean disableAnsi,
             @PluginAttribute(value = "noConsoleNoAnsi", defaultBoolean = false) final boolean noConsoleNoAnsi,
             @PluginAttribute("header") final String headerPattern,
             @PluginAttribute("footer") final String footerPattern) {
@@ -260,6 +266,7 @@ public final class PatternLayout extends AbstractStringLayout {
             .withRegexReplacement(replace)
             .withCharset(charset)
             .withAlwaysWriteExceptions(alwaysWriteExceptions)
+            .withDisableAnsi(disableAnsi)
             .withNoConsoleNoAnsi(noConsoleNoAnsi)
             .withHeader(headerPattern)
             .withFooter(footerPattern)
@@ -424,6 +431,9 @@ public final class PatternLayout extends AbstractStringLayout {
         private boolean alwaysWriteExceptions = true;
 
         @PluginBuilderAttribute
+        private boolean disableAnsi;
+
+        @PluginBuilderAttribute
         private boolean noConsoleNoAnsi;
 
         @PluginBuilderAttribute
@@ -470,6 +480,11 @@ public final class PatternLayout extends AbstractStringLayout {
             return this;
         }
 
+        public Builder withDisableAnsi(final boolean disableAnsi) {
+            this.disableAnsi = disableAnsi;
+            return this;
+        }
+
         public Builder withNoConsoleNoAnsi(final boolean noConsoleNoAnsi) {
             this.noConsoleNoAnsi = noConsoleNoAnsi;
             return this;
@@ -492,7 +507,7 @@ public final class PatternLayout extends AbstractStringLayout {
                 configuration = new DefaultConfiguration();
             }
             return new PatternLayout(configuration, regexReplacement, pattern, patternSelector, charset,
-                alwaysWriteExceptions, noConsoleNoAnsi, header, footer);
+                alwaysWriteExceptions, disableAnsi, noConsoleNoAnsi, header, footer);
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/42f8f080/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/Rfc5424Layout.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/Rfc5424Layout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/Rfc5424Layout.java
index cde4b36..b4f4a96 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/Rfc5424Layout.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/Rfc5424Layout.java
@@ -128,7 +128,7 @@ public final class Rfc5424Layout extends AbstractStringLayout {
             final String exceptionPattern, final boolean useTLSMessageFormat, final LoggerFields[] loggerFields) {
         super(charset);
         final PatternParser exceptionParser = createPatternParser(config, ThrowablePatternConverter.class);
-        exceptionFormatters = exceptionPattern == null ? null : exceptionParser.parse(exceptionPattern, false, false);
+        exceptionFormatters = exceptionPattern == null ? null : exceptionParser.parse(exceptionPattern, false, false, false);
         this.facility = facility;
         this.defaultId = id == null ? DEFAULT_ID : id;
         this.enterpriseNumber = ein;
@@ -207,7 +207,7 @@ public final class Rfc5424Layout extends AbstractStringLayout {
                     final PatternParser fieldParser = createPatternParser(config, null);
 
                     for (final Map.Entry<String, String> entry : fields.entrySet()) {
-                        final List<PatternFormatter> formatters = fieldParser.parse(entry.getValue(), false, false);
+                        final List<PatternFormatter> formatters = fieldParser.parse(entry.getValue(), false, false, false);
                         sdParams.put(entry.getKey(), formatters);
                     }
                     final FieldFormatter fieldFormatter = new FieldFormatter(sdParams,

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/42f8f080/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/ScriptPatternSelector.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/ScriptPatternSelector.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/ScriptPatternSelector.java
index 7f926b7..48dba2e 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/ScriptPatternSelector.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/ScriptPatternSelector.java
@@ -56,8 +56,8 @@ public class ScriptPatternSelector implements PatternSelector {
 
 
     public ScriptPatternSelector(final AbstractScript script, final PatternMatch[] properties, final String defaultPattern,
-                                 final boolean alwaysWriteExceptions, final boolean noConsoleNoAnsi,
-                                 final Configuration config) {
+                                 final boolean alwaysWriteExceptions, final boolean disablAnsi,
+                                 final boolean noConsoleNoAnsi, final Configuration config) {
         this.script = script;
         this.configuration = config;
         if (!(script instanceof ScriptRef)) {
@@ -66,7 +66,7 @@ public class ScriptPatternSelector implements PatternSelector {
         final PatternParser parser = PatternLayout.createPatternParser(config);
         for (final PatternMatch property : properties) {
             try {
-                final List<PatternFormatter> list = parser.parse(property.getPattern(), alwaysWriteExceptions, noConsoleNoAnsi);
+                final List<PatternFormatter> list = parser.parse(property.getPattern(), alwaysWriteExceptions, disablAnsi, noConsoleNoAnsi);
                 formatterMap.put(property.getKey(), list.toArray(new PatternFormatter[list.size()]));
                 patternMap.put(property.getKey(), property.getPattern());
             } catch (final RuntimeException ex) {
@@ -74,7 +74,7 @@ public class ScriptPatternSelector implements PatternSelector {
             }
         }
         try {
-            final List<PatternFormatter> list = parser.parse(defaultPattern, alwaysWriteExceptions, noConsoleNoAnsi);
+            final List<PatternFormatter> list = parser.parse(defaultPattern, alwaysWriteExceptions, disablAnsi, noConsoleNoAnsi);
             defaultFormatters = list.toArray(new PatternFormatter[list.size()]);
             this.defaultPattern = defaultPattern;
         } catch (final RuntimeException ex) {
@@ -103,6 +103,7 @@ public class ScriptPatternSelector implements PatternSelector {
                                                        @PluginElement("PatternMatch") final PatternMatch[] properties,
                                                        @PluginAttribute("defaultPattern") String defaultPattern,
                                                        @PluginAttribute(value = "alwaysWriteExceptions", defaultBoolean = true) final boolean alwaysWriteExceptions,
+                                                       @PluginAttribute(value = "disableAnsi", defaultBoolean = false) final boolean disableAnsi,
                                                        @PluginAttribute(value = "noConsoleNoAnsi", defaultBoolean = false) final boolean noConsoleNoAnsi,
                                                        @PluginConfiguration final Configuration config) {
         if (script == null) {
@@ -122,7 +123,7 @@ public class ScriptPatternSelector implements PatternSelector {
             LOGGER.warn("No marker patterns were provided");
             return null;
         }
-        return new ScriptPatternSelector(script, properties, defaultPattern, alwaysWriteExceptions, noConsoleNoAnsi, config);
+        return new ScriptPatternSelector(script, properties, defaultPattern, alwaysWriteExceptions, disableAnsi, noConsoleNoAnsi, config);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/42f8f080/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/YamlLayout.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/YamlLayout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/YamlLayout.java
index 52837c8..ed25d10 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/YamlLayout.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/YamlLayout.java
@@ -713,8 +713,8 @@ public final class YamlLayout extends AbstractJacksonLayout {
             final String footerPattern, final Charset charset, final boolean includeStacktrace) {
         super(config, new JacksonFactory.YAML(includeStacktrace).newWriter(locationInfo, properties, compact), charset, compact,
                 complete, eventEol,
-                PatternLayout.createSerializer(config, null, headerPattern, DEFAULT_HEADER, null, false, false),
-                PatternLayout.createSerializer(config, null, footerPattern, DEFAULT_FOOTER, null, false, false));
+                PatternLayout.createSerializer(config, null, headerPattern, DEFAULT_HEADER, null, false, false, false),
+                PatternLayout.createSerializer(config, null, footerPattern, DEFAULT_FOOTER, null, false, false, false));
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/42f8f080/log4j-core/src/main/java/org/apache/logging/log4j/core/net/SmtpManager.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/SmtpManager.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/SmtpManager.java
index 5494911..2b45cb7 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/SmtpManager.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/SmtpManager.java
@@ -141,7 +141,7 @@ public class SmtpManager extends AbstractManager {
         sb.append(filterName);
 
         final String name = "SMTP:" + NameUtil.md5(sb.toString());
-        final Serializer subjectSerializer = PatternLayout.createSerializer(config, null, subject, null, null, false, false);
+        final Serializer subjectSerializer = PatternLayout.createSerializer(config, null, subject, null, null, false, false, false);
 
         return getManager(name, FACTORY, new FactoryData(to, cc, bcc, from, replyTo, subjectSerializer,
             protocol, host, port, username, password, isDebug, numElements));

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/42f8f080/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/HighlightConverter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/HighlightConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/HighlightConverter.java
index eb46a7a..5ab92bd 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/HighlightConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/HighlightConverter.java
@@ -66,6 +66,14 @@ import org.apache.logging.log4j.util.Strings;
  * You can use whitespace around the comma and equal sign. The names in values MUST come from the
  * {@linkplain AnsiEscape} enum, case is normalized to upper-case internally.
  * </p>
+ *
+ * <p>
+ * To disable ANSI output unconditionally, specify an additional option <code>disableAnsi=true</code>, or to
+ * disable ANSI output if no console is detected, specify option <code>noConsoleNoAnsi=true</code> e.g..
+ * </p>
+ * <pre>
+  * %highlight{%d{ ISO8601 } [%t] %-5level: %msg%n%throwable}{STYLE=DEFAULT, noConsoleNoAnsi=true}
+  * </pre>
  */
 @Plugin(name = "highlight", category = PatternConverter.CATEGORY)
 @ConverterKeys({ "highlight" })
@@ -137,7 +145,9 @@ public final class HighlightConverter extends LogEventPatternConverter implement
             return DEFAULT_STYLES;
         }
         // Feels like a hack. Should String[] options change to a Map<String,String>?
-        final String string = options[1].replaceAll(PatternParser.NO_CONSOLE_NO_ANSI + "=(true|false)", Strings.EMPTY);
+        final String string = options[1]
+                .replaceAll(PatternParser.DISABLE_ANSI + "=(true|false)", Strings.EMPTY)
+                .replaceAll(PatternParser.NO_CONSOLE_NO_ANSI + "=(true|false)", Strings.EMPTY);
         //
         final Map<String, String> styles = AnsiEscape.createMap(string, new String[] {STYLE_KEY});
         final Map<Level, String> levelStyles = new HashMap<>(DEFAULT_STYLES);
@@ -184,8 +194,9 @@ public final class HighlightConverter extends LogEventPatternConverter implement
         }
         final PatternParser parser = PatternLayout.createPatternParser(config);
         final List<PatternFormatter> formatters = parser.parse(options[0]);
+        final boolean disableAnsi = Arrays.toString(options).contains(PatternParser.DISABLE_ANSI + "=true");
         final boolean noConsoleNoAnsi = Arrays.toString(options).contains(PatternParser.NO_CONSOLE_NO_ANSI + "=true");
-        final boolean hideAnsi = noConsoleNoAnsi && System.console() == null;
+        final boolean hideAnsi = disableAnsi || (noConsoleNoAnsi && System.console() == null);
         return new HighlightConverter(formatters, createLevelStyleMap(options), hideAnsi);
     }
 

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/42f8f080/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java
index 4adb90a..cadf0fb 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java
@@ -41,6 +41,7 @@ import org.apache.logging.log4j.util.Strings;
  * PatternConverters}.
  */
 public final class PatternParser {
+    static final String DISABLE_ANSI = "disableAnsi";
     static final String NO_CONSOLE_NO_ANSI = "noConsoleNoAnsi";
 
     /**
@@ -159,16 +160,16 @@ public final class PatternParser {
     }
 
     public List<PatternFormatter> parse(final String pattern) {
-        return parse(pattern, false, false);
+        return parse(pattern, false, false, false);
     }
 
     public List<PatternFormatter> parse(final String pattern, final boolean alwaysWriteExceptions,
-            final boolean noConsoleNoAnsi) {
+           boolean disableAnsi, final boolean noConsoleNoAnsi) {
         final List<PatternFormatter> list = new ArrayList<>();
         final List<PatternConverter> converters = new ArrayList<>();
         final List<FormattingInfo> fields = new ArrayList<>();
 
-        parse(pattern, converters, fields, noConsoleNoAnsi, true);
+        parse(pattern, converters, fields, disableAnsi, noConsoleNoAnsi, true);
 
         final Iterator<FormattingInfo> fieldIter = fields.iterator();
         boolean handlesThrowable = false;
@@ -304,6 +305,8 @@ public final class PatternParser {
      *            list to receive pattern converters.
      * @param formattingInfos
      *            list to receive field specifiers corresponding to pattern converters.
+     * @param disableAnsi
+     *            if all ansi color codes should be disabled.
      * @param noConsoleNoAnsi
      *            TODO
      * @param convertBackslashes if {@code true}, backslash characters are treated as escape characters and character
@@ -311,7 +314,7 @@ public final class PatternParser {
      */
     public void parse(final String pattern, final List<PatternConverter> patternConverters,
             final List<FormattingInfo> formattingInfos, final boolean noConsoleNoAnsi,
-            final boolean convertBackslashes) {
+            final boolean disableAnsi, final boolean convertBackslashes) {
         Objects.requireNonNull(pattern, "pattern");
 
         final StringBuilder currentLiteral = new StringBuilder(BUF_SIZE);
@@ -384,7 +387,7 @@ public final class PatternParser {
                         state = ParserState.MIN_STATE;
                     } else {
                         i = finalizeConverter(c, pattern, i, currentLiteral, formattingInfo, converterRules,
-                                patternConverters, formattingInfos, noConsoleNoAnsi, convertBackslashes);
+                                patternConverters, formattingInfos, noConsoleNoAnsi, disableAnsi, convertBackslashes);
 
                         // Next pattern is assumed to be a literal.
                         state = ParserState.LITERAL_STATE;
@@ -406,7 +409,7 @@ public final class PatternParser {
                     state = ParserState.DOT_STATE;
                 } else {
                     i = finalizeConverter(c, pattern, i, currentLiteral, formattingInfo, converterRules,
-                            patternConverters, formattingInfos, noConsoleNoAnsi, convertBackslashes);
+                            patternConverters, formattingInfos, noConsoleNoAnsi, disableAnsi, convertBackslashes);
                     state = ParserState.LITERAL_STATE;
                     formattingInfo = FormattingInfo.getDefault();
                     currentLiteral.setLength(0);
@@ -447,7 +450,7 @@ public final class PatternParser {
                             formattingInfo.getMaxLength() * DECIMAL + c - '0', formattingInfo.isLeftTruncate());
                 } else {
                     i = finalizeConverter(c, pattern, i, currentLiteral, formattingInfo, converterRules,
-                            patternConverters, formattingInfos, noConsoleNoAnsi, convertBackslashes);
+                            patternConverters, formattingInfos, noConsoleNoAnsi, disableAnsi, convertBackslashes);
                     state = ParserState.LITERAL_STATE;
                     formattingInfo = FormattingInfo.getDefault();
                     currentLiteral.setLength(0);
@@ -480,7 +483,8 @@ public final class PatternParser {
      * @return converter or null.
      */
     private PatternConverter createConverter(final String converterId, final StringBuilder currentLiteral,
-            final Map<String, Class<PatternConverter>> rules, final List<String> options, final boolean noConsoleNoAnsi) {
+            final Map<String, Class<PatternConverter>> rules, final List<String> options, final boolean noConsoleNoAnsi,
+            final boolean disableAnsi) {
         String converterName = converterId;
         Class<PatternConverter> converterClass = null;
 
@@ -499,6 +503,7 @@ public final class PatternParser {
         }
 
         if (AnsiConverter.class.isAssignableFrom(converterClass)) {
+            options.add(DISABLE_ANSI + '=' + disableAnsi);
             options.add(NO_CONSOLE_NO_ANSI + '=' + noConsoleNoAnsi);
         }
         // Work around the regression bug in Class.getDeclaredMethods() in Oracle Java in version > 1.6.0_17:
@@ -582,6 +587,8 @@ public final class PatternParser {
      *            list to receive corresponding field specifier.
      * @param noConsoleNoAnsi
      *            TODO
+     * @param disableAnsi
+     *            if all ansi color codes should be disabled.
      * @param convertBackslashes if {@code true}, backslash characters are treated as escape characters and character
      *            sequences like "\" followed by "t" (backslash+t) are converted to special characters like '\t' (tab).
      * @return position after format specifier sequence.
@@ -589,7 +596,8 @@ public final class PatternParser {
     private int finalizeConverter(final char c, final String pattern, final int start,
             final StringBuilder currentLiteral, final FormattingInfo formattingInfo,
             final Map<String, Class<PatternConverter>> rules, final List<PatternConverter> patternConverters,
-            final List<FormattingInfo> formattingInfos, final boolean noConsoleNoAnsi, final boolean convertBackslashes) {
+            final List<FormattingInfo> formattingInfos, final boolean noConsoleNoAnsi, final boolean disableAnsi,
+            final boolean convertBackslashes) {
         int i = start;
         final StringBuilder convBuf = new StringBuilder();
         i = extractConverter(c, pattern, i, convBuf, currentLiteral);
@@ -599,7 +607,8 @@ public final class PatternParser {
         final List<String> options = new ArrayList<>();
         i = extractOptions(pattern, i, options);
 
-        final PatternConverter pc = createConverter(converterId, currentLiteral, rules, options, noConsoleNoAnsi);
+        final PatternConverter pc = createConverter(converterId, currentLiteral, rules, options, noConsoleNoAnsi,
+                disableAnsi);
 
         if (pc == null) {
             StringBuilder msg;

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/42f8f080/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/StyleConverter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/StyleConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/StyleConverter.java
index 3c100e3..821005a 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/StyleConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/StyleConverter.java
@@ -28,6 +28,11 @@ import org.apache.logging.log4j.util.PerformanceSensitive;
 
 /**
  * Style pattern converter. Adds ANSI color styling to the result of the enclosed pattern.
+ *
+ * <p>
+ * To disable ANSI output unconditionally, specify an additional option <code>disableAnsi=true</code>, or to
+ * disable ANSI output if no console is detected, specify option <code>noConsoleNoAnsi=true</code>.
+ * </p>
  */
 @Plugin(name = "style", category = PatternConverter.CATEGORY)
 @ConverterKeys({ "style" })
@@ -86,8 +91,9 @@ public final class StyleConverter extends LogEventPatternConverter implements An
         final PatternParser parser = PatternLayout.createPatternParser(config);
         final List<PatternFormatter> formatters = parser.parse(options[0]);
         final String style = AnsiEscape.createSequence(options[1].split(Patterns.COMMA_SEPARATOR));
+        final boolean disableAnsi = Arrays.toString(options).contains(PatternParser.DISABLE_ANSI + "=true");
         final boolean noConsoleNoAnsi = Arrays.toString(options).contains(PatternParser.NO_CONSOLE_NO_ANSI + "=true");
-        final boolean hideAnsi = noConsoleNoAnsi && System.console() == null;
+        final boolean hideAnsi = disableAnsi || (noConsoleNoAnsi && System.console() == null);
         return new StyleConverter(formatters, style, hideAnsi);
     }
 

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/42f8f080/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/PatternLayoutTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/PatternLayoutTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/PatternLayoutTest.java
index aab5896..8276a36 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/PatternLayoutTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/PatternLayoutTest.java
@@ -236,7 +236,7 @@ public class PatternLayoutTest {
     public void testPatternSelector() throws Exception {
         final PatternMatch[] patterns = new PatternMatch[1];
         patterns[0] = new PatternMatch("FLOW", "%d %-5p [%t]: ====== %C{1}.%M:%L %m ======%n");
-        final PatternSelector selector = MarkerPatternSelector.createSelector(patterns, "%d %-5p [%t]: %m%n", true, true, ctx.getConfiguration());
+        final PatternSelector selector = MarkerPatternSelector.createSelector(patterns, "%d %-5p [%t]: %m%n", true, true, true, ctx.getConfiguration());
         final PatternLayout layout = PatternLayout.newBuilder().withPatternSelector(selector)
                 .withConfiguration(ctx.getConfiguration()).build();
         final LogEvent event1 = Log4jLogEvent.newBuilder() //

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/42f8f080/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/PatternSelectorTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/PatternSelectorTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/PatternSelectorTest.java
index 152c605..0949ab0 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/PatternSelectorTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/PatternSelectorTest.java
@@ -41,7 +41,7 @@ public class PatternSelectorTest {
     public void testPatternSelector() throws Exception {
         final PatternMatch[] patterns = new PatternMatch[1];
         patterns[0] = new PatternMatch("FLOW", "%d %-5p [%t]: ====== %C{1}.%M:%L %m ======%n");
-        final PatternSelector selector = MarkerPatternSelector.createSelector(patterns, "%d %-5p [%t]: %m%n", true, true, ctx.getConfiguration());
+        final PatternSelector selector = MarkerPatternSelector.createSelector(patterns, "%d %-5p [%t]: %m%n", true, true, true, ctx.getConfiguration());
         final PatternLayout layout = PatternLayout.newBuilder().withPatternSelector(selector)
                 .withConfiguration(ctx.getConfiguration()).build();
         final LogEvent event1 = Log4jLogEvent.newBuilder() //

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/42f8f080/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/HighlightConverterTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/HighlightConverterTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/HighlightConverterTest.java
index 6051f85..37b803b 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/HighlightConverterTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/HighlightConverterTest.java
@@ -30,7 +30,7 @@ public class HighlightConverterTest {
 
     @Test
     public void testAnsiEmpty() {
-        final String[] options = {"", PatternParser.NO_CONSOLE_NO_ANSI + "=false"};
+        final String[] options = {"", PatternParser.NO_CONSOLE_NO_ANSI + "=false, " + PatternParser.DISABLE_ANSI + "=false"};
         final HighlightConverter converter = HighlightConverter.newInstance(null, options);
 
         final LogEvent event = Log4jLogEvent.newBuilder().setLevel(Level.INFO).setLoggerName("a.b.c").setMessage(
@@ -42,7 +42,7 @@ public class HighlightConverterTest {
 
     @Test
     public void testAnsiNonEmpty() {
-        final String[] options = {"%-5level: %msg", PatternParser.NO_CONSOLE_NO_ANSI + "=false"};
+        final String[] options = {"%-5level: %msg", PatternParser.NO_CONSOLE_NO_ANSI + "=false, " + PatternParser.DISABLE_ANSI + "=false"};
         final HighlightConverter converter = HighlightConverter.newInstance(null, options);
 
         final LogEvent event = Log4jLogEvent.newBuilder().setLevel(Level.INFO).setLoggerName("a.b.c").setMessage(
@@ -54,7 +54,7 @@ public class HighlightConverterTest {
 
     @Test
     public void testNoAnsiEmpty() {
-        final String[] options = {"", PatternParser.NO_CONSOLE_NO_ANSI + "=true"};
+        final String[] options = {"", PatternParser.DISABLE_ANSI + "=true"};
         final HighlightConverter converter = HighlightConverter.newInstance(null, options);
 
         final LogEvent event = Log4jLogEvent.newBuilder().setLevel(Level.INFO).setLoggerName("a.b.c").setMessage(
@@ -66,7 +66,7 @@ public class HighlightConverterTest {
 
     @Test
     public void testNoAnsiNonEmpty() {
-        final String[] options = {"%-5level: %msg", PatternParser.NO_CONSOLE_NO_ANSI + "=true"};
+        final String[] options = {"%-5level: %msg", PatternParser.DISABLE_ANSI + "=true"};
         final HighlightConverter converter = HighlightConverter.newInstance(null, options);
 
         final LogEvent event = Log4jLogEvent.newBuilder().setLevel(Level.INFO).setLoggerName("a.b.c").setMessage(

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/42f8f080/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/PatternParserTest2.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/PatternParserTest2.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/PatternParserTest2.java
index ded0675..45c0a8b 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/PatternParserTest2.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/PatternParserTest2.java
@@ -64,7 +64,7 @@ public class PatternParserTest2 {
         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, convert);
+        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()];

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/42f8f080/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/PatternLayoutBenchmark.java
----------------------------------------------------------------------
diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/PatternLayoutBenchmark.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/PatternLayoutBenchmark.java
index 8d39732..c7b5948 100644
--- a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/PatternLayoutBenchmark.java
+++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/PatternLayoutBenchmark.java
@@ -60,18 +60,18 @@ public class PatternLayoutBenchmark {
     private static final String DEFAULT_ENCODING = CHARSET_DEFAULT.name();
     private static final String STRING_SHIFT_JIS = "SHIFT_JIS";
     private static final Charset CHARSET_SHIFT_JIS = Charset.forName(STRING_SHIFT_JIS);
-    private final PatternLayout PATTERN_M = PatternLayout.createLayout("%m%n", null, null, null, CHARSET_DEFAULT, false, true, null, null);
-    private final PatternLayout PATTERN_SPACE = PatternLayout.createLayout(" ", null, null, null, CHARSET_DEFAULT, false, true, null, null);
-    private final PatternLayout PATTERN_M_C = PatternLayout.createLayout("%c %m%n", null, null, null, CHARSET_DEFAULT, false, true, null, null);
-    private final PatternLayout PATTERN_M_C_D = PatternLayout.createLayout("%d %c %m%n", null, null, null, CHARSET_DEFAULT, false, true, null, null);
-    private final PatternLayout PATTERN_M_D = PatternLayout.createLayout("%d %m%n", null, null, null, CHARSET_DEFAULT, false, true, null, null);
-    private final PatternLayout PATTERN_C = PatternLayout.createLayout("%c%n", null, null, null, CHARSET_DEFAULT, false, true, null, null);
-    private final PatternLayout PATTERN_D = PatternLayout.createLayout("%d%n", null, null, null, CHARSET_DEFAULT, false, true, null, null);
-    private final PatternLayout PATTERN_M_D_NOSPACE = PatternLayout.createLayout("%d%m%n", null, null, null, CHARSET_DEFAULT, false, true, null, null);
-    private final PatternLayout PATTERN_M_C_NOSPACE = PatternLayout.createLayout("%c%m%n", null, null, null, CHARSET_DEFAULT, false, true, null, null);
-    private final PatternLayout PATTERN_M_EX = PatternLayout.createLayout("%m %ex%n", null, null, null, CHARSET_DEFAULT, false, true, null, null);
-    private final PatternLayout PATTERN_M_D_EX = PatternLayout.createLayout("%d %m%ex%n", null, null, null, CHARSET_DEFAULT, false, true, null, null);
-    private final PatternLayout PATTERN_M_C_D_EX = PatternLayout.createLayout("%d %c %m%ex%n", null, null, null, CHARSET_DEFAULT, false, true, null, null);
+    private final PatternLayout PATTERN_M = PatternLayout.createLayout("%m%n", null, null, null, CHARSET_DEFAULT, false, true, true, null, null);
+    private final PatternLayout PATTERN_SPACE = PatternLayout.createLayout(" ", null, null, null, CHARSET_DEFAULT, false, true, true, null, null);
+    private final PatternLayout PATTERN_M_C = PatternLayout.createLayout("%c %m%n", null, null, null, CHARSET_DEFAULT, false, true, true, null, null);
+    private final PatternLayout PATTERN_M_C_D = PatternLayout.createLayout("%d %c %m%n", null, null, null, CHARSET_DEFAULT, false, true, true, null, null);
+    private final PatternLayout PATTERN_M_D = PatternLayout.createLayout("%d %m%n", null, null, null, CHARSET_DEFAULT, false, true, true, null, null);
+    private final PatternLayout PATTERN_C = PatternLayout.createLayout("%c%n", null, null, null, CHARSET_DEFAULT, false, true, true, null, null);
+    private final PatternLayout PATTERN_D = PatternLayout.createLayout("%d%n", null, null, null, CHARSET_DEFAULT, false, true, true, null, null);
+    private final PatternLayout PATTERN_M_D_NOSPACE = PatternLayout.createLayout("%d%m%n", null, null, null, CHARSET_DEFAULT, false, true, true, null, null);
+    private final PatternLayout PATTERN_M_C_NOSPACE = PatternLayout.createLayout("%c%m%n", null, null, null, CHARSET_DEFAULT, false, true, true, null, null);
+    private final PatternLayout PATTERN_M_EX = PatternLayout.createLayout("%m %ex%n", null, null, null, CHARSET_DEFAULT, false, true, true, null, null);
+    private final PatternLayout PATTERN_M_D_EX = PatternLayout.createLayout("%d %m%ex%n", null, null, null, CHARSET_DEFAULT, false, true, true, null, null);
+    private final PatternLayout PATTERN_M_C_D_EX = PatternLayout.createLayout("%d %c %m%ex%n", null, null, null, CHARSET_DEFAULT, false, true, true, null, null);
 
     private static LogEvent createLogEvent() {
         final Marker marker = null;

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/42f8f080/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/PatternLayoutComparisonBenchmark.java
----------------------------------------------------------------------
diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/PatternLayoutComparisonBenchmark.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/PatternLayoutComparisonBenchmark.java
index 0bcf3da..ab9cd97 100644
--- a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/PatternLayoutComparisonBenchmark.java
+++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/PatternLayoutComparisonBenchmark.java
@@ -60,7 +60,7 @@ public class PatternLayoutComparisonBenchmark {
     private static final Charset CHARSET_DEFAULT = Charset.defaultCharset();
     private static final String LOG4JPATTERN = "%d %5p [%t] %c{1} %X{transactionId} - %m%n";
     private final PatternLayout LOG4J2_PATTERN_LAYOUT = PatternLayout.createLayout(LOG4JPATTERN, null,
-            null, null, CHARSET_DEFAULT, false, true, null, null);
+            null, null, CHARSET_DEFAULT, false, true, true, null, null);
 
     private static LogEvent createLog4j2Event() {
         final Marker marker = null;

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/42f8f080/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/TextEncoderHelperBenchmark.java
----------------------------------------------------------------------
diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/TextEncoderHelperBenchmark.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/TextEncoderHelperBenchmark.java
index bf67c9d..d619399 100644
--- a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/TextEncoderHelperBenchmark.java
+++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/TextEncoderHelperBenchmark.java
@@ -61,7 +61,7 @@ public class TextEncoderHelperBenchmark {
 
     final static LogEvent EVENT = createLogEvent();
     private static final Charset CHARSET_DEFAULT = Charset.defaultCharset();
-    private final PatternLayout PATTERN_M_C_D = PatternLayout.createLayout("%d %c %m%n", null, null, null, CHARSET_DEFAULT, false, true, null, null);
+    private final PatternLayout PATTERN_M_C_D = PatternLayout.createLayout("%d %c %m%n", null, null, null, CHARSET_DEFAULT, false, true, true, null, null);
     private final Destination destination = new Destination();
 
     class Destination implements ByteBufferDestination {

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/42f8f080/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/ThreadLocalVsPoolBenchmark.java
----------------------------------------------------------------------
diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/ThreadLocalVsPoolBenchmark.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/ThreadLocalVsPoolBenchmark.java
index 831c4f8..4aeeb90 100644
--- a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/ThreadLocalVsPoolBenchmark.java
+++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/ThreadLocalVsPoolBenchmark.java
@@ -80,7 +80,7 @@ public class ThreadLocalVsPoolBenchmark {
     private static PatternFormatter[] createFormatters() {
         final Configuration config = new DefaultConfiguration();
         final PatternParser parser = new PatternParser(config, "Converter", LogEventPatternConverter.class);
-        final List<PatternFormatter> result = parser.parse(LOG4JPATTERN, false, true);
+        final List<PatternFormatter> result = parser.parse(LOG4JPATTERN, false, false, true);
         return result.toArray(new PatternFormatter[result.size()]);
     }
 


[4/6] logging-log4j2 git commit: LOG4J2-1685 Consistent parameter order

Posted by mi...@apache.org.
LOG4J2-1685 Consistent parameter order


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/3baa703b
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/3baa703b
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/3baa703b

Branch: refs/heads/LOG4J2-1685
Commit: 3baa703bc78f8ff5d92580bd1b743066b285d036
Parents: 375eb14
Author: Mikael St�ldal <mi...@magine.com>
Authored: Fri Nov 11 13:52:14 2016 +0100
Committer: Mikael St�ldal <mi...@magine.com>
Committed: Fri Nov 11 13:52:14 2016 +0100

----------------------------------------------------------------------
 .../log4j/core/pattern/PatternParser.java       | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/3baa703b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java
index 42e8adb..3d14830 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java
@@ -313,8 +313,8 @@ public final class PatternParser {
      *            sequences like "\" followed by "t" (backslash+t) are converted to special characters like '\t' (tab).
      */
     public void parse(final String pattern, final List<PatternConverter> patternConverters,
-            final List<FormattingInfo> formattingInfos, final boolean noConsoleNoAnsi,
-            final boolean disableAnsi, final boolean convertBackslashes) {
+            final List<FormattingInfo> formattingInfos, final boolean disableAnsi,
+            final boolean noConsoleNoAnsi, final boolean convertBackslashes) {
         Objects.requireNonNull(pattern, "pattern");
 
         final StringBuilder currentLiteral = new StringBuilder(BUF_SIZE);
@@ -387,7 +387,7 @@ public final class PatternParser {
                         state = ParserState.MIN_STATE;
                     } else {
                         i = finalizeConverter(c, pattern, i, currentLiteral, formattingInfo, converterRules,
-                                patternConverters, formattingInfos, noConsoleNoAnsi, disableAnsi, convertBackslashes);
+                                patternConverters, formattingInfos, disableAnsi, noConsoleNoAnsi, convertBackslashes);
 
                         // Next pattern is assumed to be a literal.
                         state = ParserState.LITERAL_STATE;
@@ -409,7 +409,7 @@ public final class PatternParser {
                     state = ParserState.DOT_STATE;
                 } else {
                     i = finalizeConverter(c, pattern, i, currentLiteral, formattingInfo, converterRules,
-                            patternConverters, formattingInfos, noConsoleNoAnsi, disableAnsi, convertBackslashes);
+                            patternConverters, formattingInfos, disableAnsi, noConsoleNoAnsi, convertBackslashes);
                     state = ParserState.LITERAL_STATE;
                     formattingInfo = FormattingInfo.getDefault();
                     currentLiteral.setLength(0);
@@ -450,7 +450,7 @@ public final class PatternParser {
                             formattingInfo.getMaxLength() * DECIMAL + c - '0', formattingInfo.isLeftTruncate());
                 } else {
                     i = finalizeConverter(c, pattern, i, currentLiteral, formattingInfo, converterRules,
-                            patternConverters, formattingInfos, noConsoleNoAnsi, disableAnsi, convertBackslashes);
+                            patternConverters, formattingInfos, disableAnsi, noConsoleNoAnsi, convertBackslashes);
                     state = ParserState.LITERAL_STATE;
                     formattingInfo = FormattingInfo.getDefault();
                     currentLiteral.setLength(0);
@@ -486,8 +486,8 @@ public final class PatternParser {
      * @return converter or null.
      */
     private PatternConverter createConverter(final String converterId, final StringBuilder currentLiteral,
-            final Map<String, Class<PatternConverter>> rules, final List<String> options, final boolean noConsoleNoAnsi,
-            final boolean disableAnsi) {
+            final Map<String, Class<PatternConverter>> rules, final List<String> options, final boolean disableAnsi,
+            final boolean noConsoleNoAnsi) {
         String converterName = converterId;
         Class<PatternConverter> converterClass = null;
 
@@ -599,7 +599,7 @@ public final class PatternParser {
     private int finalizeConverter(final char c, final String pattern, final int start,
             final StringBuilder currentLiteral, final FormattingInfo formattingInfo,
             final Map<String, Class<PatternConverter>> rules, final List<PatternConverter> patternConverters,
-            final List<FormattingInfo> formattingInfos, final boolean noConsoleNoAnsi, final boolean disableAnsi,
+            final List<FormattingInfo> formattingInfos, final boolean disableAnsi, final boolean noConsoleNoAnsi,
             final boolean convertBackslashes) {
         int i = start;
         final StringBuilder convBuf = new StringBuilder();
@@ -610,8 +610,8 @@ public final class PatternParser {
         final List<String> options = new ArrayList<>();
         i = extractOptions(pattern, i, options);
 
-        final PatternConverter pc = createConverter(converterId, currentLiteral, rules, options, noConsoleNoAnsi,
-                disableAnsi);
+        final PatternConverter pc = createConverter(converterId, currentLiteral, rules, options, disableAnsi,
+            noConsoleNoAnsi);
 
         if (pc == null) {
             StringBuilder msg;


[3/6] logging-log4j2 git commit: LOG4J2-1685 Update documentation

Posted by mi...@apache.org.
LOG4J2-1685 Update documentation


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/375eb14d
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/375eb14d
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/375eb14d

Branch: refs/heads/LOG4J2-1685
Commit: 375eb14debc739ff0272d4751f4323cfcd11b479
Parents: b35b135
Author: Mikael St�ldal <mi...@magine.com>
Authored: Fri Nov 11 13:47:16 2016 +0100
Committer: Mikael St�ldal <mi...@magine.com>
Committed: Fri Nov 11 13:47:16 2016 +0100

----------------------------------------------------------------------
 .../logging/log4j/core/pattern/PatternParser.java    | 15 +++++++++------
 src/site/xdoc/manual/layouts.xml.vm                  |  5 +++++
 2 files changed, 14 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/375eb14d/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java
index cadf0fb..42e8adb 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java
@@ -306,9 +306,9 @@ public final class PatternParser {
      * @param formattingInfos
      *            list to receive field specifiers corresponding to pattern converters.
      * @param disableAnsi
-     *            if all ansi color codes should be disabled.
+     *            do not output ANSI escape codes
      * @param noConsoleNoAnsi
-     *            TODO
+     *            do not do not output ANSI escape codes if {@link System#console()}
      * @param convertBackslashes if {@code true}, backslash characters are treated as escape characters and character
      *            sequences like "\" followed by "t" (backslash+t) are converted to special characters like '\t' (tab).
      */
@@ -479,7 +479,10 @@ public final class PatternParser {
      *            map of stock pattern converters keyed by format specifier.
      * @param options
      *            converter options.
-     * @param noConsoleNoAnsi TODO
+     * @param disableAnsi
+     *            do not output ANSI escape codes
+     * @param noConsoleNoAnsi
+     *            do not do not output ANSI escape codes if {@link System#console()}
      * @return converter or null.
      */
     private PatternConverter createConverter(final String converterId, final StringBuilder currentLiteral,
@@ -585,10 +588,10 @@ public final class PatternParser {
      *            list to receive parsed pattern converter.
      * @param formattingInfos
      *            list to receive corresponding field specifier.
-     * @param noConsoleNoAnsi
-     *            TODO
      * @param disableAnsi
-     *            if all ansi color codes should be disabled.
+     *            do not output ANSI escape codes
+     * @param noConsoleNoAnsi
+     *            do not do not output ANSI escape codes if {@link System#console()}
      * @param convertBackslashes if {@code true}, backslash characters are treated as escape characters and character
      *            sequences like "\" followed by "t" (backslash+t) are converted to special characters like '\t' (tab).
      * @return position after format specifier sequence.

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/375eb14d/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 aa151ab..73517cb 100644
--- a/src/site/xdoc/manual/layouts.xml.vm
+++ b/src/site/xdoc/manual/layouts.xml.vm
@@ -485,6 +485,11 @@ WARN  [main]: Message 2</pre>
               <td>The optional footer string to include at the bottom of each log file.</td>
             </tr>
             <tr>
+              <td>disableAnsi</td>
+              <td>boolean</td>
+              <td>If <code>true</code> (default is false), do not output ANSI escape codes.</td>
+            </tr>
+            <tr>
               <td>noConsoleNoAnsi</td>
               <td>boolean</td>
               <td>If <code>true</code> (default is false) and <code>System.console()</code> is null, do not output ANSI escape codes.</td>


[5/6] logging-log4j2 git commit: LOG4J2-1685 Avoid breaking binary compatibility

Posted by mi...@apache.org.
LOG4J2-1685 Avoid breaking binary compatibility


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/6630eae3
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/6630eae3
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/6630eae3

Branch: refs/heads/LOG4J2-1685
Commit: 6630eae39220c31cda185ef4d46538671e04fa64
Parents: 3baa703
Author: Mikael St�ldal <mi...@magine.com>
Authored: Fri Nov 11 14:16:59 2016 +0100
Committer: Mikael St�ldal <mi...@magine.com>
Committed: Fri Nov 11 14:16:59 2016 +0100

----------------------------------------------------------------------
 .../core/layout/MarkerPatternSelector.java      | 28 +++++++--
 .../log4j/core/layout/PatternLayout.java        | 63 ++++++++++++++++----
 .../core/layout/ScriptPatternSelector.java      | 30 ++++++++--
 .../log4j/core/pattern/PatternParser.java       | 25 ++++++++
 .../log4j/perf/jmh/PatternLayoutBenchmark.java  | 24 ++++----
 .../jmh/PatternLayoutComparisonBenchmark.java   | 13 ++--
 .../perf/jmh/TextEncoderHelperBenchmark.java    |  2 +-
 7 files changed, 144 insertions(+), 41 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6630eae3/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/MarkerPatternSelector.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/MarkerPatternSelector.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/MarkerPatternSelector.java
index 172df82..3ce69e1 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/MarkerPatternSelector.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/MarkerPatternSelector.java
@@ -16,6 +16,10 @@
  */
 package org.apache.logging.log4j.core.layout;
 
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.Marker;
 import org.apache.logging.log4j.core.LogEvent;
@@ -30,10 +34,6 @@ import org.apache.logging.log4j.core.pattern.PatternFormatter;
 import org.apache.logging.log4j.core.pattern.PatternParser;
 import org.apache.logging.log4j.status.StatusLogger;
 
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
 /**
  * Selects the pattern to use based on the Marker in the LogEvent.
  */
@@ -50,8 +50,17 @@ public class MarkerPatternSelector implements PatternSelector {
 
     private static Logger LOGGER = StatusLogger.getLogger();
 
-
+    /**
+     * @deprecated Use PluginFactory instead
+     */
+    @Deprecated
     public MarkerPatternSelector(final PatternMatch[] properties, final String defaultPattern,
+                                 final boolean alwaysWriteExceptions, final boolean noConsoleNoAnsi,
+                                 final Configuration config) {
+        this(properties, defaultPattern, alwaysWriteExceptions, false, noConsoleNoAnsi, config);
+    }
+
+    private MarkerPatternSelector(final PatternMatch[] properties, final String defaultPattern,
                                  final boolean alwaysWriteExceptions, final boolean disableAnsi,
                                  final boolean noConsoleNoAnsi, final Configuration config) {
         final PatternParser parser = PatternLayout.createPatternParser(config);
@@ -94,6 +103,15 @@ public class MarkerPatternSelector implements PatternSelector {
     public static MarkerPatternSelector createSelector(@PluginElement("PatternMatch") final PatternMatch[] properties,
                                                        @PluginAttribute("defaultPattern") String defaultPattern,
                                                        @PluginAttribute(value = "alwaysWriteExceptions", defaultBoolean = true) final boolean alwaysWriteExceptions,
+                                                       @PluginAttribute(value = "noConsoleNoAnsi", defaultBoolean = false) final boolean noConsoleNoAnsi,
+                                                       @PluginConfiguration final Configuration config) {
+        return createSelector(properties, defaultPattern, alwaysWriteExceptions, false, noConsoleNoAnsi, config);
+    }
+
+    @PluginFactory
+    public static MarkerPatternSelector createSelector(@PluginElement("PatternMatch") final PatternMatch[] properties,
+                                                       @PluginAttribute("defaultPattern") String defaultPattern,
+                                                       @PluginAttribute(value = "alwaysWriteExceptions", defaultBoolean = true) final boolean alwaysWriteExceptions,
                                                        @PluginAttribute(value = "disableAnsi", defaultBoolean = false) final boolean disableAnsi,
                                                        @PluginAttribute(value = "noConsoleNoAnsi", defaultBoolean = false) final boolean noConsoleNoAnsi,
                                                        @PluginConfiguration final Configuration config) {

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6630eae3/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java
index 284222d..1e2e537 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java
@@ -116,6 +116,12 @@ public final class PatternLayout extends AbstractStringLayout {
     }
 
     public static Serializer createSerializer(final Configuration configuration, final RegexReplacement replace,
+                                              final String pattern, final String defaultPattern, final PatternSelector patternSelector,
+                                              final boolean alwaysWriteExceptions, final boolean noConsoleNoAnsi) {
+        return createSerializer(configuration, replace, pattern, defaultPattern, patternSelector, alwaysWriteExceptions, false, noConsoleNoAnsi);
+    }
+
+    public static Serializer createSerializer(final Configuration configuration, final RegexReplacement replace,
             final String pattern, final String defaultPattern, final PatternSelector patternSelector,
             final boolean alwaysWriteExceptions, boolean disableAnsi, final boolean noConsoleNoAnsi) {
         if (Strings.isEmpty(pattern) && Strings.isEmpty(defaultPattern)) {
@@ -236,13 +242,11 @@ public final class PatternLayout extends AbstractStringLayout {
      *        The character set. The platform default is used if not specified.
      * @param alwaysWriteExceptions
      *        If {@code "true"} (default) exceptions are always written even if the pattern contains no exception tokens.
-     * @param disableAnsi
-     *        If {@code "true"} (default is false), do not output ANSI escape codes
      * @param noConsoleNoAnsi
      *        If {@code "true"} (default is false) and {@link System#console()} is null, do not output ANSI escape codes
-     * @param headerPattern
+     * @param header
      *        The footer to place at the top of the document, once.
-     * @param footerPattern
+     * @param footer
      *        The footer to place at the bottom of the document, once.
      * @return The PatternLayout.
      */
@@ -255,10 +259,9 @@ public final class PatternLayout extends AbstractStringLayout {
             // LOG4J2-783 use platform default by default, so do not specify defaultString for charset
             @PluginAttribute(value = "charset") final Charset charset,
             @PluginAttribute(value = "alwaysWriteExceptions", defaultBoolean = true) final boolean alwaysWriteExceptions,
-            @PluginAttribute(value = "disableAnsi", defaultBoolean = false) final boolean disableAnsi,
             @PluginAttribute(value = "noConsoleNoAnsi", defaultBoolean = false) final boolean noConsoleNoAnsi,
-            @PluginAttribute("header") final String headerPattern,
-            @PluginAttribute("footer") final String footerPattern) {
+            @PluginAttribute("header") final String header,
+            @PluginAttribute("footer") final String footer) {
         return newBuilder()
             .withPattern(pattern)
             .withPatternSelector(patternSelector)
@@ -266,10 +269,9 @@ public final class PatternLayout extends AbstractStringLayout {
             .withRegexReplacement(replace)
             .withCharset(charset)
             .withAlwaysWriteExceptions(alwaysWriteExceptions)
-            .withDisableAnsi(disableAnsi)
             .withNoConsoleNoAnsi(noConsoleNoAnsi)
-            .withHeader(headerPattern)
-            .withFooter(footerPattern)
+            .withHeader(header)
+            .withFooter(footer)
             .build();
     }
 
@@ -445,28 +447,47 @@ public final class PatternLayout extends AbstractStringLayout {
         private Builder() {
         }
 
-        // TODO: move javadocs from PluginFactory to here
 
+        /**
+         * @param pattern
+         *        The pattern. If not specified, defaults to DEFAULT_CONVERSION_PATTERN.
+         */
         public Builder withPattern(final String pattern) {
             this.pattern = pattern;
             return this;
         }
 
+        /**
+         * @param patternSelector
+         *        Allows different patterns to be used based on some selection criteria.
+         */
         public Builder withPatternSelector(final PatternSelector patternSelector) {
             this.patternSelector = patternSelector;
             return this;
         }
 
+        /**
+         * @param configuration
+         *        The Configuration. Some Converters require access to the Interpolator.
+         */
         public Builder withConfiguration(final Configuration configuration) {
             this.configuration = configuration;
             return this;
         }
 
+        /**
+         * @param regexReplacement
+         *        A Regex replacement
+         */
         public Builder withRegexReplacement(final RegexReplacement regexReplacement) {
             this.regexReplacement = regexReplacement;
             return this;
         }
 
+        /**
+         * @param charset
+         *        The character set. The platform default is used if not specified.
+         */
         public Builder withCharset(final Charset charset) {
             // LOG4J2-783 if null, use platform default by default
             if (charset != null) {
@@ -475,26 +496,46 @@ public final class PatternLayout extends AbstractStringLayout {
             return this;
         }
 
+        /**
+         * @param alwaysWriteExceptions
+         *        If {@code "true"} (default) exceptions are always written even if the pattern contains no exception tokens.
+         */
         public Builder withAlwaysWriteExceptions(final boolean alwaysWriteExceptions) {
             this.alwaysWriteExceptions = alwaysWriteExceptions;
             return this;
         }
 
+        /**
+         * @param disableAnsi
+         *        If {@code "true"} (default is false), do not output ANSI escape codes
+         */
         public Builder withDisableAnsi(final boolean disableAnsi) {
             this.disableAnsi = disableAnsi;
             return this;
         }
 
+        /**
+         * @param noConsoleNoAnsi
+         *        If {@code "true"} (default is false) and {@link System#console()} is null, do not output ANSI escape codes
+         */
         public Builder withNoConsoleNoAnsi(final boolean noConsoleNoAnsi) {
             this.noConsoleNoAnsi = noConsoleNoAnsi;
             return this;
         }
 
+        /**
+         * @param header
+         *        The footer to place at the top of the document, once.
+         */
         public Builder withHeader(final String header) {
             this.header = header;
             return this;
         }
 
+        /**
+         * @param footer
+         *        The footer to place at the bottom of the document, once.
+         */
         public Builder withFooter(final String footer) {
             this.footer = footer;
             return this;

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6630eae3/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/ScriptPatternSelector.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/ScriptPatternSelector.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/ScriptPatternSelector.java
index 48dba2e..e6772fd 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/ScriptPatternSelector.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/ScriptPatternSelector.java
@@ -16,6 +16,11 @@
  */
 package org.apache.logging.log4j.core.layout;
 
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import javax.script.SimpleBindings;
+
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.config.Configuration;
@@ -31,11 +36,6 @@ import org.apache.logging.log4j.core.script.AbstractScript;
 import org.apache.logging.log4j.core.script.ScriptRef;
 import org.apache.logging.log4j.status.StatusLogger;
 
-import javax.script.SimpleBindings;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
 /**
  * Selects the pattern to use based on the Marker in the LogEvent.
  */
@@ -55,7 +55,17 @@ public class ScriptPatternSelector implements PatternSelector {
     private final Configuration configuration;
 
 
+    /**
+     * @deprecated Use PluginFactory instead
+     */
+    @Deprecated
     public ScriptPatternSelector(final AbstractScript script, final PatternMatch[] properties, final String defaultPattern,
+                                 final boolean alwaysWriteExceptions, final boolean noConsoleNoAnsi,
+                                 final Configuration config) {
+        this(script, properties, defaultPattern, alwaysWriteExceptions, false, noConsoleNoAnsi, config);
+    }
+
+    private ScriptPatternSelector(final AbstractScript script, final PatternMatch[] properties, final String defaultPattern,
                                  final boolean alwaysWriteExceptions, final boolean disablAnsi,
                                  final boolean noConsoleNoAnsi, final Configuration config) {
         this.script = script;
@@ -103,6 +113,16 @@ public class ScriptPatternSelector implements PatternSelector {
                                                        @PluginElement("PatternMatch") final PatternMatch[] properties,
                                                        @PluginAttribute("defaultPattern") String defaultPattern,
                                                        @PluginAttribute(value = "alwaysWriteExceptions", defaultBoolean = true) final boolean alwaysWriteExceptions,
+                                                       @PluginAttribute(value = "noConsoleNoAnsi", defaultBoolean = false) final boolean noConsoleNoAnsi,
+                                                       @PluginConfiguration final Configuration config) {
+        return createSelector(script, properties, defaultPattern, alwaysWriteExceptions, false, noConsoleNoAnsi, config);
+    }
+
+    @PluginFactory
+    public static ScriptPatternSelector createSelector(@PluginElement("Script") final AbstractScript script,
+                                                       @PluginElement("PatternMatch") final PatternMatch[] properties,
+                                                       @PluginAttribute("defaultPattern") String defaultPattern,
+                                                       @PluginAttribute(value = "alwaysWriteExceptions", defaultBoolean = true) final boolean alwaysWriteExceptions,
                                                        @PluginAttribute(value = "disableAnsi", defaultBoolean = false) final boolean disableAnsi,
                                                        @PluginAttribute(value = "noConsoleNoAnsi", defaultBoolean = false) final boolean noConsoleNoAnsi,
                                                        @PluginConfiguration final Configuration config) {

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6630eae3/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java
index 3d14830..6881550 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java
@@ -164,6 +164,11 @@ public final class PatternParser {
     }
 
     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, final boolean alwaysWriteExceptions,
            boolean disableAnsi, final boolean noConsoleNoAnsi) {
         final List<PatternFormatter> list = new ArrayList<>();
         final List<PatternConverter> converters = new ArrayList<>();
@@ -305,6 +310,26 @@ public final class PatternParser {
      *            list to receive pattern converters.
      * @param formattingInfos
      *            list to receive field specifiers corresponding to pattern converters.
+     * @param noConsoleNoAnsi
+     *            do not do not output ANSI escape codes if {@link System#console()}
+     * @param convertBackslashes if {@code true}, backslash characters are treated as escape characters and character
+     *            sequences like "\" followed by "t" (backslash+t) are converted to special characters like '\t' (tab).
+     */
+    public void parse(final String pattern, final List<PatternConverter> patternConverters,
+                      final List<FormattingInfo> formattingInfos, final boolean noConsoleNoAnsi,
+                      final boolean convertBackslashes) {
+        parse(pattern, patternConverters, formattingInfos, false, noConsoleNoAnsi, convertBackslashes);
+    }
+
+    /**
+     * Parse a format specifier.
+     *
+     * @param pattern
+     *            pattern to parse.
+     * @param patternConverters
+     *            list to receive pattern converters.
+     * @param formattingInfos
+     *            list to receive field specifiers corresponding to pattern converters.
      * @param disableAnsi
      *            do not output ANSI escape codes
      * @param noConsoleNoAnsi

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6630eae3/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/PatternLayoutBenchmark.java
----------------------------------------------------------------------
diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/PatternLayoutBenchmark.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/PatternLayoutBenchmark.java
index c7b5948..8d39732 100644
--- a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/PatternLayoutBenchmark.java
+++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/PatternLayoutBenchmark.java
@@ -60,18 +60,18 @@ public class PatternLayoutBenchmark {
     private static final String DEFAULT_ENCODING = CHARSET_DEFAULT.name();
     private static final String STRING_SHIFT_JIS = "SHIFT_JIS";
     private static final Charset CHARSET_SHIFT_JIS = Charset.forName(STRING_SHIFT_JIS);
-    private final PatternLayout PATTERN_M = PatternLayout.createLayout("%m%n", null, null, null, CHARSET_DEFAULT, false, true, true, null, null);
-    private final PatternLayout PATTERN_SPACE = PatternLayout.createLayout(" ", null, null, null, CHARSET_DEFAULT, false, true, true, null, null);
-    private final PatternLayout PATTERN_M_C = PatternLayout.createLayout("%c %m%n", null, null, null, CHARSET_DEFAULT, false, true, true, null, null);
-    private final PatternLayout PATTERN_M_C_D = PatternLayout.createLayout("%d %c %m%n", null, null, null, CHARSET_DEFAULT, false, true, true, null, null);
-    private final PatternLayout PATTERN_M_D = PatternLayout.createLayout("%d %m%n", null, null, null, CHARSET_DEFAULT, false, true, true, null, null);
-    private final PatternLayout PATTERN_C = PatternLayout.createLayout("%c%n", null, null, null, CHARSET_DEFAULT, false, true, true, null, null);
-    private final PatternLayout PATTERN_D = PatternLayout.createLayout("%d%n", null, null, null, CHARSET_DEFAULT, false, true, true, null, null);
-    private final PatternLayout PATTERN_M_D_NOSPACE = PatternLayout.createLayout("%d%m%n", null, null, null, CHARSET_DEFAULT, false, true, true, null, null);
-    private final PatternLayout PATTERN_M_C_NOSPACE = PatternLayout.createLayout("%c%m%n", null, null, null, CHARSET_DEFAULT, false, true, true, null, null);
-    private final PatternLayout PATTERN_M_EX = PatternLayout.createLayout("%m %ex%n", null, null, null, CHARSET_DEFAULT, false, true, true, null, null);
-    private final PatternLayout PATTERN_M_D_EX = PatternLayout.createLayout("%d %m%ex%n", null, null, null, CHARSET_DEFAULT, false, true, true, null, null);
-    private final PatternLayout PATTERN_M_C_D_EX = PatternLayout.createLayout("%d %c %m%ex%n", null, null, null, CHARSET_DEFAULT, false, true, true, null, null);
+    private final PatternLayout PATTERN_M = PatternLayout.createLayout("%m%n", null, null, null, CHARSET_DEFAULT, false, true, null, null);
+    private final PatternLayout PATTERN_SPACE = PatternLayout.createLayout(" ", null, null, null, CHARSET_DEFAULT, false, true, null, null);
+    private final PatternLayout PATTERN_M_C = PatternLayout.createLayout("%c %m%n", null, null, null, CHARSET_DEFAULT, false, true, null, null);
+    private final PatternLayout PATTERN_M_C_D = PatternLayout.createLayout("%d %c %m%n", null, null, null, CHARSET_DEFAULT, false, true, null, null);
+    private final PatternLayout PATTERN_M_D = PatternLayout.createLayout("%d %m%n", null, null, null, CHARSET_DEFAULT, false, true, null, null);
+    private final PatternLayout PATTERN_C = PatternLayout.createLayout("%c%n", null, null, null, CHARSET_DEFAULT, false, true, null, null);
+    private final PatternLayout PATTERN_D = PatternLayout.createLayout("%d%n", null, null, null, CHARSET_DEFAULT, false, true, null, null);
+    private final PatternLayout PATTERN_M_D_NOSPACE = PatternLayout.createLayout("%d%m%n", null, null, null, CHARSET_DEFAULT, false, true, null, null);
+    private final PatternLayout PATTERN_M_C_NOSPACE = PatternLayout.createLayout("%c%m%n", null, null, null, CHARSET_DEFAULT, false, true, null, null);
+    private final PatternLayout PATTERN_M_EX = PatternLayout.createLayout("%m %ex%n", null, null, null, CHARSET_DEFAULT, false, true, null, null);
+    private final PatternLayout PATTERN_M_D_EX = PatternLayout.createLayout("%d %m%ex%n", null, null, null, CHARSET_DEFAULT, false, true, null, null);
+    private final PatternLayout PATTERN_M_C_D_EX = PatternLayout.createLayout("%d %c %m%ex%n", null, null, null, CHARSET_DEFAULT, false, true, null, null);
 
     private static LogEvent createLogEvent() {
         final Marker marker = null;

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6630eae3/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/PatternLayoutComparisonBenchmark.java
----------------------------------------------------------------------
diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/PatternLayoutComparisonBenchmark.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/PatternLayoutComparisonBenchmark.java
index ab9cd97..88d670a 100644
--- a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/PatternLayoutComparisonBenchmark.java
+++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/PatternLayoutComparisonBenchmark.java
@@ -22,6 +22,11 @@ import java.io.IOException;
 import java.nio.charset.Charset;
 import java.util.Map;
 
+import ch.qos.logback.classic.Logger;
+import ch.qos.logback.classic.LoggerContext;
+import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.classic.spi.LoggingEvent;
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.Marker;
 import org.apache.logging.log4j.ThreadContext.ContextStack;
@@ -35,12 +40,6 @@ import org.openjdk.jmh.annotations.Scope;
 import org.openjdk.jmh.annotations.Setup;
 import org.openjdk.jmh.annotations.State;
 
-import ch.qos.logback.classic.Logger;
-import ch.qos.logback.classic.LoggerContext;
-import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
-import ch.qos.logback.classic.spi.ILoggingEvent;
-import ch.qos.logback.classic.spi.LoggingEvent;
-
 /**
  * Compares Log4j2 with Logback PatternLayout performance.
  */
@@ -60,7 +59,7 @@ public class PatternLayoutComparisonBenchmark {
     private static final Charset CHARSET_DEFAULT = Charset.defaultCharset();
     private static final String LOG4JPATTERN = "%d %5p [%t] %c{1} %X{transactionId} - %m%n";
     private final PatternLayout LOG4J2_PATTERN_LAYOUT = PatternLayout.createLayout(LOG4JPATTERN, null,
-            null, null, CHARSET_DEFAULT, false, true, true, null, null);
+            null, null, CHARSET_DEFAULT, false, true, null, null);
 
     private static LogEvent createLog4j2Event() {
         final Marker marker = null;

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6630eae3/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/TextEncoderHelperBenchmark.java
----------------------------------------------------------------------
diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/TextEncoderHelperBenchmark.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/TextEncoderHelperBenchmark.java
index d619399..bf67c9d 100644
--- a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/TextEncoderHelperBenchmark.java
+++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/TextEncoderHelperBenchmark.java
@@ -61,7 +61,7 @@ public class TextEncoderHelperBenchmark {
 
     final static LogEvent EVENT = createLogEvent();
     private static final Charset CHARSET_DEFAULT = Charset.defaultCharset();
-    private final PatternLayout PATTERN_M_C_D = PatternLayout.createLayout("%d %c %m%n", null, null, null, CHARSET_DEFAULT, false, true, true, null, null);
+    private final PatternLayout PATTERN_M_C_D = PatternLayout.createLayout("%d %c %m%n", null, null, null, CHARSET_DEFAULT, false, true, null, null);
     private final Destination destination = new Destination();
 
     class Destination implements ByteBufferDestination {


[6/6] logging-log4j2 git commit: LOG4J2-1685 Revert irrelevant changes

Posted by mi...@apache.org.
LOG4J2-1685 Revert irrelevant changes


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/028ae4b4
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/028ae4b4
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/028ae4b4

Branch: refs/heads/LOG4J2-1685
Commit: 028ae4b457af219447dc97b2ac4cf7f64f9d0724
Parents: 6630eae
Author: Mikael St�ldal <mi...@magine.com>
Authored: Fri Nov 11 14:23:25 2016 +0100
Committer: Mikael St�ldal <mi...@magine.com>
Committed: Fri Nov 11 14:23:25 2016 +0100

----------------------------------------------------------------------
 .../log4j/perf/jmh/PatternLayoutComparisonBenchmark.java | 11 ++++++-----
 .../log4j/perf/jmh/ThreadLocalVsPoolBenchmark.java       |  2 +-
 2 files changed, 7 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/028ae4b4/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/PatternLayoutComparisonBenchmark.java
----------------------------------------------------------------------
diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/PatternLayoutComparisonBenchmark.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/PatternLayoutComparisonBenchmark.java
index 88d670a..0bcf3da 100644
--- a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/PatternLayoutComparisonBenchmark.java
+++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/PatternLayoutComparisonBenchmark.java
@@ -22,11 +22,6 @@ import java.io.IOException;
 import java.nio.charset.Charset;
 import java.util.Map;
 
-import ch.qos.logback.classic.Logger;
-import ch.qos.logback.classic.LoggerContext;
-import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
-import ch.qos.logback.classic.spi.ILoggingEvent;
-import ch.qos.logback.classic.spi.LoggingEvent;
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.Marker;
 import org.apache.logging.log4j.ThreadContext.ContextStack;
@@ -40,6 +35,12 @@ import org.openjdk.jmh.annotations.Scope;
 import org.openjdk.jmh.annotations.Setup;
 import org.openjdk.jmh.annotations.State;
 
+import ch.qos.logback.classic.Logger;
+import ch.qos.logback.classic.LoggerContext;
+import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.classic.spi.LoggingEvent;
+
 /**
  * Compares Log4j2 with Logback PatternLayout performance.
  */

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/028ae4b4/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/ThreadLocalVsPoolBenchmark.java
----------------------------------------------------------------------
diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/ThreadLocalVsPoolBenchmark.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/ThreadLocalVsPoolBenchmark.java
index 4aeeb90..831c4f8 100644
--- a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/ThreadLocalVsPoolBenchmark.java
+++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/ThreadLocalVsPoolBenchmark.java
@@ -80,7 +80,7 @@ public class ThreadLocalVsPoolBenchmark {
     private static PatternFormatter[] createFormatters() {
         final Configuration config = new DefaultConfiguration();
         final PatternParser parser = new PatternParser(config, "Converter", LogEventPatternConverter.class);
-        final List<PatternFormatter> result = parser.parse(LOG4JPATTERN, false, false, true);
+        final List<PatternFormatter> result = parser.parse(LOG4JPATTERN, false, true);
         return result.toArray(new PatternFormatter[result.size()]);
     }
 


[2/6] logging-log4j2 git commit: LOG4J2-1685 Update changelog

Posted by mi...@apache.org.
LOG4J2-1685 Update changelog


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/b35b1359
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/b35b1359
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/b35b1359

Branch: refs/heads/LOG4J2-1685
Commit: b35b1359b8195b8e56046f3388ef79dd7e01e209
Parents: 42f8f08
Author: Mikael St�ldal <mi...@magine.com>
Authored: Fri Nov 11 13:20:08 2016 +0100
Committer: Mikael St�ldal <mi...@magine.com>
Committed: Fri Nov 11 13:20:08 2016 +0100

----------------------------------------------------------------------
 src/changes/changes.xml | 3 +++
 1 file changed, 3 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/b35b1359/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index ec8d7f1..bacf8f4 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -24,6 +24,9 @@
   </properties>
   <body>
     <release version="2.8" date="2016-MM-DD" description="GA Release 2.8">
+      <action issue="LOG4J2-1685" dev="mikes" type="fix" due-to="Raman Gupta">
+        Option 'disableAnsi' in PatternLayout to unconditionally disable ANSI escape codes.
+      </action>
       <action issue="LOG4J2-1679" dev="rpopma" type="fix">
         (GC) Avoid allocating temporary objects in StructuredDataFilter.
       </action>