[slf4j-dev] svn commit: r1091 - in slf4j/trunk: . slf4j-api/src/main/java/org/slf4j/helpers slf4j-ext slf4j-ext/src/main/java/org/slf4j slf4j-ext/src/test/java/org/slf4j slf4j-site/src/site/pages
ceki at slf4j.org
ceki at slf4j.org
Sat Aug 2 21:24:58 CEST 2008
Author: ceki
Date: Sat Aug 2 21:24:58 2008
New Revision: 1091
Added:
slf4j/trunk/slf4j-api/src/main/java/org/slf4j/helpers/NOPLogger.java
slf4j/trunk/slf4j-ext/src/main/java/org/slf4j/XLogger.java
- copied, changed from r1089, /slf4j/trunk/slf4j-ext/src/main/java/org/slf4j/LoggerX.java
Removed:
slf4j/trunk/slf4j-ext/src/main/java/org/slf4j/LoggerX.java
Modified:
slf4j/trunk/pom.xml
slf4j/trunk/slf4j-ext/pom.xml
slf4j/trunk/slf4j-ext/src/test/java/org/slf4j/LoggerXTest.java
slf4j/trunk/slf4j-site/src/site/pages/faq.html
slf4j/trunk/slf4j-site/src/site/pages/news.html
Log:
- decoupling slf4j version numbers from slf4j-ext version
- moved the NOPLoger class from slf4j-nop module to slf4j-api. An NOPLogger came in handy in slf4j-ext
- ongoing work on XLogger.java
- other minor improvements in the docs
Modified: slf4j/trunk/pom.xml
==============================================================================
--- slf4j/trunk/pom.xml (original)
+++ slf4j/trunk/pom.xml Sat Aug 2 21:24:58 2008
@@ -19,8 +19,7 @@
<inceptionYear>2005</inceptionYear>
<properties>
- <!-- <project_version_for_osgi>1.3.0</project_version_for_osgi> -->
- <pv4osgi>1.4.3</pv4osgi>
+ <slf4j-ext-version>1.0-alpha0</slf4j-ext-version>
</properties>
<modules>
@@ -53,7 +52,7 @@
<dependencies>
<dependency>
- <groupId>${project.groupId}</groupId>
+ <groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${project.version}</version>
</dependency>
Added: slf4j/trunk/slf4j-api/src/main/java/org/slf4j/helpers/NOPLogger.java
==============================================================================
--- (empty file)
+++ slf4j/trunk/slf4j-api/src/main/java/org/slf4j/helpers/NOPLogger.java Sat Aug 2 21:24:58 2008
@@ -0,0 +1,238 @@
+/*
+ * Copyright (c) 2004-2005 SLF4J.ORG
+ * Copyright (c) 2004-2005 QOS.ch
+ *
+ * All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, and/or sell copies of the Software, and to permit persons
+ * to whom the Software is furnished to do so, provided that the above
+ * copyright notice(s) and this permission notice appear in all copies of
+ * the Software and that both the above copyright notice(s) and this
+ * permission notice appear in supporting documentation.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+ * OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY
+ * SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER
+ * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+ * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Except as contained in this notice, the name of a copyright holder
+ * shall not be used in advertising or otherwise to promote the sale, use
+ * or other dealings in this Software without prior written authorization
+ * of the copyright holder.
+ *
+ */
+
+package org.slf4j.helpers;
+
+import org.slf4j.Logger;
+import org.slf4j.helpers.MarkerIgnoringBase;
+
+
+/**
+ * A direct NOP (no operation) implementation of {@link Logger}.
+ *
+ * @author Ceki Gülcü
+ */
+public class NOPLogger extends MarkerIgnoringBase {
+
+ private static final long serialVersionUID = -517220405410904473L;
+
+ /**
+ * The unique instance of NOPLogger.
+ */
+ public static final NOPLogger NOP_LOGGER = new NOPLogger();
+
+ /**
+ * There is no point in creating multiple instances of NOPLOgger,
+ * except by derived classes, hence the protected access for the constructor.
+ */
+ protected NOPLogger() {
+ }
+
+ /**
+ * Always returns the string value "NOP".
+ */
+ public String getName() {
+ return "NOP";
+ }
+
+ /**
+ * Always returns false.
+ * @return always false
+ */
+ final public boolean isTraceEnabled() {
+ return false;
+ }
+
+ /** A NOP implementation. */
+ final public void trace(String msg) {
+ // NOP
+ }
+
+ /** A NOP implementation. */
+ final public void trace(String format, Object arg) {
+ // NOP
+ }
+
+ /** A NOP implementation. */
+ public final void trace(String format, Object arg1, Object arg2) {
+ // NOP
+ }
+
+ /** A NOP implementation. */
+ public final void trace(String format, Object[] argArray) {
+ // NOP
+ }
+
+ /** A NOP implementation. */
+ final public void trace(String msg, Throwable t) {
+ // NOP
+ }
+
+ /**
+ * Always returns false.
+ * @return always false
+ */
+ final public boolean isDebugEnabled() {
+ return false;
+ }
+
+ /** A NOP implementation. */
+ final public void debug(String msg) {
+ // NOP
+ }
+
+ /** A NOP implementation. */
+ final public void debug(String format, Object arg) {
+ // NOP
+ }
+
+ /** A NOP implementation. */
+ public final void debug(String format, Object arg1, Object arg2) {
+ // NOP
+ }
+
+ /** A NOP implementation. */
+ public final void debug(String format, Object[] argArray) {
+ // NOP
+ }
+
+
+
+ /** A NOP implementation. */
+ final public void debug(String msg, Throwable t) {
+ // NOP
+ }
+
+ /**
+ * Always returns false.
+ * @return always false
+ */
+ final public boolean isInfoEnabled() {
+ // NOP
+ return false;
+ }
+
+
+ /** A NOP implementation. */
+ final public void info(String msg) {
+ // NOP
+ }
+
+ /** A NOP implementation. */
+ final public void info(String format, Object arg1) {
+ // NOP
+ }
+
+ /** A NOP implementation. */
+ final public void info(String format, Object arg1, Object arg2) {
+ // NOP
+ }
+
+ /** A NOP implementation. */
+ public final void info(String format, Object[] argArray) {
+ // NOP
+ }
+
+
+ /** A NOP implementation. */
+ final public void info(String msg, Throwable t) {
+ // NOP
+ }
+
+
+ /**
+ * Always returns false.
+ * @return always false
+ */
+ final public boolean isWarnEnabled() {
+ return false;
+ }
+
+ /** A NOP implementation. */
+ final public void warn(String msg) {
+ // NOP
+ }
+
+ /** A NOP implementation. */
+ final public void warn(String format, Object arg1) {
+ // NOP
+ }
+
+ /** A NOP implementation. */
+ final public void warn(String format, Object arg1, Object arg2) {
+ // NOP
+ }
+
+ /** A NOP implementation. */
+ public final void warn(String format, Object[] argArray) {
+ // NOP
+ }
+
+
+ /** A NOP implementation. */
+ final public void warn(String msg, Throwable t) {
+ // NOP
+ }
+
+
+ /** A NOP implementation. */
+ final public boolean isErrorEnabled() {
+ return false;
+ }
+
+ /** A NOP implementation. */
+ final public void error(String msg) {
+ // NOP
+ }
+
+ /** A NOP implementation. */
+ final public void error(String format, Object arg1) {
+ // NOP
+ }
+
+ /** A NOP implementation. */
+ final public void error(String format, Object arg1, Object arg2) {
+ // NOP
+ }
+
+ /** A NOP implementation. */
+ public final void error(String format, Object[] argArray) {
+ // NOP
+ }
+
+
+ /** A NOP implementation. */
+ final public void error(String msg, Throwable t) {
+ // NOP
+ }
+}
Modified: slf4j/trunk/slf4j-ext/pom.xml
==============================================================================
--- slf4j/trunk/slf4j-ext/pom.xml (original)
+++ slf4j/trunk/slf4j-ext/pom.xml Sat Aug 2 21:24:58 2008
@@ -12,6 +12,7 @@
<groupId>org.slf4j</groupId>
<artifactId>slf4j-ext</artifactId>
+ <version>${slf4j-ext-version}</version>
<packaging>jar</packaging>
<name>SLF4J Extensions Module</name>
@@ -22,11 +23,12 @@
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
+ <version>${parent.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
- <version>${project.version}</version>
+ <version>${parent.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
Copied: slf4j/trunk/slf4j-ext/src/main/java/org/slf4j/XLogger.java (from r1089, /slf4j/trunk/slf4j-ext/src/main/java/org/slf4j/LoggerX.java)
==============================================================================
--- /slf4j/trunk/slf4j-ext/src/main/java/org/slf4j/LoggerX.java (original)
+++ slf4j/trunk/slf4j-ext/src/main/java/org/slf4j/XLogger.java Sat Aug 2 21:24:58 2008
@@ -1,6 +1,7 @@
package org.slf4j;
import org.slf4j.helpers.MessageFormatter;
+import org.slf4j.helpers.NOPLogger;
import org.slf4j.spi.LocationAwareLogger;
/**
@@ -10,26 +11,33 @@
* @author Ralph Goers
* @author Ceki Gulcu
*/
-public class LoggerX {
+public class XLogger {
- private static final String FQCN = LoggerX.class.getName();
+ private static final String FQCN = XLogger.class.getName();
static Marker FLOW_MARKER = MarkerFactory.getMarker("FLOW");
static Marker ENTRY_MARKER = MarkerFactory.getMarker("ENTER");
static Marker EXIT_MARKER = MarkerFactory.getMarker("EXIT");
static Marker EXCEPTION_MARKER = MarkerFactory.getMarker("EXCEPTION");
- static Marker DIAG_MARKER = MarkerFactory.getMarker("DIAG");
+ static Marker THROWING_MARKER = MarkerFactory.getMarker("EXCEPTION");
+ static Marker CATCHING_MARKER = MarkerFactory.getMarker("EXCEPTION");
+
+ static String EXIT_MESSAGE_0 = "exit";
+ static String EXIT_MESSAGE_1 = "exit with {}";
static String ENTRY_MESSAGE_0 = "entry";
- static String ENTRY_MESSAGE_1 = "entry with params ({})";
- static String ENTRY_MESSAGE_2 = "entry with params ({}, {})";
- static String ENTRY_MESSAGE_3 = "entry with params ({}, {}, {})";
- static String ENTRY_MESSAGE_4 = "entry with params ({}, {}, {}, {})";
+ static String ENTRY_MESSAGE_1 = "entry with ({})";
+ static String ENTRY_MESSAGE_2 = "entry with ({}, {})";
+ static String ENTRY_MESSAGE_3 = "entry with ({}, {}, {})";
+ static String ENTRY_MESSAGE_4 = "entry with ({}, {}, {}, {})";
static int ENTRY_MESSAGE_ARRAY_LEN = 5;
static String[] ENTRY_MESSAGE_ARRAY = new String[ENTRY_MESSAGE_ARRAY_LEN];
static {
ENTRY_MARKER.add(FLOW_MARKER);
EXIT_MARKER.add(FLOW_MARKER);
+ THROWING_MARKER.add(EXCEPTION_MARKER);
+ CATCHING_MARKER.add(EXCEPTION_MARKER);
+
ENTRY_MESSAGE_ARRAY[0] = ENTRY_MESSAGE_0;
ENTRY_MESSAGE_ARRAY[1] = ENTRY_MESSAGE_1;
ENTRY_MESSAGE_ARRAY[2] = ENTRY_MESSAGE_2;
@@ -37,25 +45,96 @@
ENTRY_MESSAGE_ARRAY[4] = ENTRY_MESSAGE_4;
}
+ final Logger logger;
+
+ public XLogger(Logger logger) {
+
+ if (logger instanceof LocationAwareLogger) {
+ this.logger = logger;
+ } else {
+ // if the logger is not location aware, assume that
+ // there is no point in further effort
+ this.logger = NOPLogger.NOP_LOGGER;
+ }
+ }
+
/**
- * Log entry to a method
+ * Log method entry.
*
- * @param logger
- * the Logger to log with.
+ * @param argArray
+ * supplied parameters
*/
- public static void entering(Logger logger, Object... argArray) {
- if (logger.isDebugEnabled(ENTRY_MARKER)
- && logger instanceof LocationAwareLogger) {
- String messagePattern = "";
- if(argArray.length <= ENTRY_MESSAGE_ARRAY_LEN) {
+ public void entry(Object... argArray) {
+ if (logger.isTraceEnabled(ENTRY_MARKER)) {
+ String messagePattern = null;
+ if (argArray.length <= ENTRY_MESSAGE_ARRAY_LEN) {
messagePattern = ENTRY_MESSAGE_ARRAY[argArray.length];
+ } else {
+ messagePattern = buildMessagePattern(argArray.length);
}
-
- String msg = MessageFormatter.arrayFormat(messagePattern, argArray);
-
+ String formattedMessage = MessageFormatter.arrayFormat(messagePattern,
+ argArray);
((LocationAwareLogger) logger).log(ENTRY_MARKER, FQCN,
- LocationAwareLogger.ERROR_INT, msg, null);
+ LocationAwareLogger.TRACE_INT, formattedMessage, null);
+ }
+ }
+
+ /**
+ * Log method exit
+ */
+ public void exit() {
+ if (logger.isTraceEnabled(ENTRY_MARKER)) {
+ ((LocationAwareLogger) logger).log(EXIT_MARKER, FQCN,
+ LocationAwareLogger.TRACE_INT, EXIT_MESSAGE_0, null);
+ }
+ }
+
+ /**
+ * Log method exit
+ *
+ * @param result
+ * The result of the method being exited
+ */
+ public void exit(Object result) {
+ if (logger.isTraceEnabled(ENTRY_MARKER)) {
+ String formattedMessage = MessageFormatter.format(EXIT_MESSAGE_0, result);
+ ((LocationAwareLogger) logger).log(EXIT_MARKER, FQCN,
+ LocationAwareLogger.TRACE_INT, formattedMessage, null);
+ }
+ }
+
+ /**
+ * Log an exception being thrown
+ *
+ * @param throwable
+ * the exception being caught.
+ */
+ public void throwing(Throwable throwable) {
+ ((LocationAwareLogger) logger).log(THROWING_MARKER, FQCN,
+ LocationAwareLogger.ERROR_INT, "throwing", throwable);
+ }
+
+ /**
+ * Log an exception being caught
+ *
+ * @param throwable
+ * the exception being caught.
+ */
+ public void catching(Throwable throwable) {
+ ((LocationAwareLogger) logger).log(CATCHING_MARKER, FQCN,
+ LocationAwareLogger.ERROR_INT, "catching", throwable);
+ }
+
+ private static String buildMessagePattern(int len) {
+ StringBuilder sb = new StringBuilder();
+ sb.append(" entry with (");
+ for (int i = 0; i < len; i++) {
+ sb.append("{}");
+ if (i != len - 1)
+ sb.append(", ");
}
+ sb.append(')');
+ return sb.toString();
}
}
Modified: slf4j/trunk/slf4j-ext/src/test/java/org/slf4j/LoggerXTest.java
==============================================================================
--- slf4j/trunk/slf4j-ext/src/test/java/org/slf4j/LoggerXTest.java (original)
+++ slf4j/trunk/slf4j-ext/src/test/java/org/slf4j/LoggerXTest.java Sat Aug 2 21:24:58 2008
@@ -7,6 +7,7 @@
Logger logger = LoggerFactory.getLogger(this.getClass());
public void testSmoke() {
- LoggerX.entering(logger);
+ XLogger xLogger = new XLogger(logger);
+ xLogger.entry(logger);
}
}
Modified: slf4j/trunk/slf4j-site/src/site/pages/faq.html
==============================================================================
--- slf4j/trunk/slf4j-site/src/site/pages/faq.html (original)
+++ slf4j/trunk/slf4j-site/src/site/pages/faq.html Sat Aug 2 21:24:58 2008
@@ -597,8 +597,7 @@
less than 1% of the time it takes to actually log a statement.
</p>
- <p><b>Better alternative based on parameterized
- messages</b></p>
+ <p><b>Better yet, use parameterized messages</b></p>
<p>There exists a very convenient alternative based on message
formats. Assuming <code>entry</code> is an object, you can write:
@@ -642,7 +641,13 @@
<p class="source">logger.debug("Value {} was inserted between {} and {}.",
new Object[] {newVal, below, above});</p>
- <p></p>
+ <p></p>
+
+ <p>Array type arguments, including multi-dimensional arrays,
+ are also supported. However, cyclical or recursive arrays are
+ <em>not</em> suported and will result in a stack overflow
+ error.</p>
+
<p>SLF4J uses its own message formatting implementation which
differs from that of the Java platform. This is justified by
the fact that SLF4J's implementation performs several orders
Modified: slf4j/trunk/slf4j-site/src/site/pages/news.html
==============================================================================
--- slf4j/trunk/slf4j-site/src/site/pages/news.html (original)
+++ slf4j/trunk/slf4j-site/src/site/pages/news.html Sat Aug 2 21:24:58 2008
@@ -55,12 +55,16 @@
</p>
- <p>Added support for array values in parameters. For example,</p>
- <p class="source">log.debug("a:{},i:{}", "A", new int[] {1, 2}});</p>
- <p>will print as "a:A,i:[1, 2]" instead of "a:A,i:[I at 6ca1c" as
- previously. This enhancement was proposed by "lizongbo"
+ <p>Added support for array values, including multi-dimensional
+ arrays, as parameters. For example,</p>
+ <p class="source">log.debug("{} {}", "A", new int[] {1, 2}});</p>
+ <p>will print as "A [1, 2]" instead of "A [I at 6ca1c" as
+ previously. This enhancement was proposed by "lizongbo". Cyclical or
+ recursive arrays are <em>not</em> supported. Such arrays will cause
+ a stack overflow error.
</p>
+
<p>Added missing <code>getInstance</code> methods to the
<code>Category</code> class in the log4j-over-slf4j module, fixing
<a href="http://bugzilla.slf4j.org/show_bug.cgi?id=95">bug 95</a>
More information about the slf4j-dev
mailing list