1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.logging.log4j.core.config;
18
19 import org.apache.logging.log4j.Level;
20 import org.apache.logging.log4j.core.Appender;
21 import org.apache.logging.log4j.core.Filter;
22 import org.apache.logging.log4j.core.LogEvent;
23 import org.apache.logging.log4j.core.appender.AppenderLoggingException;
24 import org.apache.logging.log4j.core.filter.AbstractFilterable;
25 import org.apache.logging.log4j.core.filter.Filterable;
26
27
28
29
30 public class AppenderControl extends AbstractFilterable {
31
32 private static final long serialVersionUID = 1L;
33
34 private final ThreadLocal<AppenderControl> recursive = new ThreadLocal<AppenderControl>();
35
36 private final Appender appender;
37
38 private final Level level;
39
40 private final int intLevel;
41
42
43
44
45
46
47
48 public AppenderControl(final Appender appender, final Level level, final Filter filter) {
49 super(filter);
50 this.appender = appender;
51 this.level = level;
52 this.intLevel = level == null ? Level.ALL.intLevel() : level.intLevel();
53 start();
54 }
55
56
57
58
59
60 public Appender getAppender() {
61 return appender;
62 }
63
64
65
66
67
68 public void callAppender(final LogEvent event) {
69 if (getFilter() != null) {
70 final Filter.Result r = getFilter().filter(event);
71 if (r == Filter.Result.DENY) {
72 return;
73 }
74 }
75 if (level != null && intLevel < event.getLevel().intLevel()) {
76 return;
77 }
78 if (recursive.get() != null) {
79 appender.getHandler().error("Recursive call to appender " + appender.getName());
80 return;
81 }
82 try {
83 recursive.set(this);
84
85 if (!appender.isStarted()) {
86 appender.getHandler().error("Attempted to append to non-started appender " + appender.getName());
87
88 if (!appender.ignoreExceptions()) {
89 throw new AppenderLoggingException(
90 "Attempted to append to non-started appender " + appender.getName());
91 }
92 }
93
94 if (appender instanceof Filterable && ((Filterable) appender).isFiltered(event)) {
95 return;
96 }
97
98 try {
99 appender.append(event);
100 } catch (final RuntimeException ex) {
101 appender.getHandler().error("An exception occurred processing Appender " + appender.getName(), ex);
102 if (!appender.ignoreExceptions()) {
103 throw ex;
104 }
105 } catch (final Exception ex) {
106 appender.getHandler().error("An exception occurred processing Appender " + appender.getName(), ex);
107 if (!appender.ignoreExceptions()) {
108 throw new AppenderLoggingException(ex);
109 }
110 }
111 } finally {
112 recursive.set(null);
113 }
114 }
115
116 }