package org.nutz.log.impl; import java.util.Arrays; import org.nutz.log.Log; public abstract class AbstractLog implements Log { protected boolean isFatalEnabled = true; protected boolean isErrorEnabled = true; protected boolean isWarnEnabled = true; protected boolean isInfoEnabled = false; protected boolean isDebugEnabled = false; protected boolean isTraceEnabled = false; protected static final int LEVEL_FATAL = 50; protected static final int LEVEL_ERROR = 40; protected static final int LEVEL_WARN = 30; protected static final int LEVEL_INFO = 20; protected static final int LEVEL_DEBUG = 10; protected static final int LEVEL_TRACE = 0; protected abstract void log(int level, Object message, Throwable tx); protected void log(int level, LogInfo info){ log(level, info.message, info.e); } private static final LogInfo LOGINFO_ERROR = new LogInfo(); private static final LogInfo LOGINFO_NULL = new LogInfo(); static{ LOGINFO_ERROR.message = "!!!!Log Fail!!"; LOGINFO_NULL.message = "null"; } /** * 产生一个LogInfo对象,以支持以下调用方式: * <p/><code>log.warn(e)</code> * <p/><code>log.warnf("User(name=%s) login fail",username,e)</code> */ private LogInfo makeInfo(Object obj, Object... args) { if (obj == null) return LOGINFO_NULL; try { LogInfo info = new LogInfo(); if (obj instanceof Throwable) { info.e = (Throwable)obj; info.message = info.e.getMessage(); } else if (args == null || args.length == 0) { info.message = obj.toString(); } // //map to another mehtod // else if (args.length == 1 && args[0] instanceof Throwable) { // info.message = obj.toString(); // info.e = (Throwable)args[0]; // } else { info.message = String.format(obj.toString(), args); if (args[args.length - 1] instanceof Throwable) info.e = (Throwable) args[args.length - 1]; } return info; } catch (Throwable e) { //即使格式错误也继续log if (isWarnEnabled()) warn("String format fail in log , fmt = "+ obj + " , args = " +Arrays.toString(args),e); return LOGINFO_ERROR; } } public void debug(Object message) { if (isDebugEnabled()) log(LEVEL_DEBUG, makeInfo(message)); } public void debugf(String fmt, Object... args) { if (isDebugEnabled()) log(LEVEL_DEBUG, makeInfo(fmt, args)); } public void error(Object message) { if (isErrorEnabled()) log(LEVEL_ERROR, makeInfo(message)); } public void errorf(String fmt, Object... args) { if (isErrorEnabled()) log(LEVEL_ERROR, makeInfo(fmt, args)); } public void fatal(Object message) { if (isFatalEnabled()) log(LEVEL_FATAL, makeInfo(message)); } public void fatalf(String fmt, Object... args) { if (isFatalEnabled()) log(LEVEL_FATAL, makeInfo(fmt, args)); } public void info(Object message) { if (isInfoEnabled()) log(LEVEL_INFO, makeInfo(message)); } public void infof(String fmt, Object... args) { if (isInfoEnabled()) log(LEVEL_INFO, makeInfo(fmt, args)); } public void trace(Object message) { if (isTraceEnabled()) log(LEVEL_TRACE, makeInfo(message)); } public void tracef(String fmt, Object... args) { if (isTraceEnabled()) log(LEVEL_TRACE, makeInfo(fmt, args)); } public void warn(Object message) { if (isWarnEnabled()) log(LEVEL_WARN, makeInfo(message)); } public void warnf(String fmt, Object... args) { if (isWarnEnabled()) log(LEVEL_WARN, makeInfo(fmt, args)); } public boolean isDebugEnabled() { return isDebugEnabled; } public boolean isErrorEnabled() { return isErrorEnabled; } public boolean isFatalEnabled() { return isFatalEnabled; } public boolean isInfoEnabled() { return isInfoEnabled; } public boolean isTraceEnabled() { return isTraceEnabled; } public boolean isWarnEnabled() { return isWarnEnabled; } protected String tag = ""; public Log setTag(String tag) { this.tag = tag; return this; } }