Uploaded image for project: 'Log4j 2'
  1. Log4j 2
  2. LOG4J2-1217

Layout option to limit length of text

    XMLWordPrintableJSON

Details

    • Improvement
    • Status: Closed
    • Major
    • Resolution: Fixed
    • 2.4.1
    • 2.6
    • Pattern Converters
    • None
    • Patch

    Description

      PatternLayout does not provide the ability to limit the length of the text without space padding (with the numbers directly after the %).

      The following Converter provides this possibility:
      %maxLen{pattern}{max. length}, e.g. %maxLen{%m}{90}
      use %maxLen or %maxLength

      MaxLengthConverter.java
      package de.ittw.log4j;
      
      import java.util.List;
      
      import org.apache.logging.log4j.core.LogEvent;
      import org.apache.logging.log4j.core.appender.AbstractAppender;
      import org.apache.logging.log4j.core.config.Configuration;
      import org.apache.logging.log4j.core.config.plugins.Plugin;
      import org.apache.logging.log4j.core.layout.PatternLayout;
      import org.apache.logging.log4j.core.pattern.ConverterKeys;
      import org.apache.logging.log4j.core.pattern.LogEventPatternConverter;
      import org.apache.logging.log4j.core.pattern.PatternConverter;
      import org.apache.logging.log4j.core.pattern.PatternFormatter;
      import org.apache.logging.log4j.core.pattern.PatternParser;
      
      /**
       * Max length pattern converter. Limit contained text to a maximum length.
       * On invalid length the default value 100 is used (and an error message is logged).
       * If max length is greater than 20, an abbreviated text will get ellipsis ("...") appended.
       * Example usage (for email subject):
       *    "%maxLen{[AppName, ${hostName}, ${web:contextPath}] %p: %c{1} - %m%notEmpty{ =>%ex{short}}}{160}"
       *
       * @author Thies Wellpott
       */
      @Plugin(name = "maxLength", category = PatternConverter.CATEGORY)
      @ConverterKeys({ "maxLength", "maxLen" })
      public final class MaxLengthConverter extends LogEventPatternConverter
      {
      
          /**
           * Gets an instance of the class.
           *
           * @param config
           *            The current Configuration.
           * @param options
           *            pattern options, an array of two elements: pattern, max length (defaults to 100 on invalid value).
           * @return instance of class.
           */
          public static MaxLengthConverter newInstance(final Configuration config, final String[] options) {
              if (options.length != 2) {
                  LOGGER.error("Incorrect number of options on maxLength: expected 2 received {}: {}", options.length, options);
                  return null;
              }
              if (options[0] == null) {
                  LOGGER.error("No pattern supplied on maxLength");
                  return null;
              }
              if (options[1] == null) {
                  LOGGER.error("No length supplied on maxLength");
                  return null;
              }
              final PatternParser parser = PatternLayout.createPatternParser(config);
              final List<PatternFormatter> formatters = parser.parse(options[0]);
              return new MaxLengthConverter(formatters, AbstractAppender.parseInt(options[1], 100));
          }
      
      
          private final List<PatternFormatter> formatters;
          private final int maxLength;
      
          /**
           * Construct the converter.
           *
           * @param formatters
           *            The PatternFormatters to generate the text to manipulate.
           * @param maxLength
           *            The max. length of the resultung string. Ellipses ("...") is appended on shorted string, if greater than 20.
           */
          private MaxLengthConverter(final List<PatternFormatter> formatters, final int maxLength) {
              super("MaxLength", "maxLength");
              this.maxLength = maxLength;
              this.formatters = formatters;
              LOGGER.trace("new MaxLengthConverter with {}", maxLength);
          }
      
      
          @Override
          public void format(final LogEvent event, final StringBuilder toAppendTo) {
              final StringBuilder buf = new StringBuilder();
              for (final PatternFormatter formatter : formatters) {
                  formatter.format(event, buf);
                  if (buf.length() > maxLength) {        // stop early
                      break;
                  }
              }
              if (buf.length() > maxLength) {
                  buf.setLength(maxLength);
                  if (maxLength > 20) {        // only append ellipses if length is not very short
                      buf.append("...");
                  }
              }
              toAppendTo.append(buf);
          }
      
      }
      

      You may include this in log4j2

      Attachments

        Activity

          People

            mattsicker Matt Sicker
            twapache@online.de Thies Wellpott
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: