svn commit: r2172 - in logback/trunk: logback-classic/src/main/java/ch/qos/logback/classic/pattern logback-classic/src/test/java/ch/qos/logback/classic/pattern logback-core/src/main/java/ch/qos/logback/core

Author: ceki Date: Fri Feb 27 14:54:13 2009 New Revision: 2172 Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/TargetLengthBasedClassNameAbbreviator.java logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/ConverterTest.java logback/trunk/logback-core/src/main/java/ch/qos/logback/core/CoreConstants.java Log: When the class name contains 13 or more segments (12 dots), the abbreviation algorithm would bomb out with an exception. This was reported by Lukas Zapletal in LBCLASSIC-110 and on the logback mailing list. The critical change is int[] lengthArray = new int[ClassicConstants.MAX_DOTS]; instead of int[] lengthArray = new int[ClassicConstants.MAX_DOTS+1]; The current MAX_DOTS limit has been increased from 12 to 16. However, the with aforementioned "critical" change, the code can deal with any number of dots as attested by the accompanying test case. Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/TargetLengthBasedClassNameAbbreviator.java ============================================================================== --- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/TargetLengthBasedClassNameAbbreviator.java (original) +++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/TargetLengthBasedClassNameAbbreviator.java Fri Feb 27 14:54:13 2009 @@ -1,21 +1,21 @@ /** - * LOGBack: the reliable, fast and flexible logging library for Java. - * - * Copyright (C) 1999-2006, QOS.ch - * - * This library is free software, you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation. + * Logback: the generic, reliable, fast and flexible logging framework. + * + * Copyright (C) 2000-2009, QOS.ch + * + * This library is free software, you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation. */ package ch.qos.logback.classic.pattern; +import ch.qos.logback.classic.ClassicConstants; import ch.qos.logback.core.CoreConstants; public class TargetLengthBasedClassNameAbbreviator implements Abbreviator { static private final int BUF_LIMIT = 256; - static private final int MAX_DOTS = 12; - + final int targetLength; StringBuffer buf; @@ -39,8 +39,8 @@ } buf.setLength(0); - int[] dotArray = new int[MAX_DOTS]; - int[] lengthArray = new int[MAX_DOTS]; + int[] dotArray = new int[ClassicConstants.MAX_DOTS]; + int[] lengthArray = new int[ClassicConstants.MAX_DOTS+1]; int dotCount = computeIndexes(fqClassName, dotArray); @@ -72,7 +72,7 @@ int k = 0; while (true) { k = className.indexOf(CoreConstants.DOT, k); - if (k != -1 && dotCount < MAX_DOTS) { + if (k != -1 && dotCount < ClassicConstants.MAX_DOTS) { dotArray[dotCount] = k; dotCount++; k++; Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/ConverterTest.java ============================================================================== --- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/ConverterTest.java (original) +++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/ConverterTest.java Fri Feb 27 14:54:13 2009 @@ -1,7 +1,7 @@ /** - * LOGBack: the reliable, fast and flexible logging library for Java. + * Logback: the generic, reliable, fast and flexible logging framework. * - * Copyright (C) 1999-2005, QOS.ch + * Copyright (C) 2000-2009, QOS.ch * * This library is free software, you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free @@ -21,6 +21,7 @@ import org.slf4j.MDC; import org.slf4j.MarkerFactory; +import ch.qos.logback.classic.ClassicConstants; import ch.qos.logback.classic.Level; import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.LoggerContext; @@ -36,7 +37,7 @@ LoggerContext lc = new LoggerContext(); Logger logger = lc.getLogger(ConverterTest.class); - ILoggingEvent le; + LoggingEvent le; List<String> optionList = new ArrayList<String>(); // The LoggingEvent is massaged with an FCQN of FormattingConverter. This @@ -69,7 +70,7 @@ StringBuffer buf = new StringBuffer(); converter.write(buf, le); // the number below should be the line number of the previous line - assertEquals("70", buf.toString()); + assertEquals("71", buf.toString()); } } @@ -164,6 +165,38 @@ } @Test + public void testVeryLongLoggerName() { + ClassicConverter converter = new LoggerConverter(); + this.optionList.add("5"); + converter.setOptionList(this.optionList); + converter.start(); + StringBuffer buf = new StringBuffer(); + + char c = 'a'; + int extraParts = 3; + int totalParts = ClassicConstants.MAX_DOTS + extraParts; + StringBuilder loggerNameBuf = new StringBuilder(); + StringBuilder witness = new StringBuilder(); + + for(int i = 0; i < totalParts ; i++) { + loggerNameBuf.append(c).append(c).append(c); + if(i < ClassicConstants.MAX_DOTS) { + witness.append(c); + } else { + witness.append(c).append(c).append(c); + } + loggerNameBuf.append('.'); + witness.append('.'); + } + loggerNameBuf.append("zzzzzz"); + witness.append("zzzzzz"); + + le.setLoggerName(loggerNameBuf.toString()); + converter.write(buf, le); + assertEquals(witness.toString(), buf.toString()); + } + + @Test public void testClass() { DynamicConverter<ILoggingEvent> converter = new ClassOfCallerConverter(); StringBuffer buf = new StringBuffer(); Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/CoreConstants.java ============================================================================== --- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/CoreConstants.java (original) +++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/CoreConstants.java Fri Feb 27 14:54:13 2009 @@ -69,7 +69,7 @@ public static final int TABLE_ROW_LIMIT = 10000; - // reset the ObjectOutputStream every 70 calls + // reset the ObjectOutputStream every OOS_RESET_FREQUENCY calls // this avoid serious memory leaks public static final int OOS_RESET_FREQUENCY = 70;

noreply.ceki@qos.ch skrev:
The critical change is int[] lengthArray = new int[ClassicConstants.MAX_DOTS]; instead of int[] lengthArray = new int[ClassicConstants.MAX_DOTS+1];
The current MAX_DOTS limit has been increased from 12 to 16. However,
Why the bound? If using an ArrayList instead of int[]'s they will grow as appropriate? -- Thorbjørn Ravn Andersen "...plus... Tubular Bells!"

Thorbjoern Ravn Andersen wrote:
Why the bound? If using an ArrayList instead of int[]'s they will grow as appropriate?
Because we are talking about a logger name, and having a limit of 12 (not 16) is already quite generous. More importantly, the code is on a critical path... -- Ceki Gülcü Logback: The reliable, generic, fast and flexible logging framework for Java. http://logback.qos.ch
participants (3)
-
Ceki Gulcu
-
noreply.ceki@qos.ch
-
Thorbjoern Ravn Andersen