LOG4J2-435 Factored out file size parsing logic into helper class Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/b7781d69 Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/b7781d69 Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/b7781d69
Branch: refs/heads/master Commit: b7781d69649a0c137951cfd795a132460ae9786a Parents: e233f8c Author: rpopma <[email protected]> Authored: Thu Nov 26 23:34:43 2015 +0900 Committer: rpopma <[email protected]> Committed: Thu Nov 26 23:34:43 2015 +0900 ---------------------------------------------------------------------- .../log4j/core/appender/rolling/FileSize.java | 90 ++++++++++++++++++++ .../rolling/SizeBasedTriggeringPolicy.java | 61 +------------ 2 files changed, 91 insertions(+), 60 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/b7781d69/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/FileSize.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/FileSize.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/FileSize.java new file mode 100644 index 0000000..e134b1f --- /dev/null +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/FileSize.java @@ -0,0 +1,90 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache license, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the license for the specific language governing permissions and + * limitations under the license. + */ + +package org.apache.logging.log4j.core.appender.rolling; + +import java.text.NumberFormat; +import java.text.ParseException; +import java.util.Locale; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.status.StatusLogger; + +/** + * FileSize utility class. + */ +public final class FileSize { + private static final Logger LOGGER = StatusLogger.getLogger(); + + private static final long KB = 1024; + private static final long MB = KB * KB; + private static final long GB = KB * MB; + + /** + * Pattern for string parsing. + */ + private static final Pattern VALUE_PATTERN = + Pattern.compile("([0-9]+([\\.,][0-9]+)?)\\s*(|K|M|G)B?", Pattern.CASE_INSENSITIVE); + + private FileSize() { + } + + /** + * Converts a string to a number of bytes. Strings consist of a floating point value followed by + * K, M, or G for kilobytes, megabytes, gigabytes, respectively. The + * abbreviations KB, MB, and GB are also accepted. Matching is case insensitive. + * + * @param string The string to convert + * @return The Bytes value for the string + */ + public static long parse(final String string, long defaultValue) { + final Matcher matcher = VALUE_PATTERN.matcher(string); + + // Valid input? + if (matcher.matches()) { + try { + // Get double precision value + final long value = NumberFormat.getNumberInstance(Locale.getDefault()).parse( + matcher.group(1)).longValue(); + + // Get units specified + final String units = matcher.group(3); + + if (units.isEmpty()) { + return value; + } else if (units.equalsIgnoreCase("K")) { + return value * KB; + } else if (units.equalsIgnoreCase("M")) { + return value * MB; + } else if (units.equalsIgnoreCase("G")) { + return value * GB; + } else { + LOGGER.error("FileSize units not recognized: " + string); + return defaultValue; + } + } catch (final ParseException e) { + LOGGER.error("FileSize unable to parse numeric part: " + string, e); + return defaultValue; + } + } + LOGGER.error("FileSize unable to parse bytes: " + string); + return defaultValue; + } + +} http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/b7781d69/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/SizeBasedTriggeringPolicy.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/SizeBasedTriggeringPolicy.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/SizeBasedTriggeringPolicy.java index 1966562..712d5a6 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/SizeBasedTriggeringPolicy.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rolling/SizeBasedTriggeringPolicy.java @@ -16,12 +16,6 @@ */ package org.apache.logging.log4j.core.appender.rolling; -import java.text.NumberFormat; -import java.text.ParseException; -import java.util.Locale; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.core.LogEvent; import org.apache.logging.log4j.core.config.plugins.Plugin; @@ -39,22 +33,11 @@ public class SizeBasedTriggeringPolicy implements TriggeringPolicy { */ protected static final Logger LOGGER = StatusLogger.getLogger(); - private static final long KB = 1024; - private static final long MB = KB * KB; - private static final long GB = KB * MB; - /** * Rollover threshold size in bytes. */ private static final long MAX_FILE_SIZE = 10 * 1024 * 1024; // let 10 MB the default max size - - /** - * Pattern for string parsing. - */ - private static final Pattern VALUE_PATTERN = - Pattern.compile("([0-9]+([\\.,][0-9]+)?)\\s*(|K|M|G)B?", Pattern.CASE_INSENSITIVE); - private final long maxFileSize; private RollingFileManager manager; @@ -116,50 +99,8 @@ public class SizeBasedTriggeringPolicy implements TriggeringPolicy { @PluginFactory public static SizeBasedTriggeringPolicy createPolicy(@PluginAttribute("size") final String size) { - final long maxSize = size == null ? MAX_FILE_SIZE : valueOf(size); + final long maxSize = size == null ? MAX_FILE_SIZE : FileSize.parse(size, MAX_FILE_SIZE); return new SizeBasedTriggeringPolicy(maxSize); } - /** - * Converts a string to a number of bytes. Strings consist of a floating point value followed by - * K, M, or G for kilobytes, megabytes, gigabytes, respectively. The - * abbreviations KB, MB, and GB are also accepted. Matching is case insensitive. - * - * @param string The string to convert - * @return The Bytes value for the string - */ - private static long valueOf(final String string) { - final Matcher matcher = VALUE_PATTERN.matcher(string); - - // Valid input? - if (matcher.matches()) { - try { - // Get double precision value - final long value = NumberFormat.getNumberInstance(Locale.getDefault()).parse( - matcher.group(1)).longValue(); - - // Get units specified - final String units = matcher.group(3); - - if (units.isEmpty()) { - return value; - } else if (units.equalsIgnoreCase("K")) { - return value * KB; - } else if (units.equalsIgnoreCase("M")) { - return value * MB; - } else if (units.equalsIgnoreCase("G")) { - return value * GB; - } else { - LOGGER.error("Units not recognized: " + string); - return MAX_FILE_SIZE; - } - } catch (final ParseException e) { - LOGGER.error("Unable to parse numeric part: " + string, e); - return MAX_FILE_SIZE; - } - } - LOGGER.error("Unable to parse bytes: " + string); - return MAX_FILE_SIZE; - } - }
