Last active
February 5, 2019 14:45
-
-
Save AlbertVilaCalvo/ae814bcc61de8205b8967feddd0d4faa to your computer and use it in GitHub Desktop.
Timber Tree for logging with Stetho in Android
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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