Behrang Saeedzadeh
Behrang Saeedzadeh

Reputation: 47913

What's the JSON equivalent to this Log4J2 configuration?

This is an XML configuration example from Log4J2's site:

I have tried a few different JSON variations and all of them fail with NullPointException or something similar.

For example, the following configuration fails:

      "PatternLayout": {
        "MarkerPatternSelector": {
          "defaultPattern": [%-5level] %c{1.} %msg%n",
          "PatternMatch": {
            "key": "FLOW",
            "pattern": "[%-5level] %c{1.} ====== %C{1.}.%M:%L %msg ======%n"
          }
        }
      }

What's the correct JSON equivalent for this XML configuration?

Upvotes: 0

Views: 238

Answers (1)

Behrang Saeedzadeh
Behrang Saeedzadeh

Reputation: 47913

The problem was due to the version of the Log4J2 I was using (2.3). 2.6.2 supports this feature. To be more precise, here's the factory method in 2.6.2:

@PluginFactory
public static PatternLayout createLayout(
        @PluginAttribute(value = "pattern", defaultString = DEFAULT_CONVERSION_PATTERN) final String pattern,
        @PluginElement("PatternSelector") final PatternSelector patternSelector,
        @PluginConfiguration final Configuration config,
        @PluginElement("Replace") final RegexReplacement replace,
        // 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 = "noConsoleNoAnsi", defaultBoolean = false) final boolean noConsoleNoAnsi,
        @PluginAttribute("header") final String headerPattern,
        @PluginAttribute("footer") final String footerPattern) {
    return newBuilder()
        .withPattern(pattern)
        .withPatternSelector(patternSelector)
        .withConfiguration(config)
        .withRegexReplacement(replace)
        .withCharset(charset)
        .withAlwaysWriteExceptions(alwaysWriteExceptions)
        .withNoConsoleNoAnsi(noConsoleNoAnsi)
        .withHeader(headerPattern)
        .withFooter(footerPattern)
        .build();
}

And here is how it looked like in 2.3:

@PluginFactory
public static PatternLayout createLayout(
        @PluginAttribute(value = "pattern", defaultString = DEFAULT_CONVERSION_PATTERN) final String pattern,
        @PluginConfiguration final Configuration config,
        @PluginElement("Replace") final RegexReplacement replace,
        @PluginAttribute(value = "charset", defaultString = "UTF-8") final Charset charset,
        @PluginAttribute(value = "alwaysWriteExceptions", defaultBoolean = true) final boolean alwaysWriteExceptions,
        @PluginAttribute(value = "noConsoleNoAnsi", defaultBoolean = false) final boolean noConsoleNoAnsi,
        @PluginAttribute("header") final String header,
        @PluginAttribute("footer") final String footer) {
    return newBuilder()
        .withPattern(pattern)
        .withConfiguration(config)
        .withRegexReplacement(replace)
        .withCharset(charset)
        .withAlwaysWriteExceptions(alwaysWriteExceptions)
        .withNoConsoleNoAnsi(noConsoleNoAnsi)
        .withHeader(header)
        .withFooter(footer)
        .build();
}

The API docs site's URL (https://logging.apache.org/log4j/2.x) put me under the impression that all 2.x versions are compatible.

Upvotes: 1

Related Questions