improvements for the logging package

Trent Mick trentm at ActiveState.com
Wed Sep 7 13:14:21 EDT 2005


[skip at pobox.com wrote]
> Perhaps so, but the logging module seems like such an unpythonic beast to
> me.  How about cleaning it up (*) before we add more to it?

Yes. I was also trying to encourage Rotem to get involved in other parts
of the logging module/package later on in my email. :)

> Stuff like colorizing seems like it belongs in its own module
> (presuming a reasonably general markup scheme can be agreed upon) so
> it can be used outside the logging package.

Yah, you are probably right. Most additions to the logging system could
easily live as their own separate pieces.

> (*) Stuff that seems very odd to me:
> 
>     - It's a package, but contrary to any other package I've ever seen, most
>       of its functionality is implemented in __init__.py.  __init__.py is
>       roughly four times larger than the next largest (bsddb, which is a
>       beast because BerkDB has gotten so big over the years and the
>       module/package has strived to remain backwards-compatible).

I'm not defending the implementation, but does this cause any particular
problems?


>       The obvious 'hello world' example
> 
>         import logging
>         logging.info('hello world')
> 
>       ought to just work (implicitly add a stream handler connected to
>       stderr to the root logger).

Maybe. Unless that causes troubles for real use. Having lazy
configuration like this means that it can be a subtle thing for
top-level application code to setup the proper logging configuration.

I cringe a little bit when I see this presented as the "hello world"
example. My basic hello world tends to be:

    import logging
    log = logging.getLogger("name-of-my-module-or-script")

    # use log.{debug|info|warn|error}() in module/script...
    #...

    if __name__ == "__main__":
        logging.basicConfig()
        #...
        
and then I wish again that the default output were a bit nicer for my
most common usage -- which is logging to the command line in scripts --
rather than looking more like to web server error/access logs.

I think the usability of the logging module could be much improved with
a nicer introduction to it (i.e. docs). It's not really a "hello world"
type of tool. Its usefulness only really shows in larger use cases.


>     - Its functionality is partitioned in sometimes odd ways.  For example,
>       it has a handlers module, but what I presume would be the most
>       commonly used handler (StreamHandler) is not defined there.  It's in
>       (you have three guesses and the first two don't count) __init__.py
>       instead of in logging.handlers.  Consequently, browsing in the obvious
>       way fails to find the StreamHandler class.
>
>     - It doesn't use PEP 8 style as far as naming is concerned, instead
>       doing some sort of Java or C++ or Perl camelCase thing.  Eschewing PEP
>       8 is fine for other stuff, but code in the Python core (especially new
>       code like the logging module) should strive to adhere to PEP 8, since
>       many people will use the core code as a pattern for their own code.

Perhaps Vijay (who did all the implementation) can comment on these.
Unfortunately backwards-compat might restrict some cleanups to the
package, but perhaps not too much. I did a poor job of keeping up with
the package after I laid out an initial design, er copied an initial
design from Java's log4j package (and I'm not even a Java guy). :(

Trent

-- 
Trent Mick
TrentM at ActiveState.com



More information about the Python-list mailing list