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