Skip to content

Instantly share code, notes, and snippets.

@AlbertVilaCalvo
Last active February 5, 2019 14:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save AlbertVilaCalvo/ae814bcc61de8205b8967feddd0d4faa to your computer and use it in GitHub Desktop.
Save AlbertVilaCalvo/ae814bcc61de8205b8967feddd0d4faa to your computer and use it in GitHub Desktop.
Timber Tree for logging with Stetho in Android
// Add the dependencies in app/build.gradle:
compile 'com.facebook.stetho:stetho:1.4.2'
compile 'com.facebook.stetho:stetho-okhttp3:1.4.2'
// Initialize Stetho and plant the StethoDebugTree in Application onCreate():
if (BuildConfig.DEBUG) {
Stetho.initializeWithDefaults(this);
Timber.plant(new StethoDebugTree());
}
// Set the Interceptor for OkHttp:
OkHttpClient.Builder builder = new OkHttpClient.Builder();
if (BuildConfig.DEBUG) {
builder.networkInterceptors().add(new StethoInterceptor());
}
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://api.themoviedb.org/3/")
.client(builder.build())
.addConverterFactory(GsonConverterFactory.create())
.build();
// Add file StethoDebugTree.java:
package com.example.utils;
import android.util.Log;
import com.facebook.stetho.inspector.console.ConsolePeerManager;
import com.facebook.stetho.inspector.helper.ChromePeerManager;
import com.facebook.stetho.inspector.protocol.module.Console;
import cat.tmb.tdo.ocimobilepos.BuildConfig;
import timber.log.Timber;
/**
* Combination of Timber.DebugTree and StethoTree that:
* (1) Avoids duplicate logs to logcat.
* (2) Adds the line number to the logs that Timber.DebugTree sends to logcat.
* (3) Adds the class name and line number to the logs that StethoTree sends to Chrome.
* <p></p>
*
* You can find Timber.DebugTree and StethoTree here:
* https://github.com/JakeWharton/timber/blob/master/timber/src/main/java/timber/log/Timber.java
* https://github.com/facebook/stetho/blob/master/stetho-timber/src/main/java/com/facebook/stetho/timber/StethoTree.java
* <p></p>
*
* To use it add this to your Application#onCreate():
* <pre>
* {@code
* if (BuildConfig.DEBUG) {
* Stetho.initializeWithDefaults(this);
* Timber.plant(new StethoDebugTree())
* }
* }
* </pre>
*
* Created by Albert Vila Calvo on 9/12/16.
*/
public class StethoDebugTree extends Timber.DebugTree {
@Override
protected String createStackElementTag(StackTraceElement element) {
return super.createStackElementTag(element) + "(" + element.getLineNumber() +")";
}
@Override
protected void log(int priority, String tag, String message, Throwable t) {
if (!BuildConfig.DEBUG) {
Log.d("StethoDebugTree", "You are logging in non-debug builds");
}
// This logs to logcat.
super.log(priority, tag, message, t);
// This logs to Chrome.
// The following code is copied from
// https://github.com/facebook/stetho/blob/master/stetho-timber/src/main/java/com/facebook/stetho/timber/StethoTree.java
// but we use CLogCustom to avoid logging to logcat again, and we add the tag so that we print the
// class name and line number.
ConsolePeerManager peerManager = ConsolePeerManager.getInstanceOrNull();
if (peerManager == null) {
return;
}
Console.MessageLevel logLevel;
switch (priority) {
case Log.VERBOSE:
case Log.DEBUG:
logLevel = Console.MessageLevel.DEBUG;
break;
case Log.INFO:
logLevel = Console.MessageLevel.LOG;
break;
case Log.WARN:
logLevel = Console.MessageLevel.WARNING;
break;
case Log.ERROR:
case Log.ASSERT:
logLevel = Console.MessageLevel.ERROR;
break;
default:
logLevel = Console.MessageLevel.LOG;
}
CLogCustom.writeToConsole(
logLevel,
Console.MessageSource.OTHER,
tag + ": " + message
);
}
/**
* Copy-paste of:
* https://github.com/facebook/stetho/blob/master/stetho/src/main/java/com/facebook/stetho/inspector/console/CLog.java
* But removing the line:
* LogRedirector.d(TAG, messageText);
* Which avoids logging to logcat.
*/
private static class CLogCustom {
static void writeToConsole(
ChromePeerManager chromePeerManager,
Console.MessageLevel logLevel,
Console.MessageSource messageSource,
String messageText) {
Console.ConsoleMessage message = new Console.ConsoleMessage();
message.source = messageSource;
message.level = logLevel;
message.text = messageText;
Console.MessageAddedRequest messageAddedRequest = new Console.MessageAddedRequest();
messageAddedRequest.message = message;
chromePeerManager.sendNotificationToPeers("Console.messageAdded", messageAddedRequest);
}
static void writeToConsole(
Console.MessageLevel logLevel,
Console.MessageSource messageSource,
String messageText
) {
ConsolePeerManager peerManager = ConsolePeerManager.getInstanceOrNull();
if (peerManager == null) {
return;
}
writeToConsole(peerManager, logLevel, messageSource, messageText);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment