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.HashMap;
20 import java.util.Locale;
21 import java.util.Map;
22
23 import org.apache.logging.log4j.Level;
24 import org.apache.logging.log4j.core.LogEvent;
25 import org.apache.logging.log4j.core.config.plugins.Plugin;
26
27
28
29
30 @Plugin(name = "LevelPatternConverter", category = "Converter")
31 @ConverterKeys({ "p", "level" })
32 public final class LevelPatternConverter extends LogEventPatternConverter {
33 private static final String OPTION_LENGTH = "length";
34 private static final String OPTION_LOWER = "lowerCase";
35
36
37
38
39 private static final LevelPatternConverter INSTANCE = new LevelPatternConverter(null);
40
41 private final Map<Level, String> levelMap;
42
43
44
45
46 private LevelPatternConverter(final Map<Level, String> map) {
47 super("Level", "level");
48 this.levelMap = map;
49 }
50
51
52
53
54
55
56
57
58
59 public static LevelPatternConverter newInstance(final String[] options) {
60 if (options == null || options.length == 0) {
61 return INSTANCE;
62 }
63 final Map<Level, String> levelMap = new HashMap<Level, String>();
64 int length = Integer.MAX_VALUE;
65 boolean lowerCase = false;
66 final String[] definitions = options[0].split(",");
67 for (final String def : definitions) {
68 final String[] pair = def.split("=");
69 if (pair == null || pair.length != 2) {
70 LOGGER.error("Invalid option {}", def);
71 continue;
72 }
73 final String key = pair[0].trim();
74 final String value = pair[1].trim();
75 if (OPTION_LENGTH.equalsIgnoreCase(key)) {
76 length = Integer.parseInt(value);
77 } else if (OPTION_LOWER.equalsIgnoreCase(key)) {
78 lowerCase = Boolean.parseBoolean(value);
79 } else {
80 final Level level = Level.toLevel(key, null);
81 if (level == null) {
82 LOGGER.error("Invalid Level {}", key);
83 } else {
84 levelMap.put(level, value);
85 }
86 }
87 }
88 if (levelMap.size() == 0 && length == Integer.MAX_VALUE && !lowerCase) {
89 return INSTANCE;
90 }
91 for (final Level level : Level.values()) {
92 if (!levelMap.containsKey(level)) {
93 final String left = left(level, length);
94 levelMap.put(level, lowerCase ? left.toLowerCase(Locale.US) : left);
95 }
96 }
97 return new LevelPatternConverter(levelMap);
98 }
99
100
101
102
103
104
105
106
107
108
109
110 private static String left(final Level level, int length) {
111 final String string = level.toString();
112 if (length >= string.length()) {
113 return string;
114 }
115 return string.substring(0, length);
116 }
117
118
119
120
121 @Override
122 public void format(final LogEvent event, final StringBuilder output) {
123 output.append(levelMap == null ? event.getLevel().toString() : levelMap.get(event.getLevel()));
124 }
125
126
127
128
129 @Override
130 public String getStyleClass(final Object e) {
131 if (e instanceof LogEvent) {
132 return "level " + ((LogEvent) e).getLevel().name().toLowerCase(Locale.ENGLISH);
133 }
134
135 return "level";
136 }
137 }