package li.util;
import java.lang.reflect.Method;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* 日志工具类,自动适配Log4j或Console
*
* @author li (limingwei@mail.com)
* @version 0.1.6 (2012-07-05)
*/
public abstract class Log2 {
private static final String FATAL = "FATAL", ERROR = "ERROR", WARN = "WARN", INFO = "INFO", DEBUG = "DEBUG", TRACE = "TRACE";
/**
* 一个缓存,可用于暂时保存一个值
*/
private static final Map<Object, Object> LOG_MAP = new ConcurrentHashMap<Object, Object>();
/**
* 向LOG_MAP中设值
*/
public static void put(Object key, Object value) {
LOG_MAP.put(key, value);
}
/**
* 从LOG_MAP中取值
*/
public static Object get(Object key) {
return LOG_MAP.get(key);
}
/**
* Log初始化方法,自动适配Log4j或Console
*/
public static Log2 init(final Class<?> type) {
try {
final Method method = Reflect.getMethod(Reflect.getType("org.apache.log4j.Logger"), "log", new Class[] { Reflect.getType("org.apache.log4j.Priority"), Object.class });
final Map priorities = Convert.toMap(FATAL, Reflect.getStatic("org.apache.log4j.Priority", FATAL),//
ERROR, Reflect.getStatic("org.apache.log4j.Priority", ERROR),//
WARN, Reflect.getStatic("org.apache.log4j.Priority", WARN),//
INFO, Reflect.getStatic("org.apache.log4j.Priority", INFO),//
DEBUG, Reflect.getStatic("org.apache.log4j.Priority", DEBUG), //
TRACE, Reflect.getStatic("org.apache.log4j.Priority", DEBUG));
return new Log2() {// 尝试初始化Log4J
Object logger = Reflect.call("org.apache.log4j.Logger", "getLogger", new Class[] { Class.class }, new Object[] { type });
protected void log(String priority, Object msg) {
Reflect.invoke(logger, method, priorities.get(priority), msg);
}
};
} catch (Throwable e) {
return new Log2() {// 返回ConsoleLog
protected void log(String method, Object msg) {
((method.equals(ERROR) || method.equals(FATAL)) ? System.err : System.out).println(method.toUpperCase() + ": " + msg);
}
};
}
}
/**
* 根据类名初始化Log
*/
public static Log2 init(String className) {
return init(Reflect.getType(className));
}
/**
* 初始化Log最简单的方法,会自动获取调用者的类型
*/
public static Log2 init() {
return init(Thread.currentThread().getStackTrace()[2].getClassName());
}
/**
* 抽象方法,由不同的Log做具体的适配
*/
protected abstract void log(String method, Object msg);
/**
* 处理log信息
*/
private static String process(Object msg, Object... args) {
if (null == args || args.length < 1) {
return msg + "";
}
StringBuffer stringBuffer = new StringBuffer();
char[] chars = null == msg ? new char[0] : msg.toString().toCharArray();
int arg_index = 0;
for (int i = 0; i < chars.length; i++) {
stringBuffer.append((arg_index < args.length && chars[i] == '?') ? args[arg_index++] : chars[i]);
}
return stringBuffer.toString();
}
/**
* 输出TRACE级别的日志 Level 1
*/
public void trace(Object msg, Object... args) {
log(TRACE, process(msg, args));
}
/**
* 输出DEBUG级别的日志 Level 2
*/
public void debug(Object msg, Object... args) {
log(DEBUG, process(msg, args));
}
/**
* 输出INFO级别的日志 Level 3
*/
public void info(Object msg, Object... args) {
log(INFO, process(msg, args));
}
/**
* 输出WARN级别的日志 Level 4
*/
public void warn(Object msg, Object... args) {
log(WARN, process(msg, args));
}
/**
* 输出ERROR级别的日志 Level 5
*/
public void error(Object msg, Object... args) {
log(ERROR, process(msg, args));
}
/**
* 输出FATAL级别的日志 Level 6
*/
public void fatal(Object msg, Object... args) {
log(FATAL, process(msg, args));
}
}