I was wondering around in a huge code base trying to figure out whats going on.
I wouldn’t say it was a bad code base, but it was done by a single geeky programmer who never cared about the readability because I guess he never thought anyone else would ever try to read it. Anyway, I could see all these meaningful log messages coming out from it but I didn’t know from where. I think he never heard of log4j or anything like that but luckily he used a class like this:
public class LogHelper{ public static void log(String log){ System.out.println(log); } }
and used it like this:
public class X { public void doA() { Logger.log("doing A"); //.. //.. Logger.log("done doing A"); } public void doB() { Logger.log("doing B"); // // Logger.log("done doing B"); } }
So he called this static log method from all over the code base to do the logging.
And the log looked like this:
doing A doing B done doing B done doing A
I desperately wanted to know which class/method/line was calling this method like I am used to in log4j.
Then I thought the calling Thread has this information. The question is how can I get it! After playing a bit with stack information, I came up with this:
public static String getCallingMethodInfo() { StackTraceElement[] stackTrace ; try{ throw new Exception(); } catch (Exception e) { stackTrace = e.getStackTrace(); } if(stackTrace != null && stackTrace.length >= 2) { StackTraceElement s = stackTrace[2]; if(s != null) { return s.getClassName() + ".(" + s.getMethodName() +"):["+ s.getLineNumber() + "] -:"; } } return null; }
So finally the log method looked like this:
public class LogHelper { public static void log(String log){ String caller = getCallingMethodInfo(); System.out.println(caller + ": " + log); } }
So, finally the logs looked like this:
X.(doA):[5]-: doing A X.(doB):[14]-: doing B X.(doA):[9]-: done doing A X.(doB):[18]-: done doing B
In jdk 1.5 you can actually get the stack information like this:
Thread.currentThread().getStackTrace()
but unfortunately I was working with a 1.4 codebase. But Throwing an exception and catching it back did the trick 🙂
Having said all that, It will be an insane idea to put this code to production. But can be very helpful when you are trying to understand the code.