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