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 org.apache.logging.log4j.core.Filter;
20 import org.apache.logging.log4j.core.Layout;
21 import org.apache.logging.log4j.core.config.plugins.Plugin;
22 import org.apache.logging.log4j.core.config.plugins.PluginAttr;
23 import org.apache.logging.log4j.core.config.plugins.PluginElement;
24 import org.apache.logging.log4j.core.config.plugins.PluginFactory;
25 import org.apache.logging.log4j.core.layout.SerializedLayout;
26 import org.apache.logging.log4j.core.net.AbstractSocketManager;
27 import org.apache.logging.log4j.core.net.DatagramSocketManager;
28 import org.apache.logging.log4j.core.net.Protocol;
29 import org.apache.logging.log4j.core.net.TCPSocketManager;
30 import org.apache.logging.log4j.util.EnglishEnums;
31
32
33
34
35 @Plugin(name = "Socket", type = "Core", elementType = "appender", printObject = true)
36 public class SocketAppender extends AbstractOutputStreamAppender {
37
38
39 protected SocketAppender(final String name, final Layout layout, final Filter filter,
40 final AbstractSocketManager manager, final boolean handleException,
41 final boolean immediateFlush) {
42 super(name, layout, filter, handleException, immediateFlush, manager);
43
44 }
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60 @PluginFactory
61 public static SocketAppender createAppender(@PluginAttr("host") final String host,
62 @PluginAttr("port") final String portNum,
63 @PluginAttr("protocol") final String protocol,
64 @PluginAttr("reconnectionDelay") final String delay,
65 @PluginAttr("name") final String name,
66 @PluginAttr("immediateFlush") final String immediateFlush,
67 @PluginAttr("suppressExceptions") final String suppress,
68 @PluginElement("layout") Layout layout,
69 @PluginElement("filters") final Filter filter) {
70
71 final boolean isFlush = immediateFlush == null ? true : Boolean.valueOf(immediateFlush);
72 final boolean handleExceptions = suppress == null ? true : Boolean.valueOf(suppress);
73 final int reconnectDelay = delay == null ? 0 : Integer.parseInt(delay);
74 final int port = portNum == null ? 0 : Integer.parseInt(portNum);
75 if (layout == null) {
76 layout = SerializedLayout.createLayout();
77 }
78
79 if (name == null) {
80 LOGGER.error("No name provided for SocketAppender");
81 return null;
82 }
83
84 final String prot = protocol != null ? protocol : Protocol.TCP.name();
85
86 final AbstractSocketManager manager = createSocketManager(prot, host, port, reconnectDelay);
87 if (manager == null) {
88 return null;
89 }
90 return new SocketAppender(name, layout, filter, manager, handleExceptions, isFlush);
91 }
92
93 protected static AbstractSocketManager createSocketManager(final String protocol, final String host, final int port,
94 final int delay) {
95 final Protocol p = EnglishEnums.valueOf(Protocol.class, protocol);
96 switch (p) {
97 case TCP:
98 return TCPSocketManager.getSocketManager(host, port, delay);
99 case UDP:
100 return DatagramSocketManager.getSocketManager(host, port);
101 default:
102 return null;
103 }
104 }
105 }