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 import java.util.HashMap;
21 import java.util.Map;
22
23 import org.apache.logging.log4j.core.Filter;
24 import org.apache.logging.log4j.core.Layout;
25 import org.apache.logging.log4j.core.config.Configuration;
26 import org.apache.logging.log4j.core.config.plugins.Plugin;
27 import org.apache.logging.log4j.core.config.plugins.PluginAliases;
28 import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
29 import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
30 import org.apache.logging.log4j.core.config.plugins.PluginElement;
31 import org.apache.logging.log4j.core.config.plugins.PluginFactory;
32 import org.apache.logging.log4j.core.layout.SerializedLayout;
33 import org.apache.logging.log4j.core.net.AbstractSocketManager;
34 import org.apache.logging.log4j.core.net.Advertiser;
35 import org.apache.logging.log4j.core.net.DatagramSocketManager;
36 import org.apache.logging.log4j.core.net.Protocol;
37 import org.apache.logging.log4j.core.net.SslSocketManager;
38 import org.apache.logging.log4j.core.net.TcpSocketManager;
39 import org.apache.logging.log4j.core.net.ssl.SslConfiguration;
40 import org.apache.logging.log4j.core.util.Booleans;
41
42
43
44
45 @Plugin(name = "Socket", category = "Core", elementType = "appender", printObject = true)
46 public class SocketAppender extends AbstractOutputStreamAppender<AbstractSocketManager> {
47
48 private static final long serialVersionUID = 1L;
49
50 private Object advertisement;
51 private final Advertiser advertiser;
52
53 protected SocketAppender(final String name, final Layout<? extends Serializable> layout, final Filter filter,
54 final AbstractSocketManager manager, final boolean ignoreExceptions, final boolean immediateFlush,
55 final Advertiser advertiser) {
56 super(name, layout, filter, ignoreExceptions, immediateFlush, manager);
57 if (advertiser != null) {
58 final Map<String, String> configuration = new HashMap<>(layout.getContentFormat());
59 configuration.putAll(manager.getContentFormat());
60 configuration.put("contentType", layout.getContentType());
61 configuration.put("name", name);
62 this.advertisement = advertiser.advertise(configuration);
63 }
64 this.advertiser = advertiser;
65 }
66
67 @Override
68 public void stop() {
69 super.stop();
70 if (this.advertiser != null) {
71 this.advertiser.unadvertise(this.advertisement);
72 }
73 }
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109 @PluginFactory
110 public static SocketAppender createAppender(
111
112 @PluginAttribute("host") final String host,
113 @PluginAttribute(value = "port", defaultInt = 0) final int port,
114 @PluginAttribute("protocol") final Protocol protocol,
115 @PluginElement("SSL") final SslConfiguration sslConfig,
116 @PluginAttribute(value = "connectTimeoutMillis", defaultInt = 0) final int connectTimeoutMillis,
117 @PluginAliases("reconnectionDelay")
118 @PluginAttribute(value = "reconnectionDelayMillis", defaultInt = 0) final int reconnectDelayMillis,
119 @PluginAttribute(value = "immediateFail", defaultBoolean = true) final boolean immediateFail,
120 @PluginAttribute("name") final String name,
121 @PluginAttribute(value = "immediateFlush", defaultBoolean = true) boolean immediateFlush,
122 @PluginAttribute(value = "ignoreExceptions", defaultBoolean = true) final boolean ignoreExceptions,
123 @PluginElement("Layout") Layout<? extends Serializable> layout,
124 @PluginElement("Filter") final Filter filter,
125 @PluginAttribute(value = "advertise", defaultBoolean = false) final boolean advertise,
126 @PluginConfiguration final Configuration config) {
127
128
129 if (layout == null) {
130 layout = SerializedLayout.createLayout();
131 }
132
133 if (name == null) {
134 LOGGER.error("No name provided for SocketAppender");
135 return null;
136 }
137
138 final Protocol actualProtocol = protocol != null ? protocol : Protocol.TCP;
139 if (actualProtocol == Protocol.UDP) {
140 immediateFlush = true;
141 }
142
143 final AbstractSocketManager manager = createSocketManager(name, actualProtocol, host, port, connectTimeoutMillis,
144 sslConfig, reconnectDelayMillis, immediateFail, layout);
145
146 return new SocketAppender(name, layout, filter, manager, ignoreExceptions, immediateFlush,
147 advertise ? config.getAdvertiser() : null);
148 }
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185 @Deprecated
186 public static SocketAppender createAppender(
187
188 final String host,
189 final String portNum,
190 final String protocolIn,
191 final SslConfiguration sslConfig,
192 final int connectTimeoutMillis,
193
194 final String delayMillis,
195 final String immediateFail,
196 final String name,
197 final String immediateFlush,
198 final String ignore,
199 Layout<? extends Serializable> layout,
200 final Filter filter,
201 final String advertise,
202 final Configuration config) {
203
204 boolean isFlush = Booleans.parseBoolean(immediateFlush, true);
205 final boolean isAdvertise = Boolean.parseBoolean(advertise);
206 final boolean ignoreExceptions = Booleans.parseBoolean(ignore, true);
207 final boolean fail = Booleans.parseBoolean(immediateFail, true);
208 final int reconnectDelayMillis = AbstractAppender.parseInt(delayMillis, 0);
209 final int port = AbstractAppender.parseInt(portNum, 0);
210 final Protocol p = protocolIn == null ? Protocol.UDP : Protocol.valueOf(protocolIn);
211 return createAppender(host, port, p, sslConfig, connectTimeoutMillis, reconnectDelayMillis, fail, name, isFlush,
212 ignoreExceptions, layout, filter, isAdvertise, config);
213 }
214
215
216
217
218
219
220
221 protected static AbstractSocketManager createSocketManager(final String name, Protocol protocol, final String host,
222 final int port, final int connectTimeoutMillis, final SslConfiguration sslConfig, final int delayMillis,
223 final boolean immediateFail, final Layout<? extends Serializable> layout) {
224 if (protocol == Protocol.TCP && sslConfig != null) {
225
226 protocol = Protocol.SSL;
227 }
228 if (protocol != Protocol.SSL && sslConfig != null) {
229 LOGGER.info("Appender {} ignoring SSL configuration for {} protocol", name, protocol);
230 }
231 switch (protocol) {
232 case TCP:
233 return TcpSocketManager.getSocketManager(host, port, connectTimeoutMillis, delayMillis, immediateFail,
234 layout);
235 case UDP:
236 return DatagramSocketManager.getSocketManager(host, port, layout);
237 case SSL:
238 return SslSocketManager.getSocketManager(sslConfig, host, port, connectTimeoutMillis, delayMillis,
239 immediateFail, layout);
240 default:
241 throw new IllegalArgumentException(protocol.toString());
242 }
243 }
244 }