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
79
80
81
82 @Override
83 public void initialize(final RollingFileManager manager) {
84 this.manager = manager;
85 }
86
87
88
89
90
91
92
93 @Override
94 public boolean isTriggeringEvent(final LogEvent event) {
95 final boolean triggered = manager.getFileSize() > maxFileSize;
96 if (triggered) {
97 manager.getPatternProcessor().updateTime();
98 }
99 return triggered;
100 }
101
102 @Override
103 public String toString() {
104 return "SizeBasedTriggeringPolicy(size=" + maxFileSize + ')';
105 }
106
107
108
109
110
111
112 @PluginFactory
113 public static SizeBasedTriggeringPolicy createPolicy(@PluginAttribute("size") final String size) {
114
115 final long maxSize = size == null ? MAX_FILE_SIZE : valueOf(size);
116 return new SizeBasedTriggeringPolicy(maxSize);
117 }
118
119
120
121
122
123
124
125
126
127 private static long valueOf(final String string) {
128 final Matcher matcher = VALUE_PATTERN.matcher(string);
129
130
131 if (matcher.matches()) {
132 try {
133
134 final long value = NumberFormat.getNumberInstance(Locale.getDefault()).parse(
135 matcher.group(1)).longValue();
136
137
138 final String units = matcher.group(3);
139
140 if (units.isEmpty()) {
141 return value;
142 } else if (units.equalsIgnoreCase("K")) {
143 return value * KB;
144 } else if (units.equalsIgnoreCase("M")) {
145 return value * MB;
146 } else if (units.equalsIgnoreCase("G")) {
147 return value * GB;
148 } else {
149 LOGGER.error("Units not recognized: " + string);
150 return MAX_FILE_SIZE;
151 }
152 } catch (final ParseException e) {
153 LOGGER.error("Unable to parse numeric part: " + string, e);
154 return MAX_FILE_SIZE;
155 }
156 }
157 LOGGER.error("Unable to parse bytes: " + string);
158 return MAX_FILE_SIZE;
159 }
160 }