Nutz是个不错的轻量级框架,小巧易用,不了解到同学可以见http://code.google.com/p/nutz/
不过Nutz中的日志默认依赖Log4J,内部的日志信息都会依赖Log4J,对于我这样喜欢用SLF4J来说实在是不爽。
好吧自己动手改造一下,好在Nutz的日志设计的不错,改一下不难。
先在org.nutz.log.impl包下加一个SLF4JLogAdapter的类:
public class SLF4JLogAdapter implements LogAdapter, Plugin {
public Log getLogger(String className) {
return new SLF4JLogger(className);
}
public boolean canWork() {
try {
Class.forName("org.slf4j.Logger", false, Thread.currentThread().getContextClassLoader());
return true;
}
catch (Throwable e) {}
return false;
}
static class SLF4JLogger extends AbstractLog {
private Logger logger;
SLF4JLogger(String className) {
logger = LoggerFactory.getLogger(className);
isErrorEnabled = logger.isErrorEnabled();
isWarnEnabled = logger.isWarnEnabled();
isInfoEnabled = logger.isInfoEnabled();
isDebugEnabled = logger.isDebugEnabled();
isTraceEnabled = logger.isTraceEnabled();
}
public void debug(Object message, Throwable t) {
if (isDebugEnabled())
logger.debug((String)message, t);
}
public void error(Object message, Throwable t) {
if (isErrorEnabled())
logger.error((String)message, t);
}
public void fatal(Object message, Throwable t) {
if (isFatalEnabled())
logger.error((String)message, t);
}
public void info(Object message, Throwable t) {
if (isInfoEnabled())
logger.info((String)message, t);
}
public void trace(Object message, Throwable t) {
if (isTraceEnabled())
logger.trace((String)message, t);
}
public void warn(Object message, Throwable t) {
if (isWarnEnabled())
logger.warn((String)message, t);
}
@Override
protected void log(int level, Object message, Throwable tx) {
switch (level) {
case LEVEL_FATAL:
logger.error((String)message, tx);
break;
case LEVEL_ERROR:
logger.error((String)message, tx);
break;
case LEVEL_WARN:
logger.warn((String)message, tx);
break;
case LEVEL_INFO:
logger.info((String)message, tx);
break;
case LEVEL_DEBUG:
logger.debug((String)message, tx);
break;
case LEVEL_TRACE:
logger.trace((String)message, tx);
break;
default:
break;
}
}
}
}
然后改一下org.nutz.log.Logs这个工厂类的init方法:
public static void init() {
try {
adapter = new SimplePluginManager<LogAdapter>( "org.nutz.log.impl.SLF4JLogAdapter").get();
}
catch (Throwable e) {
e.printStackTrace();
}
}
OK完成了~~
注意SLF4J只是个日志接口,还需要特定的实现,推荐使用logback,详细见另一个帖子
================================================================
后记:
我在Nutz上已提了issue,但是Nutz作者表示不会内置支持SLF4J,要用的话可以通过log4j-over-slf4j.jar转换来实现。
但是我个人不喜欢这种方式,一是需要多依赖jar包,另外总觉得别扭~~