dictConfig: logging.StreamHandler object is not iterable.

Peter Otten __peter__ at web.de
Wed May 24 15:16:46 EDT 2017


Tim Williams wrote:

> (Apologies for using Google Groups to post)
> 
> I'm trying to use dictConfig to configure logging. I keep running into the
> error that the logging.StreamHandler object is not iterable.
> 
> I'm using Python 3.4.3 on a Windows 7 box.
> 
> C:\Python34\python.exe 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:44:40)
> [MSC v.1600 64 bit (AMD64)]
> 
> 
> I want to use the configobj module to create the dictionary from an INI
> file, but that's not the problem I'm having.
> 
> Here is my test code:
> #############
> import logging, logging.config, logging.handlers
> import configobj
> 
> # config = configobj.ConfigObj('loggingtest.ini')
> # config['version']=eval(config['version'])
> config = {
>           'version': 1,
>           'level': 'INFO',
>           'formatters': {'fmt1': {'format': '%(asctime)s: (%(levelname)s) 
>           %(message)s',
>                                   'datefmt': ''}
>                          },
>           'loggers': {'root': {'level': 'INFO',
>                                'handlers': 'cfg://handlers.console'},

If I'm reading

<https://docs.python.org/dev/library/logging.config.html#dictionary-schema-details>

"""
loggers - the corresponding value will be a dict in which each key is a 
logger name and each value is a dict describing how to configure the 
corresponding Logger instance.

The configuring dict is searched for the following keys:

[...]

handlers (optional). A list of ids of the handlers for this logger.
"""

correctly this should be

'loggers': {'root': {'level': 'INFO',
                     'handlers': ['console']},


>                       'file': {'level': 'WARN',
>                                'handlers': 'cfg://handlers.file'}

Same here: 

... 'handlers': ['file'] ...

>                       },
>           'handlers': {'console': {'class': 'logging.StreamHandler',
>                                    'level': 'INFO',
>                                    'stream': 'ext://sys.stdout'},
>                        'file': {'class': 'logging.FileHandler',
>                                 'level': 'WARN',
>                                 'filename': 'test.log'}
>                        },
>           }
> 
> 
> logging.config.dictConfig(config)
> ################
> 
> When I run it, I get this traceback:
> 
> Traceback (most recent call last):
>   File "C:\Python34\lib\logging\config.py", line 611, in configure
>     self.configure_logger(name, loggers[name])
>   File "C:\Python34\lib\logging\config.py", line 775, in configure_logger
>     self.common_logger_config(logger, config, incremental)
>   File "C:\Python34\lib\logging\config.py", line 767, in
>   common_logger_config
>     self.add_handlers(logger, handlers)
>   File "C:\Python34\lib\logging\config.py", line 748, in add_handlers
>     for h in handlers:
> TypeError: 'StreamHandler' object is not iterable
> 
> During handling of the above exception, another exception occurred:
> 
> Traceback (most recent call last):
>   File "L:\workspace\MyPython\src\testlog.py", line 27, in <module>
>     logging.config.dictConfig(config)
>   File "C:\Python34\lib\logging\config.py", line 789, in dictConfig
>     dictConfigClass(config).configure()
>   File "C:\Python34\lib\logging\config.py", line 614, in configure
>     '%r: %s' % (name, e))
> ValueError: Unable to configure logger 'root': 'StreamHandler' object is
> not iterable
> 
> 
> I even tried creating a JSON file to create the dictionary, and got the
> same error.
> 
> Thanks for any help
> --
> Tim





More information about the Python-list mailing list