package org.nutz.log;
import org.nutz.lang.Lang;
import org.nutz.log.impl.NopLog;
import org.nutz.plugin.SimplePluginManager;
/**
* 获取 Log 的静态工厂方法
* @author Young(sunonfire@gmail.com)
* @author zozoh(zozohtnt@gmail.com)
* @author Wendal(wendal1985@gmail.com)
*/
public final class Logs {
private static LogAdapter adapter;
static {
init();
try {
get().info("Nutz is licensed under the Apache License, Version 2.0 .\nReport bugs : https://github.com/nutzam/nutz/issues");
} catch (Throwable e) {
// just pass!!
}
}
/**
* Get a Log by Class
*
* @param clazz
* your class
* @return Log
*/
public static Log getLog(Class<?> clazz) {
return getLog(clazz.getName());
}
/**
* Get a Log by name
*
* @param className
* the name of Log
* @return Log
*/
public static Log getLog(String className) {
return adapter.getLogger(className);
}
/**
* 返回以调用者的类命名的Log,是获取Log对象最简单的方法!
*/
public static Log get() {
StackTraceElement[] sts = Thread.currentThread().getStackTrace();
if (Lang.isAndroid) {
for (int i = 0; i < sts.length; i++) {
if (sts[i].getClassName().equals(Logs.class.getName())) {
return adapter.getLogger(sts[i+1].getClassName());
}
}
}
return adapter.getLogger(sts[2].getClassName());
}
/**
* 初始化NutLog,检查全部Log的可用性,选择可用的Log适配器
* <p/>
* <b>加载本类时,该方法已经在静态构造函数中调用,用户无需主动调用.</b>
* <p/>
* <b>除非迫不得已,请不要调用本方法<b/>
* <p/>
*/
public static void init() {
try {
String packageName = Logs.class.getPackage().getName() + ".impl.";
adapter = new SimplePluginManager<LogAdapter>( packageName + "Log4jLogAdapter",
packageName + "SystemLogAdapter").get();
}
catch (Throwable e) {
//这是不应该发生的,SystemLogAdapter应该永远返回true
//唯一的可能性是所请求的org.nutz.log.impl.SystemLogAdapter根本不存在
//例如改了package
e.printStackTrace();
}
}
/**
* 开放自定义设置LogAdapter,注意,不能设置为null!! 如果你打算完全禁用Nutz的log,可以设置为NOP_ADAPTER
* @param adapter 你所偏好的LogAdapter
*/
public static void setAdapter(LogAdapter adapter) {
Logs.adapter = adapter;
}
/**
* 什么都不做的适配器,无任何输出,某些人就想完全禁用掉NutzLog,就可以用上它了
*/
public static LogAdapter NOP_ADAPTER = NopLog.NOP;
}