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