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包,另外总觉得别扭~~