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