[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