NLS in Logger (Re: [slf4j-dev] Logger.debug(String, Object[])?)
Niclas Hedhman
niclas at hedhman.org
Sat Aug 6 06:39:19 CEST 2005
On Saturday 06 August 2005 05:02, Joerg Hohwiller wrote:
> Anyways if you make it this way: the syntax with "{}" for me looks like
> you are NOT using java.text.MessageFormat. Why is that? You do not need
> to reinvent the wheel here. But maybe I am missing something.
When I asked about this earlier, I was informed it was due to performance
reasons.
On Saturday 06 August 2005 06:07, Curt Arnold wrote:
> I agree that the number of methods and code duplication is
> undesirable. Maybe it would be better to isolate all the formatting
> variants into a single concrete LogFormat class and have the Logger
> interface only supply the most basic of the log methods that the
> actual implementation would need to provide. Something like:
>
> // direct use of org.slf4j.Logger
> logger.debug("Hello, world");
>
> or
>
> LogFormat.debug(logger, "Hello, {}.", location);
>
> which could be implemented:
>
> public static void debug(Logger logger, String format, Object param1) {
> if (logger.isDebugEnabled()) {
> logger.debug(MessageFormat.format(format, param1));
> }
> }
Another neutral observation is that the "format" is only part of the total
format, as additional format information is associated with the "destination"
(Log4J lingo --> Appender).
The utility method you are suggesting, is in fact a kind of facade, and we are
in the "Simple Logging Facade for Java" project. The name seems to suggest a
single facade, but I am somewhat inclined to believe that a multi-tier
approach (I think originally suggested by Greg) is probably better.
That means that several interfaces are available, for different needs and the
challenge is about a Factory that can create what I need. I think that a
*culture* of several but simpler interfaces will foster more invention,
adaption and 'cheaper' evolution.
public interface PrimordialLogger
{
boolean isEnabled();
void log( Object[] data );
// effectively the only interface needed, seen from a pure
//computing point of view.
}
public interface TraditionalLogger
{
// Full set according to Ceki's evolutionary path.
// Markers, many method signatures, i.e a heavy interface.
}
public interface SimpleIoCLogger
{
String getName();
String getChildLogger( String childname );
boolean isDebugEnabled();
void debug( String message );
boolean isInfoEnabled();
void info( String message );
boolean isWarningEnabled();
void warn( String message );
void warn( String message, Throwable e );
boolean isErrorEnabled();
void error( String message );
void error( String message, Throwable e );
}
The ILoggerFactory need to be instructed what type to return, so either the
above interfaces need a supertype, or the factory returns a Object (IMHO,
same thing, since cast is unavoidable).
public interface ILoggerFactory
{
Object getLogger( String name, Class type );
// Convenience method;
// return (TraditionalLogger) getLogger( name, TraditionalLogger.class );
TraditionalLogger getLogger( String name );
}
I this train of thought has any bearing, then the next step is to work out an
SPI that is usable, but I'll leave that for later.
Cheers
Niclas
More information about the slf4j-dev
mailing list