diff --git a/app/src/main/java/com/tonytangandroid/wood/sample/App.java b/app/src/main/java/com/tonytangandroid/wood/sample/App.java index 4bd3209..4a9c74c 100644 --- a/app/src/main/java/com/tonytangandroid/wood/sample/App.java +++ b/app/src/main/java/com/tonytangandroid/wood/sample/App.java @@ -1,5 +1,7 @@ package com.tonytangandroid.wood.sample; +import static com.tonytangandroid.wood.sample.HomeActivity.logInBackground; + import android.app.Application; public class App extends Application { @@ -8,5 +10,6 @@ public class App extends Application { public void onCreate() { super.onCreate(); WoodIntegrationUtil.initWood(this); + logInBackground(); } } diff --git a/app/src/main/java/com/tonytangandroid/wood/sample/HomeActivity.java b/app/src/main/java/com/tonytangandroid/wood/sample/HomeActivity.java index 449e709..57bab93 100644 --- a/app/src/main/java/com/tonytangandroid/wood/sample/HomeActivity.java +++ b/app/src/main/java/com/tonytangandroid/wood/sample/HomeActivity.java @@ -60,6 +60,10 @@ private void generateTimberLog() { logError(); } + public static void logInBackground() { + new Thread(() -> Timber.i("This is an INFO message triggered in background thread.")).start(); + } + private void logError() { try { String shortSrc = ""; diff --git a/app/src/main/java/com/tonytangandroid/wood/sample/WoodIntegrationUtil.kt b/app/src/main/java/com/tonytangandroid/wood/sample/WoodIntegrationUtil.kt index 2f2ca8c..5cbddc8 100644 --- a/app/src/main/java/com/tonytangandroid/wood/sample/WoodIntegrationUtil.kt +++ b/app/src/main/java/com/tonytangandroid/wood/sample/WoodIntegrationUtil.kt @@ -10,7 +10,7 @@ object WoodIntegrationUtil { @JvmStatic fun initWood(application: Application) { Timber.plant( - WoodTree(application) + WoodTree(application,"tony") .retainDataFor(WoodTree.Period.FOREVER) .logLevel(Log.VERBOSE) .autoScroll(false) diff --git a/wood-no-op/src/main/java/com/tonytangandroid/wood/WoodTree.java b/wood-no-op/src/main/java/com/tonytangandroid/wood/WoodTree.java index 7ccb32c..0044282 100644 --- a/wood-no-op/src/main/java/com/tonytangandroid/wood/WoodTree.java +++ b/wood-no-op/src/main/java/com/tonytangandroid/wood/WoodTree.java @@ -10,6 +10,8 @@ public class WoodTree extends Timber.Tree { public WoodTree(Context context) {} + public WoodTree(Context context, String threadTagPrefix) {} + public WoodTree showNotification(boolean sticky) { return this; } diff --git a/wood/src/main/java/com/tonytangandroid/wood/WoodTree.java b/wood/src/main/java/com/tonytangandroid/wood/WoodTree.java index c08bf41..b2203fa 100644 --- a/wood/src/main/java/com/tonytangandroid/wood/WoodTree.java +++ b/wood/src/main/java/com/tonytangandroid/wood/WoodTree.java @@ -9,6 +9,7 @@ import java.io.StringWriter; import java.util.ArrayList; import java.util.List; +import java.util.Locale; import java.util.concurrent.Executor; import timber.log.Timber; @@ -20,6 +21,7 @@ public class WoodTree extends Timber.DebugTree { @NonNull private final Context context; @NonNull private final WoodDatabase woodDatabase; private final Executor executor; + private final String threadTagPrefix; @Nullable private NotificationHelper notificationHelper; @NonNull private RetentionManager retentionManager; private int maxContentLength = 250000; @@ -30,11 +32,20 @@ public class WoodTree extends Timber.DebugTree { /** @param context The current Context. */ public WoodTree(@NonNull Context context) { - executor = new JobExecutor(); + this(context, ""); + } + + /** + * @param context context + * @param threadTagPrefix the extra prefix added on the logged message. + */ + public WoodTree(@NonNull Context context, String threadTagPrefix) { + this.threadTagPrefix = threadTagPrefix; + this.executor = new JobExecutor(); this.context = context.getApplicationContext(); - woodDatabase = WoodDatabase.getInstance(context); - retentionManager = new RetentionManager(this.context, DEFAULT_RETENTION); - sharedPreferences = context.getSharedPreferences(PREF_WOOD_CONFIG, Context.MODE_PRIVATE); + this.woodDatabase = WoodDatabase.getInstance(context); + this.retentionManager = new RetentionManager(this.context, DEFAULT_RETENTION); + this.sharedPreferences = context.getSharedPreferences(PREF_WOOD_CONFIG, Context.MODE_PRIVATE); } public static boolean autoScroll(Context context) { @@ -117,16 +128,16 @@ public WoodTree maxLength(int max) { protected void log( final int priority, final String tag, final @NonNull String message, final Throwable t) { if (shouldBeLogged(priority, tag)) { - executor.execute( - new Runnable() { - @Override - public void run() { - doLog(priority, tag, message, t); - } - }); + String assembledMessage = formatThreadTag(message, this.threadTagPrefix); + executor.execute(() -> doLog(priority, tag, assembledMessage, t)); } } + private static String formatThreadTag(String message, String threadTagPrefix) { + return String.format( + Locale.US, "[%s#%s]:%s", threadTagPrefix, Thread.currentThread().getName(), message); + } + private boolean shouldBeLogged(int priority, String tag) { if (priority < logLevel) { return false; @@ -188,6 +199,7 @@ public enum Period { /** From https://stackoverflow.com/a/1149712/4068957 */ static class ErrorUtil { + public static String asString(Throwable throwable) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw);