Today, I’m going to share with you a handy tip for getting the most out of your Android log. I recommend that you create a wrapper class around the native Android Log class in order to:
- Have the ability to turn on or off logging.
- Have the ability to log handy things like line number, class names, and method names.
I’m going to show you a simple implementation of a Logger class that does these things:
import android.util.Log;
public class Logger
{
private static boolean LOGGING_ENABLED;
private static final int STACK_TRACE_LEVELS_UP = 5;
public static void verbose(String tag, String message)
{
if (LOGGING_ENABLED)
{
Log.v(tag, getClassNameMethodNameAndLineNumber() + message);
}
}
/**
* Get the current line number. Note, this will only work as called from
* this class as it has to go a predetermined number of steps up the stack
* trace. In this case 5.
*
* @author kvarela
* @return int - Current line number.
*/
private static int getLineNumber()
{
return Thread.currentThread().getStackTrace()[STACK_TRACE_LEVELS_UP].getLineNumber();
}
/**
* Get the current class name. Note, this will only work as called from this
* class as it has to go a predetermined number of steps up the stack trace.
* In this case 5.
*
* @author kvarela
* @return String - Current line number.
*/
private static String getClassName()
{
String fileName = Thread.currentThread().getStackTrace()[STACK_TRACE_LEVELS_UP].getFileName();
// kvarela: Removing ".java" and returning class name
return fileName.substring(0, fileName.length() - 5);
}
/**
* Get the current method name. Note, this will only work as called from
* this class as it has to go a predetermined number of steps up the stack
* trace. In this case 5.
*
* @author kvarela
* @return String - Current line number.
*/
private static String getMethodName()
{
return Thread.currentThread().getStackTrace()[STACK_TRACE_LEVELS_UP].getMethodName();
}
/**
* Returns the class name, method name, and line number from the currently
* executing log call in the form .()-
*
* @author kvarela
* @return String - String representing class name, method name, and line
* number.
*/
private static String getClassNameMethodNameAndLineNumber()
{
return "[" + getClassName() + "." + getMethodName() + "()-" + getLineNumber() + "]: ";
}
}
As you can see, this uses Thread.currentThread().getStackTrace()[] to climb up the stack trace and get the information from the proper line of code. In my case, it has to climb 5 levels up to get this information. Yours could be different depending on how many levels of abstraction you have when you call getStackTrace(). I found the easiest way is just to experiment with different numbers.