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