Details
-
Improvement
-
Status: Closed
-
Major
-
Resolution: Fixed
-
2.4.1
-
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