Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 11 additions & 2 deletions timber/src/main/java/timber/log/Timber.java
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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]);
}

/**
Expand Down
24 changes: 24 additions & 0 deletions timber/src/test/java/timber/log/TimberTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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 extends Throwable> T truncatedThrowable(Class<T> throwableClass) {
try {
T throwable = throwableClass.newInstance();
Expand Down Expand Up @@ -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);
}
}
}