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