public final class BuildConfig {
public final static boolean DEBUG = true;
}
public class Logger {
public Logger() { }
public void v(String format, Object... args) { }
public void d(String format, Object... args) { }
public void i(String format, Object... args) { }
public void w(String format, Object... args) { }
public void w(Throwable tr, String format, Object... args) { }
public void e(String format, Object... args) { }
public void e(Throwable tr, String format, Object... args) { }
public void wtf(String format, Object... args) { }
public void wtf(Throwable tr, String format, Object... args) { }
}
public class LogManager {
public static final String Default_Tag = "TAGINFO";
private static Logger Logger;
private static HashMap<String,Logger> LoggerMap = null;
public static Logger getLogger() {
return getLogger(null);
}
public static Logger getLogger(String tag) {
if(BuildConfig.DEBUG) {
return getDebugLogger(tag);
} else {
if (Logger == null) {
Logger = new Logger();
}
return Logger;
}
}
private static Logger getDebugLogger(String tag) {
if(null == tag) tag = Default_Tag;
Logger logger;
if(null == LoggerMap) {
synchronized (LogManager.class) {
if(null == LoggerMap) LoggerMap = new HashMap<String,Logger>();
}
}
if (LoggerMap.containsKey(tag))
logger = LoggerMap.get(tag);
else {
logger = new DebugLogger(tag);
LoggerMap.put(tag, logger);
}
return logger;
}
private static class DebugLogger extends Logger {
private String tag;
private DebugLogger(String tag) {
if(null != this.tag && tag == this.tag) return;
this.tag = null == tag? LogManager.Default_Tag:tag;
}
@Override
public void v(String format, Object... args) {
Log.v(tag, buildSimpleMessage(format, args));
}
@Override
public void d(String format, Object... args) {
Log.d(tag, buildSimpleMessage(format, args));
}
@Override
public void i(String format, Object... args) {
Log.i(tag, buildSimpleMessage(format, args));
}
@Override
public void w(String format, Object... args) {
Log.w(tag, buildMessage(format, args));
}
@Override
public void w(Throwable tr, String format, Object... args) {
Log.w(tag, buildMessage(format, args), tr);
}
@Override
public void e(String format, Object... args) {
Log.e(tag, buildMessage(format, args));
}
@Override
public void e(Throwable tr, String format, Object... args) {
Log.e(tag, buildMessage(format, args), tr);
}
@Override
public void wtf(String format, Object... args) {
Log.wtf(tag, buildMessage(format, args));
}
@Override
public void wtf(Throwable tr, String format, Object... args) {
Log.wtf(tag, buildMessage(format, args), tr);
}
private String buildSimpleMessage(String format, Object... args) {
return (args == null) ? format : String.format(Locale.US, format, args);
}
private String buildMessage(String format, Object... args) {
String msg = buildSimpleMessage(format, args);
StackTraceElement[] trace = new Throwable().fillInStackTrace().getStackTrace();
String caller = "<unknown>";
for (int i = 2; i < trace.length; i++) {
Class<?> clazz = trace[i].getClass();
if (!clazz.equals(DebugLogger.class)) {
String callingClass = trace[i].getClassName();
callingClass = callingClass.substring(callingClass.lastIndexOf('.') + 1);
callingClass = callingClass.substring(callingClass.lastIndexOf('$') + 1);
caller = callingClass + "." + trace[i].getMethodName();
break;
}
}
return String.format(Locale.US, "[%d] %s: %s",
Thread.currentThread().getId(), caller, msg);
}
}
}
LogManager.getLogger().d("keyvalues: %s, keyvalues: %s",values, values);
上述中, %s 设置以字符串格式输出,keyvalues自定数据串标识,values表示和keyvalues对应的实体数据
log日志如何使用直接决定了项目开发的效率,这个和注释是一个样子的。虽然很基础的东西,但是往往都是在项目开发过程中最重要的东西。以网络请求为例,请求的接口地址,参数,返回数据,等一系列数据,通过log输出后,不需要进行UI验证,直接通过数据就验证了业务的精准性。在logcat中,以自定义的TAG为自定义过滤的TAG,直接将数据输出出来,方便开发,方便维护。并且通过这种方式,在测试阶段日志正常输出,但是一旦签名之后,即便设备root之后,通过shell采集数据,这个也一样不会输出。
敬告各位同行,研发无小事,慎重对待每一个细节。
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- oldu.cn 版权所有 浙ICP备2024123271号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务