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