Author: ravn Date: Sat Nov 15 00:09:36 2008 New Revision: 1234 Modified: slf4j/trunk/slf4j-ext/src/main/java/org/slf4j/instrumentation/LogTransformer.java slf4j/trunk/slf4j-site/src/site/pages/extensions.html
Log: added note on static logger name and that empty methods are not logged Modified: slf4j/trunk/slf4j-ext/src/main/java/org/slf4j/instrumentation/LogTransformer.java ============================================================================== --- slf4j/trunk/slf4j-ext/src/main/java/org/slf4j/instrumentation/LogTransformer.java (original) +++ slf4j/trunk/slf4j-ext/src/main/java/org/slf4j/instrumentation/LogTransformer.java Sat Nov 15 00:09:36 2008 @@ -135,8 +135,6 @@ + builder.level.substring(1) + "Enabled"; } - private static final String _LOG = "_log"; - private boolean addEntryExit; // private boolean addVariableAssignment; private boolean verbose; @@ -176,6 +174,8 @@ return doClass(className, clazz, bytes); } + private String loggerName; + /** * doClass() process a single class by first creates a class description from * the byte codes. If it is a class (i.e. not an interface) the methods @@ -196,12 +196,16 @@ cl = pool.makeClass(new ByteArrayInputStream(b)); if (cl.isInterface() == false) { - // We have to define the log variable. + loggerName = "_____log"; + + // We have to declare the log variable. + String pattern1 = "private static org.slf4j.Logger {};"; - String loggerDefinition = format(pattern1, _LOG); + String loggerDefinition = format(pattern1, loggerName); CtField field = CtField.make(loggerDefinition, cl); // and assign it the appropriate value. + String pattern2 = "org.slf4j.LoggerFactory.getLogger({}.class);"; String replace = name.replace('/', '.'); String getLogger = format(pattern2, replace); @@ -210,6 +214,8 @@ // then check every behaviour (which includes methods). We are only // interested in non-empty ones, as they have code. + // NOTE: This will be changed, as empty methods should be + // instrumented too. CtBehavior[] methods = cl.getDeclaredBehaviors(); for (int i = 0; i < methods.length; i++) { @@ -247,13 +253,13 @@ if (addEntryExit) { String messagePattern = "if ({}.{}()) {}.{}(\">> {}\");"; - Object[] arg1 = new Object[] { _LOG, levelEnabled, _LOG, level, signature }; + Object[] arg1 = new Object[] { loggerName, levelEnabled, loggerName, level, signature }; String before = MessageFormatter.arrayFormat(messagePattern, arg1); // System.out.println(before); method.insertBefore(before); String messagePattern2 = "if ({}.{}()) {}.{}(\"<< {}{}\");"; - Object[] arg2 = new Object[] { _LOG, levelEnabled, _LOG, level, + Object[] arg2 = new Object[] { loggerName, levelEnabled, loggerName, level, signature, returnValue }; String after = MessageFormatter.arrayFormat(messagePattern2, arg2); // System.out.println(after); Modified: slf4j/trunk/slf4j-site/src/site/pages/extensions.html ============================================================================== --- slf4j/trunk/slf4j-site/src/site/pages/extensions.html (original) +++ slf4j/trunk/slf4j-site/src/site/pages/extensions.html Sat Nov 15 00:09:36 2008 @@ -690,6 +690,11 @@ printed, are silently swallowed by the JVM.</li> <li>The javaagent does not do any logging itself, and the slf4j backend does not need to be available to the agent. </li> + <li>The name of the logger variable is fixed (to a value unlikely to be used) so if that + name is already used, a failure occures. This should be changed to determine + an unused name and use that instead.</li> + <li>Empty methods are not instrumented (an incorrect check for an interface). They should be</li> + </ul> <p>(The agent is an adaption of the java.util.logging version _______________________________________________ dev mailing list dev@slf4j.org http://www.slf4j.org/mailman/listinfo/dev