diff --git a/timber/src/main/java/timber/log/Timber.java b/timber/src/main/java/timber/log/Timber.java index a927276b5..4c0d468e5 100644 --- a/timber/src/main/java/timber/log/Timber.java +++ b/timber/src/main/java/timber/log/Timber.java @@ -403,10 +403,20 @@ String getTag() { String tag = explicitTag.get(); if (tag != null) { explicitTag.remove(); + } else { + tag = getDefaultTag(); } return tag; } + /** + * If no tag is explicitly set, then the tree will fall back to this tag. + * @return The default tag for this tree + */ + @Nullable protected String getDefaultTag() { + return null; + } + /** Log a verbose message with optional format args. */ public void v(String message, Object... args) { prepareLog(Log.VERBOSE, null, message, args); @@ -587,7 +597,7 @@ protected abstract void log(int priority, @Nullable String tag, @NotNull String public static class DebugTree extends Tree { private static final int MAX_LOG_LENGTH = 4000; private static final int MAX_TAG_LENGTH = 23; - private static final int CALL_STACK_INDEX = 5; + private static final int CALL_STACK_INDEX = 6; private static final Pattern ANONYMOUS_CLASS = Pattern.compile("(\\$\\d+)+$"); /** @@ -612,11 +622,7 @@ protected String createStackElementTag(@NotNull StackTraceElement element) { return tag.substring(0, MAX_TAG_LENGTH); } - @Override final String getTag() { - String tag = super.getTag(); - if (tag != null) { - return tag; - } + @Override protected String getDefaultTag() { // DO NOT switch this to Thread.getCurrentThread().getStackTrace(). The test will pass // because Robolectric runs them on the JVM but on Android the elements are different. diff --git a/timber/src/test/java/timber/log/TimberTest.java b/timber/src/test/java/timber/log/TimberTest.java index df509f281..fbb0b666e 100644 --- a/timber/src/test/java/timber/log/TimberTest.java +++ b/timber/src/test/java/timber/log/TimberTest.java @@ -502,11 +502,55 @@ protected String formatMessage(@NotNull String message, @NotNull Object[] args) .hasDebugMessage("TimberTest", "Test formatting: Test message logged. 100"); } + + @Test public void logsWithCustomTag() { + Timber.plant(new Timber.DebugTree() { + @Override + protected String getDefaultTag() { + return "CUSTOMTAG"; + } + }); + + Timber.d("Test with custom tag"); + assertLog().hasDebugMessage("CUSTOMTAG", "Test with custom tag"); + + } + + @Test public void logsWithCustomTagOverridden() { + Timber.plant(new Timber.DebugTree() { + @Override protected String getDefaultTag() { + return "CUSTOMTAG"; + } + }); + + Timber.tag("NewTag").d("Tag manually set"); + + assertLog().hasDebugMessage("NewTag", "Tag manually set"); + } + + @Test public void logsWithMultipleTreesMultipleTags() { + Timber.plant(new Timber.DebugTree() { + @Override protected String getDefaultTag() { + return "CUSTOMTAG"; + } + }); + + Timber.plant(new Timber.DebugTree() { + @Override protected String getDefaultTag() { + return "DIFFERENTTAG"; + } + }); + + Timber.d("multiple tags"); + + assertLog().hasDebugMessage("CUSTOMTAG", "multiple tags") + .hasDebugMessage("DIFFERENTTAG", "multiple tags"); + } + @Test public void nullArgumentObjectArray() { Timber.plant(new Timber.DebugTree()); Timber.v("Test", (Object[]) null); - assertLog() - .hasVerboseMessage("TimberTest", "Test") + assertLog().hasVerboseMessage("TimberTest", "Test") .hasNoMoreMessages(); }