package droidkit.log;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import android.util.Log;
import java.io.BufferedWriter;
import java.io.PrintWriter;
import java.io.StringWriter;
import droidkit.io.IOUtils;
import droidkit.util.Dynamic;
/**
* @author Daniel Serdyukov
*/
public final class Logger {
public static void debug(@NonNull Object format, Object... args) {
Log.d(makeTag(Dynamic.getCaller()), formatMessage(format, args));
}
public static void info(@NonNull Object format, Object... args) {
Log.i(makeTag(Dynamic.getCaller()), formatMessage(format, args));
}
public static void warn(@NonNull Object format, Object... args) {
Log.w(makeTag(Dynamic.getCaller()), formatMessage(format, args));
}
public static void error(@NonNull Object format, Object... args) {
Log.e(makeTag(Dynamic.getCaller()), formatMessage(format, args));
}
public static void error(@NonNull Throwable e) {
Log.d(makeTag(Dynamic.getCaller()), formatMessage(e));
}
public static void wtf(@NonNull Object format, Object... args) {
Log.wtf(makeTag(Dynamic.getCaller()), formatMessage(format, args));
}
@NonNull
private static String formatMessage(@Nullable Object format, Object... args) {
if (format instanceof String && args.length > 0) {
return String.format((String) format, args);
}
return String.valueOf(format);
}
@NonNull
private static String formatMessage(@Nullable Throwable e) {
if (e != null) {
final StringWriter trace = new StringWriter();
final PrintWriter traceWriter = new PrintWriter(new BufferedWriter(trace, 1024), true);
try {
e.printStackTrace(traceWriter);
} finally {
IOUtils.closeQuietly(traceWriter);
}
return trace.toString();
}
return "null";
}
@NonNull
private static String makeTag(@NonNull StackTraceElement caller) {
return makeCallerName(caller) + "[" + Thread.currentThread().getName() + "]";
}
@NonNull
private static String makeCallerName(@NonNull StackTraceElement caller) {
final String className = caller.getClassName();
final int lastDot = className.lastIndexOf(".");
final StringBuilder buf = new StringBuilder(256)
.append(className.substring(lastDot + 1));
if (caller.isNativeMethod()) {
buf.append("(Native Method)");
} else {
final String fileName = caller.getFileName();
final int lineNumber = caller.getLineNumber();
if (!TextUtils.isEmpty(fileName)) {
buf.append("(").append(fileName);
if (lineNumber >= 0) {
buf.append(':');
buf.append(lineNumber);
}
buf.append(")");
} else {
buf.append("(Unknown Source)");
}
}
return buf.toString();
}
}