1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.logging.log4j.core.appender;
18
19 import java.io.Serializable;
20
21 import org.apache.logging.log4j.core.Appender;
22 import org.apache.logging.log4j.core.ErrorHandler;
23 import org.apache.logging.log4j.core.Filter;
24 import org.apache.logging.log4j.core.Layout;
25 import org.apache.logging.log4j.core.LogEvent;
26 import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
27 import org.apache.logging.log4j.core.config.plugins.PluginElement;
28 import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
29 import org.apache.logging.log4j.core.filter.AbstractFilterable;
30 import org.apache.logging.log4j.core.layout.PatternLayout;
31 import org.apache.logging.log4j.core.util.Integers;
32
33
34
35
36
37 public abstract class AbstractAppender extends AbstractFilterable implements Appender {
38
39
40
41
42
43
44 public abstract static class Builder<B extends Builder<B>> extends AbstractFilterable.Builder<B> {
45
46 @PluginBuilderAttribute
47 private boolean ignoreExceptions = true;
48
49 @PluginElement("Layout")
50 private Layout<? extends Serializable> layout;
51
52 @PluginBuilderAttribute
53 @Required
54 private String name;
55
56 public String getName() {
57 return name;
58 }
59
60 public boolean isIgnoreExceptions() {
61 return ignoreExceptions;
62 }
63
64 public Layout<? extends Serializable> getLayout() {
65 return layout;
66 }
67
68 public B withName(final String name) {
69 this.name = name;
70 return asBuilder();
71 }
72
73 public B withIgnoreExceptions(final boolean ignoreExceptions) {
74 this.ignoreExceptions = ignoreExceptions;
75 return asBuilder();
76 }
77
78 public B withLayout(final Layout<? extends Serializable> layout) {
79 this.layout = layout;
80 return asBuilder();
81 }
82
83 public Layout<? extends Serializable> getOrCreateLayout() {
84 if (layout == null) {
85 return PatternLayout.createDefaultLayout();
86 }
87 return layout;
88 }
89
90 }
91
92 private final String name;
93 private final boolean ignoreExceptions;
94 private final Layout<? extends Serializable> layout;
95 private ErrorHandler handler = new DefaultErrorHandler(this);
96
97
98
99
100
101
102
103
104 protected AbstractAppender(final String name, final Filter filter, final Layout<? extends Serializable> layout) {
105 this(name, filter, layout, true);
106 }
107
108
109
110
111
112
113
114
115
116
117 protected AbstractAppender(final String name, final Filter filter, final Layout<? extends Serializable> layout,
118 final boolean ignoreExceptions) {
119 super(filter);
120 this.name = name;
121 this.layout = layout;
122 this.ignoreExceptions = ignoreExceptions;
123 }
124
125 public static int parseInt(final String s, final int defaultValue) {
126 try {
127 return Integers.parseInt(s, defaultValue);
128 } catch (final NumberFormatException e) {
129 LOGGER.error("Could not parse \"{}\" as an integer, using default value {}: {}", s, defaultValue, e);
130 return defaultValue;
131 }
132 }
133
134
135
136
137
138
139 public void error(final String msg) {
140 handler.error(msg);
141 }
142
143
144
145
146
147
148
149
150
151 public void error(final String msg, final LogEvent event, final Throwable t) {
152 handler.error(msg, event, t);
153 }
154
155
156
157
158
159
160
161 public void error(final String msg, final Throwable t) {
162 handler.error(msg, t);
163 }
164
165
166
167
168
169
170 @Override
171 public ErrorHandler getHandler() {
172 return handler;
173 }
174
175
176
177
178
179
180 @Override
181 public Layout<? extends Serializable> getLayout() {
182 return layout;
183 }
184
185
186
187
188
189
190 @Override
191 public String getName() {
192 return name;
193 }
194
195
196
197
198
199
200
201 @Override
202 public boolean ignoreExceptions() {
203 return ignoreExceptions;
204 }
205
206
207
208
209
210
211 @Override
212 public void setHandler(final ErrorHandler handler) {
213 if (handler == null) {
214 LOGGER.error("The handler cannot be set to null");
215 }
216 if (isStarted()) {
217 LOGGER.error("The handler cannot be changed once the appender is started");
218 return;
219 }
220 this.handler = handler;
221 }
222
223 @Override
224 public String toString() {
225 return name;
226 }
227
228 }