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