It depends on the situation. In some cases, log debugging is
much more productive. Sometimes, one want to set a breakpoint
somewhere and examine data in a way not easily done by logging.
One problem with log debugging is how to turn it on/off on
selected area of the applications. If one wants logging generated
from one function and not another, then one ends up using more
flag and switches. Also there can be a need to change the
level of debugging (verbose, summary, etc...)
But I think a well designed logging facility can achieve
most of this, but I think this needs to be designed and
developed as part of the whole application. For large
applications, a good logging facility is essential.
I think some programmers add logging after the application is
deveopled, instead of designing it as part of the application
itself.
--Nasser
I agree generally. A lot of logging does get added after the fact by
maintenance programmers doing defect fixes, who, being the ones that
actually do most of the defect fixing (seeing as how the production
users are doing most of the real testing), see the practical value of
logging.
In the *real* world, for the majority of production deployments, there
are no (or inadequate) unit and functional test suites. Also in the real
world, for the majority of production deployments, the problem reporting
from the field is anecdotal - it can only report the observations of
(typically) one user or a small group of users, but it doesn't report
the snapshot state of the entire application; identifying a problem
reproducing scenario is often difficult or not possible.
And also in the real world, the problem often manifests because of the
interaction of hundreds of users - the typical lack of unit/functional
testing also means that there is no possible useful load testing
available. You can't reproduce the problem for a debugging session
because it's a probabilistic event.
Good logging goes a long way towards addressing these problems.
Debugging is OK, and sometimes the best way even, if the debugging
developer isn't all that familiar with the code, and the problem is
highly reproducible. Otherwise it's not often the best way (or even
worth bothering with). My opinion.
Adding logging after the fact will work OK if the application itself is
well written. You can then carefully control how much logging happens
for usefully selectable parts of the app. As you've suggested, for a
badly written app this can be a challenge. And almost by definition, if
an app was written not to have logging, it probably is an app with issues.
A couple of real-world notes:
1. In contrast to the oft-repeated mantra that you should not turn
logging up to detailed, in production, until s**t happens, think again -
for a really hurting app (which is many or most of them) you may as well
take the minor performance hit and crank those logs right up. You'll
need the logs anyway.
2. For a large impenetrable application with no logging, you sometimes
get the most bang for the buck with "println" logging introduced with
aspects.
AHS