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 org.apache.logging.log4j.Logger;
20 import org.apache.logging.log4j.core.LogEvent;
21 import org.apache.logging.log4j.core.config.plugins.Plugin;
22 import org.apache.logging.log4j.core.config.plugins.PluginAttr;
23 import org.apache.logging.log4j.core.config.plugins.PluginFactory;
24 import org.apache.logging.log4j.status.StatusLogger;
25
26 import java.text.NumberFormat;
27 import java.text.ParseException;
28 import java.util.Locale;
29 import java.util.regex.Matcher;
30 import java.util.regex.Pattern;
31
32
33
34
35 @Plugin(name = "SizeBasedTriggeringPolicy", type = "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 public void initialize(RollingFileManager manager) {
83 this.manager = manager;
84 }
85
86
87
88
89
90
91
92 public boolean isTriggeringEvent(LogEvent event) {
93 return manager.getFileSize() > maxFileSize;
94 }
95
96 @Override
97 public String toString() {
98 return "SizeBasedTriggeringPolicy(size=" + maxFileSize + ")";
99 }
100
101
102
103
104
105
106 @PluginFactory
107 public static SizeBasedTriggeringPolicy createPolicy(@PluginAttr("size") String size) {
108
109 long maxSize = size == null ? MAX_FILE_SIZE : valueOf(size);
110 return new SizeBasedTriggeringPolicy(maxSize);
111 }
112
113
114
115
116
117
118
119
120
121 private static long valueOf(final String string) {
122 final Matcher matcher = VALUE_PATTERN.matcher(string);
123
124
125 if (matcher.matches()) {
126 try {
127
128 final long value = NumberFormat.getNumberInstance(Locale.getDefault()).parse(
129 matcher.group(1)).longValue();
130
131
132 final String units = matcher.group(3);
133
134 if (units.equalsIgnoreCase("")) {
135 return value;
136 } else if (units.equalsIgnoreCase("K")) {
137 return value * KB;
138 } else if (units.equalsIgnoreCase("M")) {
139 return value * MB;
140 } else if (units.equalsIgnoreCase("G")) {
141 return value * GB;
142 } else {
143 LOGGER.error("Units not recognized: " + string);
144 return MAX_FILE_SIZE;
145 }
146 } catch (ParseException e) {
147 LOGGER.error("Unable to parse numeric part: " + string, e);
148 return MAX_FILE_SIZE;
149 }
150 } else {
151 LOGGER.error("Unable to parse bytes: " + string);
152 return MAX_FILE_SIZE;
153 }
154 }
155 }