[py-dev] Logging in the py library
Grig Gheorghiu
grig at gheorghiu.net
Tue Jun 7 18:46:32 CEST 2005
Holger,
I think it makes a lot of sense to split the functionality between a
very simple 'producer' API that is exposed to end-users and a
potentially more complicated 'consumer' API that interfaces with the
logging module. It's pretty clear you spent time thinking about all
these things :-), so I think it would probably be best if you came up
with a first cut at the 'producer' API and at how things tie together.
Then I'd be glad to work on the 'back-end' API that interfaces with the
logging module. Would that work for you?
Grig
--- holger krekel <hpk at trillke.net> wrote:
> Hi Grig,
>
> On Tue, Jun 07, 2005 at 07:59 -0700, Grig Gheorghiu wrote:
> > --- holger krekel <hpk at trillke.net> wrote:
> > > ...
> > > Basically we could associate
> > > with each logging message/object [*] a set of keywords.
> > > severity categorizations would just be a keyword in that idea.
> > >
> > > Let me try an example for e.g. tracing in py/execnet/gateway.py:
> > > ...
> > > trace("initializing gateway ...")
> > > ...
> > > 'trace' may by default add a 'debug' keyword if called like this.
>
> > > If we want to print some warning, then we could do something
> like:
> > >
> > > trace.warn("remote gateway side could not be destroyed")
> > >
> > > which would add the keyword 'warning' to that particular message.
>
> >
> > So is this association static or dynamic? If I understand
> correctly,
> > you'd want it to be dynamic, right?
>
> No, the association of keywords with messages can be static.
>
> > So for example trace.foo would add
> > 'foo' to the message. But the severity levels need to be statically
> > defined, at least if we want to mimic what the logging module does.
>
>
> Yes, 'trace.debug' would return a tracer that has the same keywords
> as 'trace' + the keyword 'debug'. Any message this tracer then
> produces would have all the latter keywords associated with it.
>
> > In the logging module, you can set a default severity level,
> > so that the logger will output only those messages that have
> > greater or equal severity levels.
>
> This refers to output filters and such. I think it makes
> sense to differentiate between a 'producing' API (basically something
>
> very simple like above - just one 'tracer' factory function)
> and a consuming API dealing with how to redirect messages based
> on keywords to specific backends/formatters.
>
> IMO the connection between producing and consuming objects should
> be runtime re-configurable. So it's really a small event system
> and may even be generalized into that at some point. The logging
> module would only come into play on the consuming side an internal
> backend and we would expose as few details about this as feasible.
>
> > > By default, everything would probably go to stdout but an
> > > application should be able to redirect by keyword to specific
> > > formatting/output backends (much like the logging module). I
> > > think it's important to allow this redirection to happen
> > > _after_ the above example is already imported, so
> > > redirections-by-keyword should be re-configurable at runtime.
> >
> > Yes, it would be nice to have the possibility of sending the
> messages
> > to a variety of handlers (stdout, files, sockets, HTTP servers,
> etc.)
> > One reservation I have about stdout being the default is that it
> might
> > interfere with py.test's own catching of stdout/stderr. I think it
> > would be better to trace to a file by default (I think that's what
> the
> > twisted.log module does too, although I haven't looked at it, I
> only
> > saw it mentioned somewhere).
>
> don't worry, py.test could reconfigure the tracing accordingly.
> The idea above is really about an application-independent
> general mechanism. I believe that the basic tracer should
> be as close to a mere 'print' statement as possible.
>
> Hum, to keep things really minimal we might consider:
>
> import py
> py.trace.debug('hello', 'world')
>
> which would by default print something like:
>
> [debug] hello world
>
> Or, to make it even more obvious:
>
> print >>py.trace.debug, "hello", "world"
>
> No API is the best API, remember? :-)
>
> (the disadvantage is that the str()s are always computed
> but that is a somewhat unfortunate language implementation
> detail that could be changed at some point :-).
>
> The nice property of the above that it is a really simple
> idiom which makes it obvious that the tracing statement
> does not mutate the program state but only has a tracing
> side effect.
>
> > > What do you think of this basic keyword idea? (which cold
> > > still use the logging module underneath for accessing all
> > > the backends if it makes sense).
> > >
> > > And sorry, but the py lib really aims at exploring
> > > improvements over current ways of doing things :-)
> > >
> >
> > I think it's a very good idea. In my opinion, it would still be
> worth
> > using the logging module underneath, since all the grunt work is
> > already done there. I hate reinventing wheels.
>
> Agreed. However, before worrying about output handlers (where
> the logging module could really help) i'd like to have a nice
> pythonic tracing model that allows to connect e.g. print-statements
> to tracer functions (and we can offer some default set of
> tracer functions which itself use the logging module).
>
> Hum. Here is a thought example of how a _consuming_ tracer
> function could look like:
>
> def mytracer(message):
> if 'error' in message.keywords:
> print >>somefile, "error:", str(message)
> elif ...
>
> py.trace[...] = mytracer
> ^^^ literally :-)
>
> or to associate the consuming tracer function more directly:
>
> def myerrortracer(message):
> print >>errorfile, str(message)
>
> py.trace['error'] = myerrortracer
>
> Wouldn't the meaning of this API be obvious?
> (I am not explaining it on purpose here :-)
>
> Providing adapter-consuming-tracer-functions for using the
> logging-module's backends should then becomes an orthogonal
> disconnected issue.
>
> > But polishing and simplifying the interface to the logging
> > module is certainly something to be aimed for -- and your
> > keyword idea goes a long way towards that goal.
>
> great to hear!
>
> I have to admit i have thought about the 'tracing problem'
> quite a bit already and i had some discussion with Vinay at
> the time (the author of the logging module). Your bringing
> up of the topic forced me to try express my train of thoughts
> more clearly.
>
> cheers,
>
> holger
>
More information about the py-dev
mailing list