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