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