1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.logging.log4j.core;
18
19 import java.util.ArrayList;
20 import java.util.Iterator;
21 import java.util.List;
22 import java.util.Map;
23
24 import org.apache.logging.log4j.Level;
25 import org.apache.logging.log4j.Marker;
26 import org.apache.logging.log4j.core.config.Configuration;
27 import org.apache.logging.log4j.core.config.LoggerConfig;
28 import org.apache.logging.log4j.core.filter.CompositeFilter;
29 import org.apache.logging.log4j.message.Message;
30 import org.apache.logging.log4j.message.MessageFactory;
31 import org.apache.logging.log4j.message.SimpleMessage;
32 import org.apache.logging.log4j.spi.AbstractLogger;
33
34
35
36
37
38
39
40 public class Logger extends AbstractLogger {
41
42
43
44
45 protected volatile PrivateConfig config;
46
47 private final LoggerContext context;
48
49
50
51
52
53
54
55 protected Logger(final LoggerContext context, final String name, final MessageFactory messageFactory) {
56 super(name, messageFactory);
57 this.context = context;
58 config = new PrivateConfig(context.getConfiguration(), this);
59 }
60
61
62
63
64
65 public Logger getParent() {
66 final LoggerConfig lc = config.loggerConfig.getParent();
67 if (lc == null) {
68 return null;
69 }
70 if (context.hasLogger(lc.getName())) {
71 return context.getLogger(getName(), getMessageFactory());
72 }
73 return new Logger(context, getName(), this.getMessageFactory());
74 }
75
76
77
78
79
80 public LoggerContext getContext() {
81 return context;
82 }
83
84
85
86
87
88 public synchronized void setLevel(final Level level) {
89 if (level != null) {
90 config = new PrivateConfig(config, level);
91 }
92 }
93
94
95
96
97
98 public Level getLevel() {
99 return config.level;
100 }
101
102 @Override
103 public void log(final Marker marker, final String fqcn, final Level level, Message data, final Throwable t) {
104 if (data == null) {
105 data = new SimpleMessage("");
106 }
107 config.config.getConfigurationMonitor().checkConfiguration();
108 config.loggerConfig.log(getName(), marker, fqcn, level, data, t);
109 }
110
111 @Override
112 public boolean isEnabled(final Level level, final Marker marker, final String msg) {
113 return config.filter(level, marker, msg);
114 }
115
116 @Override
117 public boolean isEnabled(final Level level, final Marker marker, final String msg, final Throwable t) {
118 return config.filter(level, marker, msg, t);
119 }
120
121 @Override
122 public boolean isEnabled(final Level level, final Marker marker, final String msg, final Object... p1) {
123 return config.filter(level, marker, msg, p1);
124 }
125
126 @Override
127 public boolean isEnabled(final Level level, final Marker marker, final Object msg, final Throwable t) {
128 return config.filter(level, marker, msg, t);
129 }
130
131 @Override
132 public boolean isEnabled(final Level level, final Marker marker, final Message msg, final Throwable t) {
133 return config.filter(level, marker, msg, t);
134 }
135
136
137
138
139
140 public void addAppender(final Appender<?> appender) {
141 config.config.addLoggerAppender(this, appender);
142 }
143
144
145
146
147
148 public void removeAppender(final Appender<?> appender) {
149 config.loggerConfig.removeAppender(appender.getName());
150 }
151
152
153
154
155
156 public Map<String, Appender<?>> getAppenders() {
157 return config.loggerConfig.getAppenders();
158 }
159
160
161
162
163
164 public Iterator<Filter> getFilters() {
165 final Filter filter = config.loggerConfig.getFilter();
166 if (filter == null) {
167 return new ArrayList<Filter>().iterator();
168 } else if (filter instanceof CompositeFilter) {
169 return ((CompositeFilter) filter).iterator();
170 } else {
171 final List<Filter> filters = new ArrayList<Filter>();
172 filters.add(filter);
173 return filters.iterator();
174 }
175 }
176
177
178
179
180
181 public int filterCount() {
182 final Filter filter = config.loggerConfig.getFilter();
183 if (filter == null) {
184 return 0;
185 } else if (filter instanceof CompositeFilter) {
186 return ((CompositeFilter) filter).size();
187 }
188 return 1;
189 }
190
191
192
193
194
195 public void addFilter(final Filter filter) {
196 config.config.addLoggerFilter(this, filter);
197 }
198
199
200
201
202
203
204 public boolean isAdditive() {
205 return config.loggerConfig.isAdditive();
206 }
207
208
209
210
211
212
213 public void setAdditive(final boolean additive) {
214 config.config.setLoggerAdditive(this, additive);
215 }
216
217
218
219
220
221
222
223
224
225
226
227
228
229 void updateConfiguration(final Configuration config) {
230 this.config = new PrivateConfig(config, this);
231 }
232
233
234
235
236 protected class PrivateConfig {
237
238 public final LoggerConfig loggerConfig;
239 public final Configuration config;
240 private final Level level;
241 private final int intLevel;
242 private final Logger logger;
243
244 public PrivateConfig(final Configuration config, final Logger logger) {
245 this.config = config;
246 this.loggerConfig = config.getLoggerConfig(getName());
247 this.level = this.loggerConfig.getLevel();
248 this.intLevel = this.level.intLevel();
249 this.logger = logger;
250 }
251
252 public PrivateConfig(final PrivateConfig pc, final Level level) {
253 this.config = pc.config;
254 this.loggerConfig = pc.loggerConfig;
255 this.level = level;
256 this.intLevel = this.level.intLevel();
257 this.logger = pc.logger;
258 }
259
260 public PrivateConfig(final PrivateConfig pc, final LoggerConfig lc) {
261 this.config = pc.config;
262 this.loggerConfig = lc;
263 this.level = lc.getLevel();
264 this.intLevel = this.level.intLevel();
265 this.logger = pc.logger;
266 }
267
268
269 public void logEvent(LogEvent event) {
270 config.getConfigurationMonitor().checkConfiguration();
271 loggerConfig.log(event);
272 }
273
274 boolean filter(final Level level, final Marker marker, final String msg) {
275 config.getConfigurationMonitor().checkConfiguration();
276 final Filter filter = config.getFilter();
277 if (filter != null) {
278 final Filter.Result r = filter.filter(logger, level, marker, msg);
279 if (r != Filter.Result.NEUTRAL) {
280 return r == Filter.Result.ACCEPT;
281 }
282 }
283
284 return intLevel >= level.intLevel();
285 }
286
287 boolean filter(final Level level, final Marker marker, final String msg, final Throwable t) {
288 config.getConfigurationMonitor().checkConfiguration();
289 final Filter filter = config.getFilter();
290 if (filter != null) {
291 final Filter.Result r = filter.filter(logger, level, marker, msg, t);
292 if (r != Filter.Result.NEUTRAL) {
293 return r == Filter.Result.ACCEPT;
294 }
295 }
296
297 return intLevel >= level.intLevel();
298 }
299
300 boolean filter(final Level level, final Marker marker, final String msg, final Object... p1) {
301 config.getConfigurationMonitor().checkConfiguration();
302 final Filter filter = config.getFilter();
303 if (filter != null) {
304 final Filter.Result r = filter.filter(logger, level, marker, msg, p1);
305 if (r != Filter.Result.NEUTRAL) {
306 return r == Filter.Result.ACCEPT;
307 }
308 }
309
310 return intLevel >= level.intLevel();
311 }
312
313 boolean filter(final Level level, final Marker marker, final Object msg, final Throwable t) {
314 config.getConfigurationMonitor().checkConfiguration();
315 final Filter filter = config.getFilter();
316 if (filter != null) {
317 final Filter.Result r = filter.filter(logger, level, marker, msg, t);
318 if (r != Filter.Result.NEUTRAL) {
319 return r == Filter.Result.ACCEPT;
320 }
321 }
322
323 return intLevel >= level.intLevel();
324 }
325
326 boolean filter(final Level level, final Marker marker, final Message msg, final Throwable t) {
327 config.getConfigurationMonitor().checkConfiguration();
328 final Filter filter = config.getFilter();
329 if (filter != null) {
330 final Filter.Result r = filter.filter(logger, level, marker, msg, t);
331 if (r != Filter.Result.NEUTRAL) {
332 return r == Filter.Result.ACCEPT;
333 }
334 }
335
336 return intLevel >= level.intLevel();
337 }
338 }
339
340
341
342
343
344 @Override
345 public String toString() {
346 final String nameLevel = "" + getName() + ":" + getLevel();
347 if (context == null) {
348 return nameLevel;
349 }
350 final String contextName = context.getName();
351 return contextName == null ? nameLevel : nameLevel + " in " + contextName;
352 }
353 }