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