1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.logging.log4j.core.lookup;
18
19 import java.util.HashMap;
20 import java.util.Map;
21
22 import org.apache.logging.log4j.Logger;
23 import org.apache.logging.log4j.core.LogEvent;
24 import org.apache.logging.log4j.core.config.plugins.util.PluginManager;
25 import org.apache.logging.log4j.core.config.plugins.util.PluginType;
26 import org.apache.logging.log4j.core.util.Loader;
27 import org.apache.logging.log4j.status.StatusLogger;
28
29
30
31
32 public class Interpolator implements StrLookup {
33
34 private static final Logger LOGGER = StatusLogger.getLogger();
35
36
37 private static final char PREFIX_SEPARATOR = ':';
38
39 private final Map<String, StrLookup> lookups = new HashMap<String, StrLookup>();
40
41 private final StrLookup defaultLookup;
42
43 public Interpolator(final StrLookup defaultLookup) {
44 this.defaultLookup = defaultLookup == null ? new MapLookup(new HashMap<String, String>()) : defaultLookup;
45 final PluginManager manager = new PluginManager("Lookup");
46 manager.collectPlugins();
47 final Map<String, PluginType<?>> plugins = manager.getPlugins();
48
49 for (final Map.Entry<String, PluginType<?>> entry : plugins.entrySet()) {
50 @SuppressWarnings("unchecked")
51 final Class<? extends StrLookup> clazz = (Class<? extends StrLookup>) entry.getValue().getPluginClass();
52 try {
53 lookups.put(entry.getKey(), clazz.getConstructor().newInstance());
54 } catch (final Exception ex) {
55 LOGGER.error("Unable to create Lookup for {}", entry.getKey(), ex);
56 }
57 }
58 }
59
60
61
62
63 public Interpolator() {
64 this((Map<String, String>) null);
65 }
66
67
68
69
70 public Interpolator(final Map<String, String> properties) {
71 this.defaultLookup = new MapLookup(properties == null ? new HashMap<String, String>() : properties);
72
73 lookups.put("sys", new SystemPropertiesLookup());
74 lookups.put("env", new EnvironmentLookup());
75 lookups.put("jndi", new JndiLookup());
76 lookups.put("date", new DateLookup());
77 lookups.put("ctx", new ContextMapLookup());
78 if (Loader.isClassAvailable("javax.servlet.ServletContext")) {
79 try {
80 lookups.put("web",
81 Loader.newCheckedInstanceOf("org.apache.logging.log4j.web.WebLookup", StrLookup.class));
82 } catch (final Exception ignored) {
83 LOGGER.info("Log4j appears to be running in a Servlet environment, but there's no log4j-web module " +
84 "available. If you want better web container support, please add the log4j-web JAR to your " +
85 "web archive or server lib directory.");
86 }
87 } else {
88 LOGGER.debug("Not in a ServletContext environment, thus not loading WebLookup plugin.");
89 }
90 }
91
92
93
94
95
96
97
98
99
100
101
102
103
104 @Override
105 public String lookup(final String var) {
106 return lookup(null, var);
107 }
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122 @Override
123 public String lookup(final LogEvent event, String var) {
124 if (var == null) {
125 return null;
126 }
127
128 final int prefixPos = var.indexOf(PREFIX_SEPARATOR);
129 if (prefixPos >= 0) {
130 final String prefix = var.substring(0, prefixPos);
131 final String name = var.substring(prefixPos + 1);
132 final StrLookup lookup = lookups.get(prefix);
133 String value = null;
134 if (lookup != null) {
135 value = event == null ? lookup.lookup(name) : lookup.lookup(event, name);
136 }
137
138 if (value != null) {
139 return value;
140 }
141 var = var.substring(prefixPos + 1);
142 }
143 if (defaultLookup != null) {
144 return event == null ? defaultLookup.lookup(var) : defaultLookup.lookup(event, var);
145 }
146 return null;
147 }
148
149 @Override
150 public String toString() {
151 final StringBuilder sb = new StringBuilder();
152 for (final String name : lookups.keySet()) {
153 if (sb.length() == 0) {
154 sb.append('{');
155 } else {
156 sb.append(", ");
157 }
158
159 sb.append(name);
160 }
161 if (sb.length() > 0) {
162 sb.append('}');
163 }
164 return sb.toString();
165 }
166 }