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.util.HashMap;
20 import java.util.Map;
21
22 import org.apache.logging.log4j.core.Filter;
23 import org.apache.logging.log4j.core.Layout;
24 import org.apache.logging.log4j.core.LogEvent;
25 import org.apache.logging.log4j.core.config.Configuration;
26 import org.apache.logging.log4j.core.config.plugins.Plugin;
27 import org.apache.logging.log4j.core.config.plugins.PluginAttr;
28 import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
29 import org.apache.logging.log4j.core.config.plugins.PluginElement;
30 import org.apache.logging.log4j.core.config.plugins.PluginFactory;
31 import org.apache.logging.log4j.core.layout.PatternLayout;
32 import org.apache.logging.log4j.core.net.Advertiser;
33
34
35
36
37 @Plugin(name = "FastFile", type = "Core", elementType = "appender", printObject = true)
38 public final class FastFileAppender extends AbstractOutputStreamAppender {
39
40 private final String fileName;
41 private Object advertisement;
42 private final Advertiser advertiser;
43
44 private FastFileAppender(String name, Layout<?> layout, Filter filter,
45 FastFileManager manager, String filename, boolean handleException,
46 boolean immediateFlush, Advertiser advertiser) {
47 super(name, layout, filter, handleException, immediateFlush, manager);
48 if (advertiser != null) {
49 Map<String, String> configuration = new HashMap<String, String>(
50 layout.getContentFormat());
51 configuration.putAll(manager.getContentFormat());
52 configuration.put("contentType", layout.getContentType());
53 configuration.put("name", name);
54 advertisement = advertiser.advertise(configuration);
55 }
56 this.fileName = filename;
57 this.advertiser = advertiser;
58 }
59
60 @Override
61 public void stop() {
62 super.stop();
63 if (advertiser != null) {
64 advertiser.unadvertise(advertisement);
65 }
66 }
67
68
69
70
71
72
73 @Override
74 public void append(LogEvent event) {
75
76
77
78
79
80
81
82 ((FastFileManager) getManager()).setEndOfBatch(event.isEndOfBatch());
83 super.append(event);
84 }
85
86
87
88
89
90
91 public String getFileName() {
92 return this.fileName;
93 }
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118 @PluginFactory
119 public static FastFileAppender createAppender(
120 @PluginAttr("fileName") String fileName,
121 @PluginAttr("append") String append,
122 @PluginAttr("name") String name,
123 @PluginAttr("immediateFlush") String immediateFlush,
124 @PluginAttr("suppressExceptions") String suppress,
125 @PluginElement("layout") Layout<?> layout,
126 @PluginElement("filters") final Filter filter,
127 @PluginAttr("advertise") final String advertise,
128 @PluginAttr("advertiseURI") final String advertiseURI,
129 @PluginConfiguration final Configuration config) {
130
131 boolean isAppend = append == null ? true : Boolean.valueOf(append);
132 boolean isFlush = immediateFlush == null ? true : Boolean
133 .valueOf(immediateFlush);
134 boolean handleExceptions = suppress == null ? true : Boolean
135 .valueOf(suppress);
136 boolean isAdvertise = advertise == null ? false : Boolean
137 .valueOf(advertise);
138
139 if (name == null) {
140 LOGGER.error("No name provided for FileAppender");
141 return null;
142 }
143
144 if (fileName == null) {
145 LOGGER.error("No filename provided for FileAppender with name "
146 + name);
147 return null;
148 }
149
150 FastFileManager manager = FastFileManager.getFileManager(fileName,
151 isAppend, isFlush, advertiseURI);
152 if (manager == null) {
153 return null;
154 }
155 if (layout == null) {
156 layout = PatternLayout.createLayout(null, null, null, null);
157 }
158 return new FastFileAppender(name, layout, filter, manager, fileName,
159 handleExceptions, isFlush, isAdvertise ? config.getAdvertiser()
160 : null);
161 }
162 }