[slf4j-dev] [Bug 288] New: Problematic logger name splitting via Logger.getSeparatorIndexOf()

bugzilla-daemon at qos.ch bugzilla-daemon at qos.ch
Thu Dec 20 17:36:52 CET 2012


http://bugzilla.slf4j.org/show_bug.cgi?id=288

           Summary: Problematic logger name splitting via
                    Logger.getSeparatorIndexOf()
           Product: SLF4J
           Version: 1.6.x
          Platform: PC
        OS/Version: Linux
            Status: NEW
          Severity: normal
          Priority: P1
         Component: Core API
        AssignedTo: slf4j-dev at qos.ch
        ReportedBy: d.tonhofer at m-plify.com


In the Logger class, the method getSeparatorIndexOf() is used to separate off
child logger names (basically, to do String.split() on "name"). It looks for
the occurrence of DOT or DOLLAR:

---------------
  static int getSeparatorIndexOf(String name, int fromIndex) {
    int i = name.indexOf(CoreConstants.DOT, fromIndex);
    if (i != -1) {
      return i;
    } else {
      return name.indexOf(CoreConstants.DOLLAR, fromIndex);
    }
  }
---------------

LoggerContext.getLogger() uses the above to split a passed "name" String.

The logic, however is peculiar.


getSeparatorIndexOf() splits a String along the DOT. Unless that is impossible,
in which case it splits it along the DOLLAR.


Unfortunately, LoggerContext.getLogger() may then behave surprisingly


The name "A.B.C$D" 

will give the Logger chain  A -> A.B -> A.B.C -> A.B.C.D  as expected


The name "A.B$C.D"

could give the Logger chain  A -> A.B -> A.B.C -> A.B.C.D but construction will
fail! Because:


Decomposition via getSeparatorIndexOf() will yield

             A , B$C , D

But construction of a Logger in LoggerContext.getLogger() named "B$C" will fail
because that method checks whether decomposition is still possible; given "B$C"
it will indeed find that decomposition is still possible, along the $ sign. It
will thus throw. 

The problem occurs in case of Logger names like:

"com.mplify.msgserver.ReceiverStickyPersistentStore$ReceiverStickyUpdateTransactionCallback.<clinit>"

This was an acceptable name in 1.6 but causes an exception in 1.7.4

Splitting should probably be done with a modified function:


  static int getSeparatorIndexOf(String name, int fromIndex) {
    int i = name.indexOf(CoreConstants.DOT, fromIndex);    
    int j = name.indexOf(CoreConstants.DOLLAR, fromIndex);
    if (i < 0) {
       return j;
    }
    else if (j < 0) {
       return i;
    } else {
       return (i < j) ? i : j;
    }
  }

which splits along DOT and DOLLAR.

Problem here: Properly recompositing the name from the logger chain will demand
that one stores whether the preceding separator was DOT or DOLLAR. And are the
names "A.B$C" and "A$B.C" actually equivalent?


P.S. :

Another problem: What about "A..B"? Should 

Logger.createChildByName(final String childName) 

not check that is not passed the empty string? Currently it does not.

-- 
Configure bugmail: http://bugzilla.slf4j.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug.


More information about the slf4j-dev mailing list