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.OutputStream;
20 import java.io.Serializable;
21
22 import org.apache.logging.log4j.core.Appender;
23 import org.apache.logging.log4j.core.Core;
24 import org.apache.logging.log4j.core.Filter;
25 import org.apache.logging.log4j.core.Layout;
26 import org.apache.logging.log4j.core.config.Property;
27 import org.apache.logging.log4j.core.config.plugins.Plugin;
28 import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
29 import org.apache.logging.log4j.core.config.plugins.PluginFactory;
30 import org.apache.logging.log4j.core.layout.PatternLayout;
31 import org.apache.logging.log4j.core.util.CloseShieldOutputStream;
32 import org.apache.logging.log4j.core.util.NullOutputStream;
33
34
35
36
37
38
39
40 @Plugin(name = "OutputStream", category = Core.CATEGORY_NAME, elementType = Appender.ELEMENT_TYPE, printObject = true)
41 public final class OutputStreamAppender extends AbstractOutputStreamAppender<OutputStreamManager> {
42
43
44
45
46
47
48
49 public static class Builder<B extends Builder<B>> extends AbstractOutputStreamAppender.Builder<B>
50 implements org.apache.logging.log4j.core.util.Builder<OutputStreamAppender> {
51
52 private boolean follow = false;
53
54 private final boolean ignoreExceptions = true;
55
56 private OutputStream target;
57
58 @Override
59 public OutputStreamAppender build() {
60 final Layout<? extends Serializable> layout = getLayout();
61 final Layout<? extends Serializable> actualLayout = layout == null ? PatternLayout.createDefaultLayout()
62 : layout;
63 return new OutputStreamAppender(getName(), actualLayout, getFilter(), getManager(target, follow, actualLayout),
64 ignoreExceptions, getPropertyArray());
65 }
66
67 public B setFollow(final boolean shouldFollow) {
68 this.follow = shouldFollow;
69 return asBuilder();
70 }
71
72 public B setTarget(final OutputStream aTarget) {
73 this.target = aTarget;
74 return asBuilder();
75 }
76 }
77
78
79
80
81 private static class FactoryData {
82 private final Layout<? extends Serializable> layout;
83 private final String name;
84 private final OutputStream os;
85
86
87
88
89
90
91
92
93
94
95
96 public FactoryData(final OutputStream os, final String type, final Layout<? extends Serializable> layout) {
97 this.os = os;
98 this.name = type;
99 this.layout = layout;
100 }
101 }
102
103
104
105
106 private static class OutputStreamManagerFactory implements ManagerFactory<OutputStreamManager, FactoryData> {
107
108
109
110
111
112
113
114
115
116
117 @Override
118 public OutputStreamManager createManager(final String name, final FactoryData data) {
119 return new OutputStreamManager(data.os, data.name, data.layout, true);
120 }
121 }
122
123 private static OutputStreamManagerFactory factory = new OutputStreamManagerFactory();
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145 @PluginFactory
146 public static OutputStreamAppender createAppender(Layout<? extends Serializable> layout, final Filter filter,
147 final OutputStream target, final String name, final boolean follow, final boolean ignore) {
148 if (name == null) {
149 LOGGER.error("No name provided for OutputStreamAppender");
150 return null;
151 }
152 if (layout == null) {
153 layout = PatternLayout.createDefaultLayout();
154 }
155 return new OutputStreamAppender(name, layout, filter, getManager(target, follow, layout), ignore, null);
156 }
157
158 private static OutputStreamManager getManager(final OutputStream target, final boolean follow,
159 final Layout<? extends Serializable> layout) {
160 final OutputStream os = target == null ? NullOutputStream.getInstance() : new CloseShieldOutputStream(target);
161 final OutputStream targetRef = target == null ? os : target;
162 final String managerName = targetRef.getClass().getName() + "@" + Integer.toHexString(targetRef.hashCode())
163 + '.' + follow;
164 return OutputStreamManager.getManager(managerName, new FactoryData(os, managerName, layout), factory);
165 }
166
167 @PluginBuilderFactory
168 public static <B extends Builder<B>> B newBuilder() {
169 return new Builder<B>().asBuilder();
170 }
171
172 private OutputStreamAppender(final String name, final Layout<? extends Serializable> layout, final Filter filter,
173 final OutputStreamManager manager, final boolean ignoreExceptions, final Property[] properties) {
174 super(name, layout, filter, ignoreExceptions, true, properties, manager);
175 }
176
177 }