/*
* Copyright (c) 2014-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
package com.facebook.stetho.common;
import java.io.PrintWriter;
import java.io.StringWriter;
import android.util.Log;
/**
* Logging interface which allows third party code to replace Android's {@link Log} API with
* their own implementation. Useful in public libraries so that callers can more finely control
* how log messages are produced.
* <p>
* Note that the API and implementation of this class are designed to match the semantics of
* the default system {@link Log} API.
*/
public class LogRedirector {
private static volatile Logger sLogger;
/**
* Override Android's default {@link Log} API with a custom logger interface. This affects
* all subsequent calls to {@link LogRedirector} APIs.
*/
public static void setLogger(Logger logger) {
Util.throwIfNull(logger);
Util.throwIfNotNull(sLogger);
sLogger = logger;
}
public static void e(String tag, String message, Throwable t) {
e(tag, message + "\n" + formatThrowable(t));
}
public static void e(String tag, String message) {
log(Log.ERROR, tag, message);
}
public static void w(String tag, String message, Throwable t) {
w(tag, message + "\n" + formatThrowable(t));
}
public static void w(String tag, String message) {
log(Log.WARN, tag, message);
}
public static void i(String tag, String message, Throwable t) {
i(tag, message + "\n" + formatThrowable(t));
}
public static void i(String tag, String message) {
log(Log.INFO, tag, message);
}
public static void d(String tag, String message, Throwable t) {
d(tag, message + "\n" + formatThrowable(t));
}
public static void d(String tag, String message) {
log(Log.DEBUG, tag, message);
}
public static void v(String tag, String message, Throwable t) {
v(tag, message + "\n" + formatThrowable(t));
}
public static void v(String tag, String message) {
log(Log.VERBOSE, tag, message);
}
private static String formatThrowable(Throwable t) {
StringWriter buf = new StringWriter();
PrintWriter writer = new PrintWriter(buf);
t.printStackTrace();
writer.flush();
return buf.toString();
}
private static void log(int priority, String tag, String message) {
Logger logger = sLogger;
if (logger != null) {
logger.log(priority, tag, message);
} else {
Log.println(priority, tag, message);
}
}
public static boolean isLoggable(String tag, int priority) {
Logger logger = sLogger;
if (logger != null) {
return logger.isLoggable(tag, priority);
} else {
return Log.isLoggable(tag, priority);
}
}
/**
* Custom logger implementation that can forward logs to something other than Android's
* {@link Log} API.
*/
public interface Logger {
/**
* Allows the caller to query if a particular tag and priority will be logged. Note that just
* like with {@link Log#isLoggable}, callers are required to consult this manually if the
* result is to be considered.
*/
boolean isLoggable(String tag, int priority);
/**
* Submit a log message.
*/
void log(int priority, String tag, String message);
}
}