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