package org.nutz.log.impl; import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.nutz.log.Log; import org.nutz.log.LogAdapter; import org.nutz.plugin.Plugin; /** * Apache log4j 适配器 * * <p/>存在<code>org.apache.log4j.Logger</code>就认为可用. * <p/>同样的,如果存在log4j-over-slf4j,则也会认为可用. * <p/>参考Issue : http://code.google.com/p/nutz/issues/detail?id=322 * <p/> * <b>Log4J 1.2.11及之前的版本不支持Trace级别,默认转为使用Debug级别来Log</b> * * @author Young(sunonfire@gmail.com) * @author wendal(wendal11985@gmail.com) */ public class Log4jLogAdapter implements LogAdapter, Plugin { public boolean canWork() { try { Class.forName("org.apache.log4j.Logger", false, Log4jLogAdapter.class.getClassLoader()); System.out.println("ALL Nutz Log via Log4jLogAdapter"); return true; } catch (Throwable e) {} return false; } public Log getLogger(String className) { return new Log4JLogger(className); } static class Log4JLogger extends AbstractLog { public static final String SUPER_FQCN = AbstractLog.class.getName(); public static final String SELF_FQCN = Log4JLogger.class.getName(); private Logger logger; private static boolean hasTrace; static { try { Level.class.getDeclaredField("TRACE"); hasTrace = true; } catch (Throwable e) {} } Log4JLogger(String className) { logger = Logger.getLogger(className); isFatalEnabled = logger.isEnabledFor(Level.FATAL); isErrorEnabled = logger.isEnabledFor(Level.ERROR); isWarnEnabled = logger.isEnabledFor(Level.WARN); isInfoEnabled = logger.isEnabledFor(Level.INFO); isDebugEnabled = logger.isEnabledFor(Level.DEBUG); if (hasTrace) isTraceEnabled = logger.isEnabledFor(Level.TRACE); } public void debug(Object message, Throwable t) { if (isDebugEnabled()) logger.log(SELF_FQCN, Level.DEBUG, message, t); } public void error(Object message, Throwable t) { if (isErrorEnabled()) logger.log(SELF_FQCN, Level.ERROR, message, t); } public void fatal(Object message, Throwable t) { if (isFatalEnabled()) logger.log(SELF_FQCN, Level.FATAL, message, t); } public void info(Object message, Throwable t) { if (isInfoEnabled()) logger.log(SELF_FQCN, Level.INFO, message, t); } public void trace(Object message, Throwable t) { if (isTraceEnabled()) logger.log(SELF_FQCN, Level.TRACE, message, t); else if ((!hasTrace) && isDebugEnabled()) logger.log(SELF_FQCN, Level.DEBUG, message, t); } public void warn(Object message, Throwable t) { if (isWarnEnabled()) logger.log(SELF_FQCN, Level.WARN, message, t); } @Override protected void log(int level, Object message, Throwable tx) { switch (level) { case LEVEL_FATAL: logger.log(SUPER_FQCN, Level.FATAL, message, tx); break; case LEVEL_ERROR: logger.log(SUPER_FQCN, Level.ERROR, message, tx); break; case LEVEL_WARN: logger.log(SUPER_FQCN, Level.WARN, message, tx); break; case LEVEL_INFO: logger.log(SUPER_FQCN, Level.INFO, message, tx); break; case LEVEL_DEBUG: logger.log(SUPER_FQCN, Level.DEBUG, message, tx); break; case LEVEL_TRACE: if (hasTrace) logger.log(SUPER_FQCN, Level.TRACE, message, tx); else logger.log(SUPER_FQCN, Level.DEBUG, message, tx); break; default: break; } } } }