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