1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.logging.log4j.core.pattern;
18
19 import java.util.Arrays;
20 import java.util.List;
21
22 import org.apache.logging.log4j.core.LogEvent;
23 import org.apache.logging.log4j.core.config.Configuration;
24 import org.apache.logging.log4j.core.config.plugins.Plugin;
25 import org.apache.logging.log4j.core.layout.PatternLayout;
26 import org.apache.logging.log4j.core.util.Patterns;
27 import org.apache.logging.log4j.util.PerformanceSensitive;
28
29
30
31
32
33
34
35
36
37 @Plugin(name = "style", category = PatternConverter.CATEGORY)
38 @ConverterKeys({ "style" })
39 @PerformanceSensitive("allocation")
40 public final class StyleConverter extends LogEventPatternConverter implements AnsiConverter {
41
42 private final List<PatternFormatter> patternFormatters;
43
44 private final boolean noAnsi;
45
46 private final String style;
47
48 private final String defaultStyle;
49
50
51
52
53
54
55
56
57
58
59
60 private StyleConverter(final List<PatternFormatter> patternFormatters, final String style, final boolean noAnsi) {
61 super("style", "style");
62 this.patternFormatters = patternFormatters;
63 this.style = style;
64 this.defaultStyle = AnsiEscape.getDefaultStyle();
65 this.noAnsi = noAnsi;
66 }
67
68
69
70
71
72
73
74
75
76
77
78 public static StyleConverter newInstance(final Configuration config, final String[] options) {
79 if (options == null) {
80 return null;
81 }
82 if (options.length < 2) {
83 LOGGER.error("Incorrect number of options on style. Expected at least 1, received " + options.length);
84 return null;
85 }
86 if (options[0] == null) {
87 LOGGER.error("No pattern supplied for style converter");
88 return null;
89 }
90 if (options[1] == null) {
91 LOGGER.error("No style attributes supplied for style converter");
92 return null;
93 }
94 final PatternParser parser = PatternLayout.createPatternParser(config);
95 final List<PatternFormatter> formatters = parser.parse(options[0]);
96 final String style = AnsiEscape.createSequence(options[1].split(Patterns.COMMA_SEPARATOR));
97 final boolean disableAnsi = Arrays.toString(options).contains(PatternParser.DISABLE_ANSI + "=true");
98 final boolean noConsoleNoAnsi = Arrays.toString(options).contains(PatternParser.NO_CONSOLE_NO_ANSI + "=true");
99 final boolean hideAnsi = disableAnsi || (noConsoleNoAnsi && System.console() == null);
100 return new StyleConverter(formatters, style, hideAnsi);
101 }
102
103
104
105
106 @Override
107 public void format(final LogEvent event, final StringBuilder toAppendTo) {
108 int start = 0;
109 int end = 0;
110 if (!noAnsi) {
111 start = toAppendTo.length();
112 toAppendTo.append(style);
113 end = toAppendTo.length();
114 }
115
116
117 for (int i = 0, size = patternFormatters.size(); i < size; i++) {
118 patternFormatters.get(i).format(event, toAppendTo);
119 }
120
121
122 if (!noAnsi) {
123 if (toAppendTo.length() == end) {
124 toAppendTo.setLength(start);
125 } else {
126 toAppendTo.append(defaultStyle);
127 }
128 }
129 }
130
131 @Override
132 public boolean handlesThrowable() {
133 for (final PatternFormatter formatter : patternFormatters) {
134 if (formatter.handlesThrowable()) {
135 return true;
136 }
137 }
138 return false;
139 }
140
141
142
143
144
145
146 @Override
147 public String toString() {
148 final StringBuilder sb = new StringBuilder();
149 sb.append(super.toString());
150 sb.append("[style=");
151 sb.append(style);
152 sb.append(", defaultStyle=");
153 sb.append(defaultStyle);
154 sb.append(", patternFormatters=");
155 sb.append(patternFormatters);
156 sb.append(", noAnsi=");
157 sb.append(noAnsi);
158 sb.append(']');
159 return sb.toString();
160 }
161
162 }