diff --git a/timber/src/main/java/timber/log/Timber.java b/timber/src/main/java/timber/log/Timber.java index da5b98adc..db01ffa6c 100644 --- a/timber/src/main/java/timber/log/Timber.java +++ b/timber/src/main/java/timber/log/Timber.java @@ -590,6 +590,14 @@ protected String createStackElementTag(@NotNull StackTraceElement element) { return tag.substring(0, MAX_TAG_LENGTH); } + /** + * Define how deep the desired tag will be in the call stack. 5 by default, but may need to + * be overridden if you're wrapping Timber or something. + */ + protected int getTagDepth() { + return CALL_STACK_INDEX; + } + @Override final String getTag() { String tag = super.getTag(); if (tag != null) { @@ -599,11 +607,12 @@ protected String createStackElementTag(@NotNull StackTraceElement element) { // 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. StackTraceElement[] stackTrace = new Throwable().getStackTrace(); - if (stackTrace.length <= CALL_STACK_INDEX) { + final int callStackIndex = getTagDepth(); + if (stackTrace.length <= callStackIndex) { throw new IllegalStateException( "Synthetic stacktrace didn't have enough elements: are you using proguard?"); } - return createStackElementTag(stackTrace[CALL_STACK_INDEX]); + return createStackElementTag(stackTrace[callStackIndex]); } /** diff --git a/timber/src/test/java/timber/log/TimberTest.java b/timber/src/test/java/timber/log/TimberTest.java index 78dd41118..198f2a895 100644 --- a/timber/src/test/java/timber/log/TimberTest.java +++ b/timber/src/test/java/timber/log/TimberTest.java @@ -509,6 +509,23 @@ protected String formatMessage(@NotNull String message, @NotNull Object[] args) .hasNoMoreMessages(); } + @Test public void overrideTagDepth() { + final String expectedTag = TimberTest.class.getSimpleName(); + final String testMessage = "Test message"; + + Timber.plant(new Timber.DebugTree() { + @Override + protected int getTagDepth() { + return super.getTagDepth() + 1; + } + }); + TimberWrapper.v(testMessage); + + assertLog() + .hasVerboseMessage(expectedTag, testMessage) + .hasNoMoreMessages(); + } + private static T truncatedThrowable(Class throwableClass) { try { T throwable = throwableClass.newInstance(); @@ -596,4 +613,11 @@ public void hasNoMoreMessages() { assertThat(items).hasSize(index); } } + + private static final class TimberWrapper { + + public static void v(String message, Object... args) { + Timber.v(message, args); + } + } }