It helped us so much in tracing and debugging our problems that we recommended it for other projects, where it also got rave reviews. The problem with the first method is that it can take a lot of time to step through the code, which can be done only as part of the development phase. In addition, it's difficult to get an overall view of the program execution as you only have the current state of the program at any given time. To get an overall view you have to record the values of the data as you step through the code, which is equivalent to adding debug and trace statements. The advantage of adding debug statements is that this mechanism is persistent.
Developers often use System.out.println statements to get desired values.
Though this provides some quick help to developers, it's not a good solution in the long term. If there's a problem in production, the debug statements need to be inserted again, code needs to be compiled, and the application needs to be restarted. This obviously has its drawbacks. Using a logging API solves these problems. I've used two such APIs and haven't been happy with them.