[Python-ideas] Dynamic code NOPing
Rene Nejsum
rene at stranden.com
Tue Dec 25 13:42:34 CET 2012
I understand and agree with all your arguments on debugging.
At my company we typically make some kind of backend/server control software, with a LOT of debugging lines across many modules. We have 20+ debugging flags and in different situations we enable a few of those, if we were to enable all at once it would defently have an impact on production, but hopefully just a hotter CPU and a lot of disk space being used.
debug statements in our code is probably one per 10-20 lines of code.
I think my main issue (and what I therefore read into the original suggestion) was the extra "if" statement at every log statement
So doing:
if log.debug.enabled():
log.debug( bla. bla. )
Add's 5-10% extra code lines, whereas if we could do:
log.debug( bla. bla )
at the same cost would save a lot of lines.
And when you have 43 lines in your editor, it will give you 3-5 lines more of real code to look at :-)
/Rene
On Dec 25, 2012, at 1:28 PM, Nick Coghlan <ncoghlan at gmail.com> wrote:
> On Tue, Dec 25, 2012 at 9:11 PM, Rene Nejsum <rene at stranden.com> wrote:
>> But if debug() was indeed NOP'able, maybe it could be done ?
>
> If someone *really* wants to do this, they can abuse assert statements
> (which will be optimised out under "-O", just like code guarded by "if
> __debug__"). That doesn't make it a good idea - you most need log
> messages to investigate faults in production systems that you can't
> (or are still trying to) reproduce in development and integration
> environments. Compiling them out instead of deactivating them with
> runtime configuration settings means you can't switch them on without
> restarting the system with different options.
>
> This does mean that you have to factor in the cost of logging into
> your performance targets and hardware requirements, but the payoff is
> an increased ability to correctly diagnose system faults (as well as
> improving your ability to extract interesting metrics from log
> messages).
>
> Excessive logging calls certainly *can* cause performance problems due
> to the function call overhead, as can careless calculation of
> expensive values that aren't needed. One alternatives occasional
> noted is that you could design a logging API that can accept lazily
> evaluated callables instead of ordinary parameters.
>
> However, one danger of such expensive logging it that enabling that
> logging level becomes infeasible in practice, because the performance
> hit is too significant. The typical aim for logging is that your
> overhead should be such that enabling it in production means your
> servers run a little hotter, or your task takes a little longer, not
> that your application grinds to a halt. One good way to achieve this
> is to decouple the expensive calculations from the main application -
> you instead log the necessary pieces of information, which can be
> picked up by an external service and the calculation performed in a
> separate process (or even on a separate machine) where it won't affect
> the main application, and where you only calculate it if you actually
> need it for some reason.
>
> Cheers,
> Nick.
>
> --
> Nick Coghlan | ncoghlan at gmail.com | Brisbane, Australia
More information about the Python-ideas
mailing list