(From Mr Greenwell) Reduction in size of Logger implementations via some

abstraction, and inlining of LogBuilder code into doLog() so that odd trailing
log arguments can be included without borking our ability to also include a
Throwable as the final argument.


git-svn-id: https://samskivert.googlecode.com/svn/trunk@2894 6335cc39-0255-0410-8fd6-9bcaacd3b74c
This commit is contained in:
samskivert
2010-09-30 20:31:41 +00:00
parent f12cf8a04e
commit 4c622ea5c8
3 changed files with 92 additions and 60 deletions
@@ -21,6 +21,9 @@
package com.samskivert.util;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.logging.Handler;
import java.util.logging.Level;
@@ -102,7 +105,7 @@ public class JDK14Logger implements Logger.Factory
return new String[] { null, null };
}
protected static class Impl extends Logger
protected static class Impl extends Logger<Level>
{
public Impl (java.util.logging.Logger impl)
{
@@ -110,37 +113,25 @@ public class JDK14Logger implements Logger.Factory
}
@Override // from Logger
public void debug (Object message, Object... args)
protected List<Level> getLevels ()
{
if (_impl.isLoggable(Level.FINE)) {
_impl.log(Level.FINE, format(message, args), getException(message, args));
}
return LEVELS;
}
@Override // from Logger
public void info (Object message, Object... args)
protected boolean shouldLog (Level level)
{
if (_impl.isLoggable(Level.INFO)) {
_impl.log(Level.INFO, format(message, args), getException(message, args));
}
return _impl.isLoggable(level);
}
@Override // from Logger
public void warning (Object message, Object... args)
protected void doLog (Level level, String formatted, Throwable throwable)
{
if (_impl.isLoggable(Level.WARNING)) {
_impl.log(Level.WARNING, format(message, args), getException(message, args));
}
}
@Override // from Logger
public void error (Object message, Object... args)
{
if (_impl.isLoggable(Level.SEVERE)) {
_impl.log(Level.SEVERE, format(message, args), getException(message, args));
}
_impl.log(level, formatted, throwable);
}
protected java.util.logging.Logger _impl;
protected static final List<Level> LEVELS = Collections.unmodifiableList(Arrays.asList(
Level.FINE, Level.INFO, Level.WARNING, Level.SEVERE));
}
}
@@ -20,6 +20,10 @@
package com.samskivert.util;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.apache.log4j.Level;
/**
@@ -44,7 +48,7 @@ public class Log4JLogger implements Logger.Factory
return getLogger(clazz.getName());
}
protected static class Impl extends Logger
protected static class Impl extends Logger<Level>
{
public Impl (org.apache.log4j.Logger impl)
{
@@ -52,38 +56,26 @@ public class Log4JLogger implements Logger.Factory
}
@Override // from Logger
public void debug (Object message, Object... args)
protected List<Level> getLevels ()
{
if (_impl.isEnabledFor(Level.DEBUG)) {
_impl.log(_self, Level.DEBUG, format(message, args), getException(message, args));
}
return LEVELS;
}
@Override // from Logger
public void info (Object message, Object... args)
protected boolean shouldLog (Level level)
{
if (_impl.isEnabledFor(Level.INFO)) {
_impl.log(_self, Level.INFO, format(message, args), getException(message, args));
}
return _impl.isEnabledFor(level);
}
@Override // from Logger
public void warning (Object message, Object... args)
protected void doLog (Level level, String formatted, Throwable throwable)
{
if (_impl.isEnabledFor(Level.WARN)) {
_impl.log(_self, Level.WARN, format(message, args), getException(message, args));
}
}
@Override // from Logger
public void error (Object message, Object... args)
{
if (_impl.isEnabledFor(Level.ERROR)) {
_impl.log(_self, Level.ERROR, format(message, args), getException(message, args));
}
_impl.log(_self, level, formatted, throwable);
}
protected final org.apache.log4j.Logger _impl;
protected final String _self = getClass().getName();
protected static final List<Level> LEVELS = Collections.unmodifiableList(Arrays.asList(
Level.DEBUG, Level.INFO, Level.WARN, Level.ERROR));
}
}
+67 -18
View File
@@ -20,6 +20,8 @@
package com.samskivert.util;
import java.util.List;
/**
* Provides logging services to this library and others which depend on this library in such a way
* that they can be used in a larger project and easily be made to log to the logging framework in
@@ -37,7 +39,7 @@ package com.samskivert.util;
* <p> The final parameter can optionally be a Throwable, which will be supplied to the underlying
* log system as an exception to accompany the log message.
*/
public abstract class Logger
public abstract class Logger<L>
{
/**
* Used to create logger instances. This is only public so that the log factory can be
@@ -94,7 +96,10 @@ public abstract class Logger
* @param message the message to be logged.
* @param args a list of key/value pairs and an optional final Throwable.
*/
public abstract void debug (Object message, Object... args);
public void debug (Object message, Object... args)
{
doLog(0, message, args);
}
/**
* Logs an info message.
@@ -102,7 +107,10 @@ public abstract class Logger
* @param message the message to be logged.
* @param args a list of key/value pairs and an optional final Throwable.
*/
public abstract void info (Object message, Object... args);
public void info (Object message, Object... args)
{
doLog(1, message, args);
}
/**
* Logs a warning message.
@@ -110,7 +118,10 @@ public abstract class Logger
* @param message the message to be logged.
* @param args a list of key/value pairs and an optional final Throwable.
*/
public abstract void warning (Object message, Object... args);
public void warning (Object message, Object... args)
{
doLog(2, message, args);
}
/**
* Logs an error message.
@@ -118,23 +129,61 @@ public abstract class Logger
* @param message the message to be logged.
* @param args a list of key/value pairs and an optional final Throwable.
*/
public abstract void error (Object message, Object... args);
/**
* Extracts the exception from the message and arguments (if there is one). For use by logger
* implementations.
*/
protected Throwable getException (Object message, Object[] args)
public void error (Object message, Object... args)
{
if (message instanceof Throwable) {
return (Throwable)message;
} else if (args.length % 2 == 1 && args[args.length-1] instanceof Throwable) {
return (Throwable)args[args.length-1];
} else {
return null;
}
doLog(3, message, args);
}
protected void doLog (int levIdx, Object message, Object[] args)
{
L level = getLevels().get(levIdx);
if (!shouldLog(level)) {
return;
}
Throwable err = null;
int nn = args.length;
if (message instanceof Throwable) {
err = (Throwable)message;
} else if (nn % 2 == 1 && (args[nn - 1] instanceof Throwable)) {
err = (Throwable)args[--nn];
}
String msg = String.valueOf(message);
if (nn > 0) {
StringBuilder buf = new StringBuilder(msg);
if (msg.length() > 0) {
buf.append(' ');
}
buf.append('[');
for (int ii = 0; ii < nn; ii += 2) {
if (ii > 0) {
buf.append(',').append(' ');
}
buf.append(args[ii]).append('=');
try {
Object arg = args[ii + 1];
buf.append(((arg == null) || !arg.getClass().isArray())
? arg
: LogBuilder.arrayStr(arg));
} catch (Throwable t) {
buf.append("<toString() failure: ").append(t).append(">");
}
}
msg = buf.append(']').toString();
}
doLog(level, msg, err);
}
/** Returns the logger implementation specific level constants in a specific order: debug,
* info, warn, error. */
protected abstract List<L> getLevels ();
/** Returns true if a log message at the specified level should be logged. */
protected abstract boolean shouldLog (L level);
/** Performs the actual logging of a message at the specified level.
* @param throwable an exception that accompanies this message or null. */
protected abstract void doLog (L level, String formatted, Throwable throwable);
/**
* Called at static initialization time. Selects and initializes our logging backend.
*/