customizing a logging logger
David
wizzardx at gmail.com
Tue Sep 11 14:21:27 EDT 2007
On 9/11/07, garyjefferson123 at gmail.com <garyjefferson123 at gmail.com> wrote:
> I think the following question is clearer.
>
> I want to make it so that method1 below can be transformed:
>
> logger = logging.getLogger("somelogger")
> class SomeOp:
> def __init__(self, ctx):
> self.ctx = ctx
> def method1(self):
> logger.info("%s: here's a message", self.ctx)
> logger.debug("%s: msg #2", self.ctx)
> v = 'yessir'
> logger.debug("%s: msg #3 %s", self.ctx, v)
>
> into something like:
>
> def method1(self):
> logger.info("here's a message")
> logger.debug("msg #2")
> v = 'yessir'
> logger.debug("msg #3 %s", v)
>
>
> What is the best way to do this, so that I don't have to manually put
> the self.ctx in the log string in hundreds of different places?
One way to do it is to make a mixin class (eg: ContextLogging) which
you construct with the context string. The mixin constructor has a
line like this:
self.logger = logging.getLogger(ctx).
(assuming your context string is appropriate for a logger name)
Then your methods call self.logger instead of the module-level logger.
Another method is also to use a mixin class, which provides methods
"log_debug", "log_info", etc methods which wrap calls to a logger
object.
Another (more advanced) method is to create a custom Logger class. It
uses the call stack to determine if it's caller has a "ctx" attribute,
and pushes the value of that attribute into the message string. Then
you call logging.setLoggerClass so that you get instances of your
custom logger class.
More information about the Python-list
mailing list