The logging.basicConfig() function allows users to easily configure either a console handler or file handler for the root logger, and thereby have them usable by all loggers in their application. While this functionality meets the commonest use cases, there are some slightly less common use cases which can be accommodated without too much work. For example:
- Configuring a FileHandler with a specific encoding, or with a delay parameter which defers opening the file until the first time it’s actually used.
- Configuring a SysLogHandler. This could be useful, say, for cron jobs or other admin scripts.
- Configuring multiple handlers with minimal work.
Accordingly, basicConfig() in Python 3.3 will have added functionality in the form of a new handlers keyword argument. This defaults to None, but when specified it is expected to be an iterable of already-created handler instances, which are to be added to the root logger.
Any handler in the iterable which does not have a formatter assigned will be assigned the formatter created by basicConfig(). This allows users to specify formatters if they need to, but defaults to a common formatter for all handlers which have no formatter specified.
This change to basicConfig() also includes improved checking for parameter compatibility: it doesn’t make sense to specify handlers together with stream or filename parameters, or to specify stream and filename parameters together. In Python 3.3, checks have been added so that these invalid combinations will raise a ValueError.
Examples of usage:
logging.basicConfig(handlers=[logging.FileHandler('test.log', 'w', 'utf-8')])
logging.basicConfig(handlers=[logging.SysLogHandler()])
logging.basicConfig(handlers=[logging.StreamHandler(), logging.FileHandler('test.log')])
I’d welcome feedback on this new functionality, which has already been checked into Python’s Mercurial repository.