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 private final LoggerConfig loggerConfig;
238 private final Configuration config;
239 private final Level level;
240 private final int intLevel;
241 private final Logger logger;
242
243 public PrivateConfig(final Configuration config, final Logger logger) {
244 this.config = config;
245 this.loggerConfig = config.getLoggerConfig(getName());
246 this.level = this.loggerConfig.getLevel();
247 this.intLevel = this.level.intLevel();
248 this.logger = logger;
249 }
250
251 public PrivateConfig(final PrivateConfig pc, final Level level) {
252 this.config = pc.config;
253 this.loggerConfig = pc.loggerConfig;
254 this.level = level;
255 this.intLevel = this.level.intLevel();
256 this.logger = pc.logger;
257 }
258
259 public PrivateConfig(final PrivateConfig pc, final LoggerConfig lc) {
260 this.config = pc.config;
261 this.loggerConfig = lc;
262 this.level = lc.getLevel();
263 this.intLevel = this.level.intLevel();
264 this.logger = pc.logger;
265 }
266
267 protected void logEvent(final LogEvent event) {
268 config.getConfigurationMonitor().checkConfiguration();
269 loggerConfig.log(event);
270 }
271
272 boolean filter(final Level level, final Marker marker, final String msg) {
273 config.getConfigurationMonitor().checkConfiguration();
274 final Filter filter = config.getFilter();
275 if (filter != null) {
276 final Filter.Result r = filter.filter(logger, level, marker, msg);
277 if (r != Filter.Result.NEUTRAL) {
278 return r == Filter.Result.ACCEPT;
279 }
280 }
281
282 return intLevel >= level.intLevel();
283 }
284
285 boolean filter(final Level level, final Marker marker, final String msg, final Throwable t) {
286 config.getConfigurationMonitor().checkConfiguration();
287 final Filter filter = config.getFilter();
288 if (filter != null) {
289 final Filter.Result r = filter.filter(logger, level, marker, msg, t);
290 if (r != Filter.Result.NEUTRAL) {
291 return r == Filter.Result.ACCEPT;
292 }
293 }
294
295 return intLevel >= level.intLevel();
296 }
297
298 boolean filter(final Level level, final Marker marker, final String msg, final Object... p1) {
299 config.getConfigurationMonitor().checkConfiguration();
300 final Filter filter = config.getFilter();
301 if (filter != null) {
302 final Filter.Result r = filter.filter(logger, level, marker, msg, p1);
303 if (r != Filter.Result.NEUTRAL) {
304 return r == Filter.Result.ACCEPT;
305 }
306 }
307
308 return intLevel >= level.intLevel();
309 }
310
311 boolean filter(final Level level, final Marker marker, final Object msg, final Throwable t) {
312 config.getConfigurationMonitor().checkConfiguration();
313 final Filter filter = config.getFilter();
314 if (filter != null) {
315 final Filter.Result r = filter.filter(logger, level, marker, msg, t);
316 if (r != Filter.Result.NEUTRAL) {
317 return r == Filter.Result.ACCEPT;
318 }
319 }
320
321 return intLevel >= level.intLevel();
322 }
323
324 boolean filter(final Level level, final Marker marker, final Message msg, final Throwable t) {
325 config.getConfigurationMonitor().checkConfiguration();
326 final Filter filter = config.getFilter();
327 if (filter != null) {
328 final Filter.Result r = filter.filter(logger, level, marker, msg, t);
329 if (r != Filter.Result.NEUTRAL) {
330 return r == Filter.Result.ACCEPT;
331 }
332 }
333
334 return intLevel >= level.intLevel();
335 }
336 }
337
338
339
340
341
342 @Override
343 public String toString() {
344 final String nameLevel = "" + getName() + ":" + getLevel();
345 if (context == null) {
346 return nameLevel;
347 }
348 final String contextName = context.getName();
349 return contextName == null ? nameLevel : nameLevel + " in " + contextName;
350 }
351 }