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
66 public Logger getParent() {
67 final LoggerConfig lc = config.loggerConfig.getName().equals(getName()) ? config.loggerConfig.getParent() :
68 config.loggerConfig;
69 if (lc == null) {
70 return null;
71 }
72 if (context.hasLogger(lc.getName())) {
73 return context.getLogger(lc.getName(), getMessageFactory());
74 }
75 return new Logger(context, lc.getName(), this.getMessageFactory());
76 }
77
78
79
80
81
82 public LoggerContext getContext() {
83 return context;
84 }
85
86
87
88
89
90 public synchronized void setLevel(final Level level) {
91 if (level != null) {
92 config = new PrivateConfig(config, level);
93 }
94 }
95
96
97
98
99
100 public Level getLevel() {
101 return config.level;
102 }
103
104 @Override
105 public void log(final Marker marker, final String fqcn, final Level level, Message data, final Throwable t) {
106 if (data == null) {
107 data = new SimpleMessage("");
108 }
109 config.config.getConfigurationMonitor().checkConfiguration();
110 config.loggerConfig.log(getName(), marker, fqcn, level, data, t);
111 }
112
113 @Override
114 public boolean isEnabled(final Level level, final Marker marker, final String msg) {
115 return config.filter(level, marker, msg);
116 }
117
118 @Override
119 public boolean isEnabled(final Level level, final Marker marker, final String msg, final Throwable t) {
120 return config.filter(level, marker, msg, t);
121 }
122
123 @Override
124 public boolean isEnabled(final Level level, final Marker marker, final String msg, final Object... p1) {
125 return config.filter(level, marker, msg, p1);
126 }
127
128 @Override
129 public boolean isEnabled(final Level level, final Marker marker, final Object msg, final Throwable t) {
130 return config.filter(level, marker, msg, t);
131 }
132
133 @Override
134 public boolean isEnabled(final Level level, final Marker marker, final Message msg, final Throwable t) {
135 return config.filter(level, marker, msg, t);
136 }
137
138
139
140
141
142 public void addAppender(final Appender appender) {
143 config.config.addLoggerAppender(this, appender);
144 }
145
146
147
148
149
150 public void removeAppender(final Appender appender) {
151 config.loggerConfig.removeAppender(appender.getName());
152 }
153
154
155
156
157
158 public Map<String, Appender> getAppenders() {
159 return config.loggerConfig.getAppenders();
160 }
161
162
163
164
165
166 public Iterator<Filter> getFilters() {
167 final Filter filter = config.loggerConfig.getFilter();
168 if (filter == null) {
169 return new ArrayList<Filter>().iterator();
170 } else if (filter instanceof CompositeFilter) {
171 return ((CompositeFilter) filter).iterator();
172 } else {
173 final List<Filter> filters = new ArrayList<Filter>();
174 filters.add(filter);
175 return filters.iterator();
176 }
177 }
178
179
180
181
182
183 public int filterCount() {
184 final Filter filter = config.loggerConfig.getFilter();
185 if (filter == null) {
186 return 0;
187 } else if (filter instanceof CompositeFilter) {
188 return ((CompositeFilter) filter).size();
189 }
190 return 1;
191 }
192
193
194
195
196
197 public void addFilter(final Filter filter) {
198 config.config.addLoggerFilter(this, filter);
199 }
200
201
202
203
204
205
206 public boolean isAdditive() {
207 return config.loggerConfig.isAdditive();
208 }
209
210
211
212
213
214
215 public void setAdditive(final boolean additive) {
216 config.config.setLoggerAdditive(this, additive);
217 }
218
219
220
221
222
223
224
225
226
227
228
229
230
231 void updateConfiguration(final Configuration config) {
232 this.config = new PrivateConfig(config, this);
233 }
234
235
236
237
238 protected class PrivateConfig {
239
240 public final LoggerConfig loggerConfig;
241 public final Configuration config;
242 private final Level level;
243 private final int intLevel;
244 private final Logger logger;
245
246 public PrivateConfig(final Configuration config, final Logger logger) {
247 this.config = config;
248 this.loggerConfig = config.getLoggerConfig(getName());
249 this.level = this.loggerConfig.getLevel();
250 this.intLevel = this.level.intLevel();
251 this.logger = logger;
252 }
253
254 public PrivateConfig(final PrivateConfig pc, final Level level) {
255 this.config = pc.config;
256 this.loggerConfig = pc.loggerConfig;
257 this.level = level;
258 this.intLevel = this.level.intLevel();
259 this.logger = pc.logger;
260 }
261
262 public PrivateConfig(final PrivateConfig pc, final LoggerConfig lc) {
263 this.config = pc.config;
264 this.loggerConfig = lc;
265 this.level = lc.getLevel();
266 this.intLevel = this.level.intLevel();
267 this.logger = pc.logger;
268 }
269
270
271 public void logEvent(final LogEvent event) {
272 config.getConfigurationMonitor().checkConfiguration();
273 loggerConfig.log(event);
274 }
275
276 boolean filter(final Level level, final Marker marker, final String msg) {
277 config.getConfigurationMonitor().checkConfiguration();
278 final Filter filter = config.getFilter();
279 if (filter != null) {
280 final Filter.Result r = filter.filter(logger, level, marker, msg);
281 if (r != Filter.Result.NEUTRAL) {
282 return r == Filter.Result.ACCEPT;
283 }
284 }
285
286 return intLevel >= level.intLevel();
287 }
288
289 boolean filter(final Level level, final Marker marker, final String msg, final Throwable t) {
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, t);
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 Object... p1) {
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, p1);
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 Object msg, final Throwable t) {
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, t);
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 Message 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
342
343
344
345
346 @Override
347 public String toString() {
348 final String nameLevel = "" + getName() + ":" + getLevel();
349 if (context == null) {
350 return nameLevel;
351 }
352 final String contextName = context.getName();
353 return contextName == null ? nameLevel : nameLevel + " in " + contextName;
354 }
355 }