Choosing log file destination in logging configuration file

guybenron at gmail.com guybenron at gmail.com
Tue Apr 22 15:18:11 EDT 2008


Hey,

I have a sort of petty-neurotic question, I'm kinda pedantic and like
to keep my log directories clean, and this thing is bothering me to
the point of actually posting a question (couldn't find any post about
this..).

My application has two types of components: daemons and regular ones
that are run every on crontab. Because the log structure is very
similar, I want both to use the same logging configuration file.

For clarity, I want all of the files to have the date as part of the
filename.
The TimedRotatingFileHandler has it built in (once it rotates), and I
found a dirty hack to make it work for the FileHandler (see shameful
code below). Basically I'm all set - have the daemons use the rotating
handler, since they're, um, daemonic and on all the time, and have the
regular components use the regular handler, using the dirty hack to
insert the date into the filename.

So far so good. In the relevant applications, the code looks something
like this:
logging.config.fileConfig('log.ini')
logger = logging.getLogger('log.regular') <or> logger =
logging.getLogger('log.daemonic')
.. and start logging.

The thorn in my side is that after the fileConfig call, BOTH handlers
are instantiated, meaning both types of files are created for every
component, even if I don't need it: component.log (for the rotating
handler) and compenent.date.log (for the regular file handler).

..So finally, here's my question:
Apart from splitting the logging configuration into two separate
files, is there any way to NOT create the file until you actually use
it?

Here's the logging configuration file for reference.. Thanks !

[loggers]
keys=root,regular,daemonic

[handlers]
keys=fileHandler,consoleHandler,timedRotatingFileHandler

[formatters]
keys=simpleFormatter

[logger_root]
level=DEBUG
handlers=consoleHandler

[logger_regular]
level=INFO
handlers=fileHandler,consoleHandler
propagate=0
qualname=log.regular

[logger_daemonic]
level=INFO
handlers=timedRotatingFileHandler,consoleHandler
propagate=0
qualname=log.daemonic

[handler_timedRotatingFileHandler]
class=handlers.TimedRotatingFileHandler
level=INFO
formatter=simpleFormatter
args=('mylog.log', 'midnight')

[handler_fileHandler]
class=FileHandler
level=INFO
formatter=simpleFormatter
; sorry about the grossness
args=('mylog.' + str(time.localtime().tm_year) + '_' +
str(time.localtime().tm_mon).zfill(2) + '_' +
str(time.localtime().tm_mday).zfill(2) + '.log', 'a')

[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=simpleFormatter
args=(sys.stdout,)

[formatter_simpleFormatter]
format=%(asctime)s - %(filename)s - %(name)s - %(levelname)s - %
(message)s



More information about the Python-list mailing list