RotatingFileHandler and logging config file

R

Rob Cranfill

Hello,

I've successfully coded Python to do what I want with a
RotatingFileHandler, but am having trouble getting the same behavior via
a config file.

I wanted to create one log file each time I run my app, with up to 10
files kept from the last invocations. This was accomplished with

self._logger = logging.getLogger('PDGUI')
# We will rotate the files 'manually', so use zero rotate size.
handler = logging.handlers.RotatingFileHandler( \
"..\\PDGUI.log", "a", 0, 10)
handler.doRollover() # force the next file to be used

formatter = logging.Formatter("%(asctime)s " + \
"%(levelname)s\t%(message)s")
handler.setFormatter(formatter)
self._logger.addHandler(handler)
self._logger.setLevel(logging.INFO)

I'd like to do the same thing with a config file (so that, if this
*isn't* the behavior I want, I can change the config file, of course).
I started with a rather plain config file, with the only interesting bit
being:

[handler_hand01]
class=handlers.RotatingFileHandler
level=NOTSET
formatter=form01
args=("..\\PDGUI.log", "a", 0, 10,)


But I still have one problem - how do I force the "handler.doRollover()"
to happen with the config file? There doesn't seem to be any way to do
this in the config file itself, which is OK and perhaps appropriate
[BTW, has anyone else noticed that RotatingFileHandler isn't documented
in the docs? All the other file handlers have at least a paragraph on
their options, but nothing for RFH!]

I can't find any way to do the handler.doRollover() in code, either, if
I've started off with a config file. Something like


logging.config.fileConfig(options.logconfig)

# BUGBUG If the config file specifies a RotatingFileHandler,
# we need to force a doRollover now, but there's no way!
#
handler = logging.getLogger().getHandler() # THIS DOESN'T EXIST!
handler.doRollover() # force the next file to be used


Ideas, suggestions, etc? It's too bad - with the code method, I can do
exactly what I want, but not with the config file.

- rob
 
K

Kent Johnson

Rob said:
[BTW, has anyone else noticed that RotatingFileHandler isn't documented
in the docs? All the other file handlers have at least a paragraph on
their options, but nothing for RFH!]

It is in the latest docs.

Kent
 
P

Peter Hansen

Rob said:
No, it isn't. (But thanks for replying anyway!)

Can you prove it isn't? ;-)
http://docs.python.org/lib/logging-config-fileformat.html

has all the others (OK, maybe not all, I haven't thoroughly checked, but
it's got nine of 'em) but nothing for RFH.

Or is that not "the latest docs"?

Sure, but it's not the only place to look in the current docs.
Try here instead: http://docs.python.org/lib/node332.html

The missing piece of the puzzle might be the connection
between the 'args' in the config file and the arguments
passed to the __init__ method of the class....

-Peter
 
R

Rob Cranfill

news.sydney.pipenetworks.com said:
You're looking in the wrong place. Try

http://docs.python.org/lib/node333.html

which isn't quite the page in question, but leads to the closest
pertinent page,
http://docs.python.org/lib/logging-config-fileformat.html
which *still* has nothing on RotatingFileHandler.

That's OK, I've given up on the idea of being able to configure a
RotatingFileHandler from a config file; I'll do it in my code as a
default, and if users want any *other* behavior, they can config *that*.

- rob
 
R

Rob Cranfill

Peter said:
The missing piece of the puzzle might be the connection
between the 'args' in the config file and the arguments
passed to the __init__ method of the class....

Yes, I can puzzle out the constructor args ("constructor", heh heh, must
be a Java Man) but it's how to get it to do a doRollover() that's in
question. No sign of support for it in the docs (which your link to
doesn't elucidate RotatingFileHandler any better than my original) but
that's OK, see my following message to <[email protected]> (what a
funny name!)

- rob
 
B

Bengt Richter

which isn't quite the page in question, but leads to the closest
pertinent page,
http://docs.python.org/lib/logging-config-fileformat.html
which *still* has nothing on RotatingFileHandler.

That's OK, I've given up on the idea of being able to configure a
RotatingFileHandler from a config file; I'll do it in my code as a
default, and if users want any *other* behavior, they can config *that*.
To fish for yourself, go to google and put

RotatingFileHandler site:docs.python.org

in the search slot and click search.

The first hit is
http://docs.python.org/lib/node332.html

HTH

Regards,
Bengt Richter
 
R

Rob Cranfill

news.sydney.pipenetworks.com said:
Yeah...sorry about that. I misunderstood what node333.html was used for.
Looks like your best bet may be to extend the RotatingFileHandler
directly in the handlers module and call doRollover() in __init__.

Ah, now *there's* an intriguing approach! I am too much a Python noob to
know - can I subclass RFH and then invoke that new class from a config
file (the crux of my original question) ? I may play around with it
today....

Thanks,
- rob
 
P

Peter Hansen

Rob said:
Ah, now *there's* an intriguing approach! I am too much a Python noob to
know - can I subclass RFH and then invoke that new class from a config
file (the crux of my original question) ? I may play around with it
today....

There's at least one way that will work, though it may not be
the cleanest approach.

Wherever you create your subclass, stick a reference to it in
the logging.handlers module, as "logging.handlers.MyClass = MyClass".
Then the config file can load it just as you now load the
existing class (which I assume looks like the usual examples,
with "class=handlers.RotatingFileHandler").

The logging.cfg file is executed in the context of the logging
module's namespace, so you could also stick your names directly
in there and skip the "handlers." part, but that might be
even less clear...

-Peter
 
V

Vinay Sajip

Rob said:
NID (No, It Doesn't) ;-) but thanks anyway. To reiterate, the question
is how to make RotatingFileHandler do a doRotate() on startup from a
*config file*. No mention of that in what you point to.

I don't think that RotatingFileHandler *should* be configurable to do a
doRollover() on startup. I would follow up the suggestion of using your
own derived class. The config mechanism will allow you to instantiate
custom handlers - you only have to take into account (as an earlier
poster has indicated) how the evaluation of the handler class (and its
constructor arguments) is performed.

BTW - constructor is not just for Java, but C++ too (not to mention C#).


Vinay Sajip
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,768
Messages
2,569,574
Members
45,051
Latest member
CarleyMcCr

Latest Threads

Top