1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.logging.log4j.core.appender;
19
20 import org.apache.logging.log4j.core.Appender;
21 import org.apache.logging.log4j.core.Core;
22 import org.apache.logging.log4j.core.Filter;
23 import org.apache.logging.log4j.core.Layout;
24 import org.apache.logging.log4j.core.LogEvent;
25 import org.apache.logging.log4j.core.config.Configuration;
26 import org.apache.logging.log4j.core.config.DefaultConfiguration;
27 import org.apache.logging.log4j.core.config.Property;
28 import org.apache.logging.log4j.core.config.plugins.Plugin;
29 import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
30 import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
31 import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
32 import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
33 import org.apache.logging.log4j.core.config.plugins.PluginElement;
34 import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
35 import org.apache.logging.log4j.core.config.plugins.validation.constraints.ValidPort;
36 import org.apache.logging.log4j.core.filter.ThresholdFilter;
37 import org.apache.logging.log4j.core.layout.HtmlLayout;
38 import org.apache.logging.log4j.core.net.SmtpManager;
39 import org.apache.logging.log4j.core.net.ssl.SslConfiguration;
40 import org.apache.logging.log4j.core.util.Booleans;
41
42 import java.io.Serializable;
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62 @Plugin(name = "SMTP", category = Core.CATEGORY_NAME, elementType = Appender.ELEMENT_TYPE, printObject = true)
63 public final class SmtpAppender extends AbstractAppender {
64
65 private static final int DEFAULT_BUFFER_SIZE = 512;
66
67
68 private final SmtpManager manager;
69
70 private SmtpAppender(final String name, final Filter filter, final Layout<? extends Serializable> layout,
71 final SmtpManager manager, final boolean ignoreExceptions, final Property[] properties) {
72 super(name, filter, layout, ignoreExceptions, properties);
73 this.manager = manager;
74 }
75
76
77
78
79 public static class Builder extends AbstractAppender.Builder<Builder>
80 implements org.apache.logging.log4j.core.util.Builder<SmtpAppender> {
81 @PluginBuilderAttribute
82 private String to;
83
84 @PluginBuilderAttribute
85 private String cc;
86
87 @PluginBuilderAttribute
88 private String bcc;
89
90 @PluginBuilderAttribute
91 private String from;
92
93 @PluginBuilderAttribute
94 private String replyTo;
95
96 @PluginBuilderAttribute
97 private String subject;
98
99 @PluginBuilderAttribute
100 private String smtpProtocol = "smtp";
101
102 @PluginBuilderAttribute
103 private String smtpHost;
104
105 @PluginBuilderAttribute
106 @ValidPort
107 private int smtpPort;
108
109 @PluginBuilderAttribute
110 private String smtpUsername;
111
112 @PluginBuilderAttribute(sensitive = true)
113 private String smtpPassword;
114
115 @PluginBuilderAttribute
116 private boolean smtpDebug;
117
118 @PluginBuilderAttribute
119 private int bufferSize = DEFAULT_BUFFER_SIZE;
120
121 @PluginElement("SSL")
122 private SslConfiguration sslConfiguration;
123
124
125
126
127 public Builder setTo(final String to) {
128 this.to = to;
129 return this;
130 }
131
132
133
134
135 public Builder setCc(final String cc) {
136 this.cc = cc;
137 return this;
138 }
139
140
141
142
143 public Builder setBcc(final String bcc) {
144 this.bcc = bcc;
145 return this;
146 }
147
148
149
150
151 public Builder setFrom(final String from) {
152 this.from = from;
153 return this;
154 }
155
156
157
158
159 public Builder setReplyTo(final String replyTo) {
160 this.replyTo = replyTo;
161 return this;
162 }
163
164
165
166
167
168 public Builder setSubject(final String subject) {
169 this.subject = subject;
170 return this;
171 }
172
173
174
175
176 public Builder setSmtpProtocol(final String smtpProtocol) {
177 this.smtpProtocol = smtpProtocol;
178 return this;
179 }
180
181
182
183
184 public Builder setSmtpHost(final String smtpHost) {
185 this.smtpHost = smtpHost;
186 return this;
187 }
188
189
190
191
192 public Builder setSmtpPort(final int smtpPort) {
193 this.smtpPort = smtpPort;
194 return this;
195 }
196
197
198
199
200 public Builder setSmtpUsername(final String smtpUsername) {
201 this.smtpUsername = smtpUsername;
202 return this;
203 }
204
205
206
207
208 public Builder setSmtpPassword(final String smtpPassword) {
209 this.smtpPassword = smtpPassword;
210 return this;
211 }
212
213
214
215
216 public Builder setSmtpDebug(final boolean smtpDebug) {
217 this.smtpDebug = smtpDebug;
218 return this;
219 }
220
221
222
223
224 public Builder setBufferSize(final int bufferSize) {
225 this.bufferSize = bufferSize;
226 return this;
227 }
228
229
230
231
232 public Builder setSslConfiguration(final SslConfiguration sslConfiguration) {
233 this.sslConfiguration = sslConfiguration;
234 return this;
235 }
236
237
238
239
240
241 @Override
242 public Builder setLayout(final Layout<? extends Serializable> layout) {
243 return super.setLayout(layout);
244 }
245
246
247
248
249
250 @Override
251 public Builder setFilter(final Filter filter) {
252 return super.setFilter(filter);
253 }
254
255 @Override
256 public SmtpAppender build() {
257 if (getLayout() == null) {
258 setLayout(HtmlLayout.createDefaultLayout());
259 }
260 if (getFilter() == null) {
261 setFilter(ThresholdFilter.createFilter(null, null, null));
262 }
263 final SmtpManager smtpManager = SmtpManager.getSmtpManager(getConfiguration(), to, cc, bcc, from, replyTo,
264 subject, smtpProtocol, smtpHost, smtpPort, smtpUsername, smtpPassword, smtpDebug,
265 getFilter().toString(), bufferSize, sslConfiguration);
266 return new SmtpAppender(getName(), getFilter(), getLayout(), smtpManager, isIgnoreExceptions(), getPropertyArray());
267 }
268 }
269
270
271
272
273 @PluginBuilderFactory
274 public static Builder newBuilder() {
275 return new Builder();
276 }
277
278
279
280
281
282
283 public static SmtpAppender createAppender(
284 @PluginConfiguration final Configuration config,
285 @PluginAttribute("name") @Required final String name,
286 @PluginAttribute("to") final String to,
287 @PluginAttribute("cc") final String cc,
288 @PluginAttribute("bcc") final String bcc,
289 @PluginAttribute("from") final String from,
290 @PluginAttribute("replyTo") final String replyTo,
291 @PluginAttribute("subject") final String subject,
292 @PluginAttribute("smtpProtocol") final String smtpProtocol,
293 @PluginAttribute("smtpHost") final String smtpHost,
294 @PluginAttribute(value = "smtpPort", defaultString = "0") @ValidPort final String smtpPortStr,
295 @PluginAttribute("smtpUsername") final String smtpUsername,
296 @PluginAttribute(value = "smtpPassword", sensitive = true) final String smtpPassword,
297 @PluginAttribute("smtpDebug") final String smtpDebug,
298 @PluginAttribute("bufferSize") final String bufferSizeStr,
299 @PluginElement("Layout") Layout<? extends Serializable> layout,
300 @PluginElement("Filter") Filter filter,
301 @PluginAttribute("ignoreExceptions") final String ignore) {
302 if (name == null) {
303 LOGGER.error("No name provided for SmtpAppender");
304 return null;
305 }
306
307 final boolean ignoreExceptions = Booleans.parseBoolean(ignore, true);
308 final int smtpPort = AbstractAppender.parseInt(smtpPortStr, 0);
309 final boolean isSmtpDebug = Boolean.parseBoolean(smtpDebug);
310 final int bufferSize = bufferSizeStr == null ? DEFAULT_BUFFER_SIZE : Integer.parseInt(bufferSizeStr);
311
312 if (layout == null) {
313 layout = HtmlLayout.createDefaultLayout();
314 }
315 if (filter == null) {
316 filter = ThresholdFilter.createFilter(null, null, null);
317 }
318 final Configuration configuration = config != null ? config : new DefaultConfiguration();
319
320 final SmtpManager manager = SmtpManager.getSmtpManager(configuration, to, cc, bcc, from, replyTo, subject, smtpProtocol,
321 smtpHost, smtpPort, smtpUsername, smtpPassword, isSmtpDebug, filter.toString(), bufferSize, null);
322 if (manager == null) {
323 return null;
324 }
325
326 return new SmtpAppender(name, filter, layout, manager, ignoreExceptions, null);
327 }
328
329
330
331
332
333
334 @Override
335 public boolean isFiltered(final LogEvent event) {
336 final boolean filtered = super.isFiltered(event);
337 if (filtered) {
338 manager.add(event);
339 }
340 return filtered;
341 }
342
343
344
345
346
347
348
349 @Override
350 public void append(final LogEvent event) {
351 manager.sendEvents(getLayout(), event);
352 }
353 }