1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.logging.log4j.core.appender.rolling;
18
19 import java.text.NumberFormat;
20 import java.text.ParseException;
21 import java.util.Locale;
22 import java.util.regex.Matcher;
23 import java.util.regex.Pattern;
24
25 import org.apache.logging.log4j.Logger;
26 import org.apache.logging.log4j.core.LogEvent;
27 import org.apache.logging.log4j.core.config.plugins.Plugin;
28 import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
29 import org.apache.logging.log4j.core.config.plugins.PluginFactory;
30 import org.apache.logging.log4j.status.StatusLogger;
31
32
33
34
35 @Plugin(name = "SizeBasedTriggeringPolicy", category = "Core", printObject = true)
36 public class SizeBasedTriggeringPolicy implements TriggeringPolicy {
37
38
39
40 protected static final Logger LOGGER = StatusLogger.getLogger();
41
42 private static final long KB = 1024;
43 private static final long MB = KB * KB;
44 private static final long GB = KB * MB;
45
46
47
48
49 private static final long MAX_FILE_SIZE = 10 * 1024 * 1024;
50
51
52
53
54
55 private static final Pattern VALUE_PATTERN =
56 Pattern.compile("([0-9]+([\\.,][0-9]+)?)\\s*(|K|M|G)B?", Pattern.CASE_INSENSITIVE);
57
58 private final long maxFileSize;
59
60 private RollingFileManager manager;
61
62
63
64
65 protected SizeBasedTriggeringPolicy() {
66 this.maxFileSize = MAX_FILE_SIZE;
67 }
68
69
70
71
72
73
74 protected SizeBasedTriggeringPolicy(final long maxFileSize) {
75 this.maxFileSize = maxFileSize;
76 }
77
78 public long getMaxFileSize() {
79 return maxFileSize;
80 }
81
82
83
84
85
86 @Override
87 public void initialize(final RollingFileManager manager) {
88 this.manager = manager;
89 }
90
91
92
93
94
95
96
97 @Override
98 public boolean isTriggeringEvent(final LogEvent event) {
99 final boolean triggered = manager.getFileSize() > maxFileSize;
100 if (triggered) {
101 manager.getPatternProcessor().updateTime();
102 }
103 return triggered;
104 }
105
106 @Override
107 public String toString() {
108 return "SizeBasedTriggeringPolicy(size=" + maxFileSize + ')';
109 }
110
111
112
113
114
115
116 @PluginFactory
117 public static SizeBasedTriggeringPolicy createPolicy(@PluginAttribute("size") final String size) {
118
119 final long maxSize = size == null ? MAX_FILE_SIZE : valueOf(size);
120 return new SizeBasedTriggeringPolicy(maxSize);
121 }
122
123
124
125
126
127
128
129
130
131 private static long valueOf(final String string) {
132 final Matcher matcher = VALUE_PATTERN.matcher(string);
133
134
135 if (matcher.matches()) {
136 try {
137
138 final long value = NumberFormat.getNumberInstance(Locale.getDefault()).parse(
139 matcher.group(1)).longValue();
140
141
142 final String units = matcher.group(3);
143
144 if (units.isEmpty()) {
145 return value;
146 } else if (units.equalsIgnoreCase("K")) {
147 return value * KB;
148 } else if (units.equalsIgnoreCase("M")) {
149 return value * MB;
150 } else if (units.equalsIgnoreCase("G")) {
151 return value * GB;
152 } else {
153 LOGGER.error("Units not recognized: " + string);
154 return MAX_FILE_SIZE;
155 }
156 } catch (final ParseException e) {
157 LOGGER.error("Unable to parse numeric part: " + string, e);
158 return MAX_FILE_SIZE;
159 }
160 }
161 LOGGER.error("Unable to parse bytes: " + string);
162 return MAX_FILE_SIZE;
163 }
164
165 }