Home | History | Annotate | Download | only in library
      1 :mod:`logging.config` --- Logging configuration
      2 ===============================================
      3 
      4 .. module:: logging.config
      5    :synopsis: Configuration of the logging module.
      6 
      7 .. moduleauthor:: Vinay Sajip <vinay_sajip (a] red-dove.com>
      8 .. sectionauthor:: Vinay Sajip <vinay_sajip (a] red-dove.com>
      9 
     10 **Source code:** :source:`Lib/logging/config.py`
     11 
     12 .. sidebar:: Important
     13 
     14    This page contains only reference information. For tutorials,
     15    please see
     16 
     17    * :ref:`Basic Tutorial <logging-basic-tutorial>`
     18    * :ref:`Advanced Tutorial <logging-advanced-tutorial>`
     19    * :ref:`Logging Cookbook <logging-cookbook>`
     20 
     21 --------------
     22 
     23 This section describes the API for configuring the logging module.
     24 
     25 .. _logging-config-api:
     26 
     27 Configuration functions
     28 ^^^^^^^^^^^^^^^^^^^^^^^
     29 
     30 The following functions configure the logging module. They are located in the
     31 :mod:`logging.config` module.  Their use is optional --- you can configure the
     32 logging module using these functions or by making calls to the main API (defined
     33 in :mod:`logging` itself) and defining handlers which are declared either in
     34 :mod:`logging` or :mod:`logging.handlers`.
     35 
     36 .. function:: dictConfig(config)
     37 
     38     Takes the logging configuration from a dictionary.  The contents of
     39     this dictionary are described in :ref:`logging-config-dictschema`
     40     below.
     41 
     42     If an error is encountered during configuration, this function will
     43     raise a :exc:`ValueError`, :exc:`TypeError`, :exc:`AttributeError`
     44     or :exc:`ImportError` with a suitably descriptive message.  The
     45     following is a (possibly incomplete) list of conditions which will
     46     raise an error:
     47 
     48     * A ``level`` which is not a string or which is a string not
     49       corresponding to an actual logging level.
     50     * A ``propagate`` value which is not a boolean.
     51     * An id which does not have a corresponding destination.
     52     * A non-existent handler id found during an incremental call.
     53     * An invalid logger name.
     54     * Inability to resolve to an internal or external object.
     55 
     56     Parsing is performed by the :class:`DictConfigurator` class, whose
     57     constructor is passed the dictionary used for configuration, and
     58     has a :meth:`configure` method.  The :mod:`logging.config` module
     59     has a callable attribute :attr:`dictConfigClass`
     60     which is initially set to :class:`DictConfigurator`.
     61     You can replace the value of :attr:`dictConfigClass` with a
     62     suitable implementation of your own.
     63 
     64     :func:`dictConfig` calls :attr:`dictConfigClass` passing
     65     the specified dictionary, and then calls the :meth:`configure` method on
     66     the returned object to put the configuration into effect::
     67 
     68           def dictConfig(config):
     69               dictConfigClass(config).configure()
     70 
     71     For example, a subclass of :class:`DictConfigurator` could call
     72     ``DictConfigurator.__init__()`` in its own :meth:`__init__()`, then
     73     set up custom prefixes which would be usable in the subsequent
     74     :meth:`configure` call. :attr:`dictConfigClass` would be bound to
     75     this new subclass, and then :func:`dictConfig` could be called exactly as
     76     in the default, uncustomized state.
     77 
     78    .. versionadded:: 3.2
     79 
     80 .. function:: fileConfig(fname, defaults=None, disable_existing_loggers=True)
     81 
     82    Reads the logging configuration from a :mod:`configparser`\-format file. The
     83    format of the file should be as described in
     84    :ref:`logging-config-fileformat`.
     85    This function can be called several times from an application, allowing an
     86    end user to select from various pre-canned configurations (if the developer
     87    provides a mechanism to present the choices and load the chosen
     88    configuration).
     89 
     90    :param fname: A filename, or a file-like object, or an instance derived
     91                  from :class:`~configparser.RawConfigParser`. If a
     92                  ``RawConfigParser``-derived instance is passed, it is used as
     93                  is. Otherwise, a :class:`~configparser.Configparser` is
     94                  instantiated, and the configuration read by it from the
     95                  object passed in ``fname``. If that has a :meth:`readline`
     96                  method, it is assumed to be a file-like object and read using
     97                  :meth:`~configparser.ConfigParser.read_file`; otherwise,
     98                  it is assumed to be a filename and passed to
     99                  :meth:`~configparser.ConfigParser.read`.
    100 
    101 
    102    :param defaults: Defaults to be passed to the ConfigParser can be specified
    103                     in this argument.
    104 
    105    :param disable_existing_loggers: If specified as ``False``, loggers which
    106                                     exist when this call is made are left
    107                                     enabled. The default is ``True`` because this
    108                                     enables old behaviour in a
    109                                     backward-compatible way. This behaviour is to
    110                                     disable any existing non-root loggers unless
    111                                     they or their ancestors are explicitly named
    112                                     in the logging configuration.
    113 
    114    .. versionchanged:: 3.4
    115       An instance of a subclass of :class:`~configparser.RawConfigParser` is
    116       now accepted as a value for ``fname``. This facilitates:
    117 
    118       * Use of a configuration file where logging configuration is just part
    119         of the overall application configuration.
    120       * Use of a configuration read from a file, and then modified by the using
    121         application (e.g. based on command-line parameters or other aspects
    122         of the runtime environment) before being passed to ``fileConfig``.
    123 
    124 .. function:: listen(port=DEFAULT_LOGGING_CONFIG_PORT, verify=None)
    125 
    126    Starts up a socket server on the specified port, and listens for new
    127    configurations. If no port is specified, the module's default
    128    :const:`DEFAULT_LOGGING_CONFIG_PORT` is used. Logging configurations will be
    129    sent as a file suitable for processing by :func:`dictConfig` or
    130    :func:`fileConfig`. Returns a :class:`~threading.Thread` instance on which
    131    you can call :meth:`~threading.Thread.start` to start the server, and which
    132    you can :meth:`~threading.Thread.join` when appropriate. To stop the server,
    133    call :func:`stopListening`.
    134 
    135    The ``verify`` argument, if specified, should be a callable which should
    136    verify whether bytes received across the socket are valid and should be
    137    processed. This could be done by encrypting and/or signing what is sent
    138    across the socket, such that the ``verify`` callable can perform
    139    signature verification and/or decryption. The ``verify`` callable is called
    140    with a single argument - the bytes received across the socket - and should
    141    return the bytes to be processed, or ``None`` to indicate that the bytes should
    142    be discarded. The returned bytes could be the same as the passed in bytes
    143    (e.g. when only verification is done), or they could be completely different
    144    (perhaps if decryption were performed).
    145 
    146    To send a configuration to the socket, read in the configuration file and
    147    send it to the socket as a sequence of bytes preceded by a four-byte length
    148    string packed in binary using ``struct.pack('>L', n)``.
    149 
    150    .. note::
    151 
    152       Because portions of the configuration are passed through
    153       :func:`eval`, use of this function may open its users to a security risk.
    154       While the function only binds to a socket on ``localhost``, and so does
    155       not accept connections from remote machines, there are scenarios where
    156       untrusted code could be run under the account of the process which calls
    157       :func:`listen`. Specifically, if the process calling :func:`listen` runs
    158       on a multi-user machine where users cannot trust each other, then a
    159       malicious user could arrange to run essentially arbitrary code in a
    160       victim user's process, simply by connecting to the victim's
    161       :func:`listen` socket and sending a configuration which runs whatever
    162       code the attacker wants to have executed in the victim's process. This is
    163       especially easy to do if the default port is used, but not hard even if a
    164       different port is used). To avoid the risk of this happening, use the
    165       ``verify`` argument to :func:`listen` to prevent unrecognised
    166       configurations from being applied.
    167 
    168    .. versionchanged:: 3.4
    169       The ``verify`` argument was added.
    170 
    171    .. note::
    172 
    173       If you want to send configurations to the listener which don't
    174       disable existing loggers, you will need to use a JSON format for
    175       the configuration, which will use :func:`dictConfig` for configuration.
    176       This method allows you to specify ``disable_existing_loggers`` as
    177       ``False`` in the configuration you send.
    178 
    179 
    180 .. function:: stopListening()
    181 
    182    Stops the listening server which was created with a call to :func:`listen`.
    183    This is typically called before calling :meth:`join` on the return value from
    184    :func:`listen`.
    185 
    186 
    187 .. _logging-config-dictschema:
    188 
    189 Configuration dictionary schema
    190 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    191 
    192 Describing a logging configuration requires listing the various
    193 objects to create and the connections between them; for example, you
    194 may create a handler named 'console' and then say that the logger
    195 named 'startup' will send its messages to the 'console' handler.
    196 These objects aren't limited to those provided by the :mod:`logging`
    197 module because you might write your own formatter or handler class.
    198 The parameters to these classes may also need to include external
    199 objects such as ``sys.stderr``.  The syntax for describing these
    200 objects and connections is defined in :ref:`logging-config-dict-connections`
    201 below.
    202 
    203 Dictionary Schema Details
    204 """""""""""""""""""""""""
    205 
    206 The dictionary passed to :func:`dictConfig` must contain the following
    207 keys:
    208 
    209 * *version* - to be set to an integer value representing the schema
    210   version.  The only valid value at present is 1, but having this key
    211   allows the schema to evolve while still preserving backwards
    212   compatibility.
    213 
    214 All other keys are optional, but if present they will be interpreted
    215 as described below.  In all cases below where a 'configuring dict' is
    216 mentioned, it will be checked for the special ``'()'`` key to see if a
    217 custom instantiation is required.  If so, the mechanism described in
    218 :ref:`logging-config-dict-userdef` below is used to create an instance;
    219 otherwise, the context is used to determine what to instantiate.
    220 
    221 * *formatters* - the corresponding value will be a dict in which each
    222   key is a formatter id and each value is a dict describing how to
    223   configure the corresponding :class:`~logging.Formatter` instance.
    224 
    225   The configuring dict is searched for keys ``format`` and ``datefmt``
    226   (with defaults of ``None``) and these are used to construct a
    227   :class:`~logging.Formatter` instance.
    228 
    229 * *filters* - the corresponding value will be a dict in which each key
    230   is a filter id and each value is a dict describing how to configure
    231   the corresponding Filter instance.
    232 
    233   The configuring dict is searched for the key ``name`` (defaulting to the
    234   empty string) and this is used to construct a :class:`logging.Filter`
    235   instance.
    236 
    237 * *handlers* - the corresponding value will be a dict in which each
    238   key is a handler id and each value is a dict describing how to
    239   configure the corresponding Handler instance.
    240 
    241   The configuring dict is searched for the following keys:
    242 
    243   * ``class`` (mandatory).  This is the fully qualified name of the
    244     handler class.
    245 
    246   * ``level`` (optional).  The level of the handler.
    247 
    248   * ``formatter`` (optional).  The id of the formatter for this
    249     handler.
    250 
    251   * ``filters`` (optional).  A list of ids of the filters for this
    252     handler.
    253 
    254   All *other* keys are passed through as keyword arguments to the
    255   handler's constructor.  For example, given the snippet:
    256 
    257   .. code-block:: yaml
    258 
    259       handlers:
    260         console:
    261           class : logging.StreamHandler
    262           formatter: brief
    263           level   : INFO
    264           filters: [allow_foo]
    265           stream  : ext://sys.stdout
    266         file:
    267           class : logging.handlers.RotatingFileHandler
    268           formatter: precise
    269           filename: logconfig.log
    270           maxBytes: 1024
    271           backupCount: 3
    272 
    273   the handler with id ``console`` is instantiated as a
    274   :class:`logging.StreamHandler`, using ``sys.stdout`` as the underlying
    275   stream.  The handler with id ``file`` is instantiated as a
    276   :class:`logging.handlers.RotatingFileHandler` with the keyword arguments
    277   ``filename='logconfig.log', maxBytes=1024, backupCount=3``.
    278 
    279 * *loggers* - the corresponding value will be a dict in which each key
    280   is a logger name and each value is a dict describing how to
    281   configure the corresponding Logger instance.
    282 
    283   The configuring dict is searched for the following keys:
    284 
    285   * ``level`` (optional).  The level of the logger.
    286 
    287   * ``propagate`` (optional).  The propagation setting of the logger.
    288 
    289   * ``filters`` (optional).  A list of ids of the filters for this
    290     logger.
    291 
    292   * ``handlers`` (optional).  A list of ids of the handlers for this
    293     logger.
    294 
    295   The specified loggers will be configured according to the level,
    296   propagation, filters and handlers specified.
    297 
    298 * *root* - this will be the configuration for the root logger.
    299   Processing of the configuration will be as for any logger, except
    300   that the ``propagate`` setting will not be applicable.
    301 
    302 * *incremental* - whether the configuration is to be interpreted as
    303   incremental to the existing configuration.  This value defaults to
    304   ``False``, which means that the specified configuration replaces the
    305   existing configuration with the same semantics as used by the
    306   existing :func:`fileConfig` API.
    307 
    308   If the specified value is ``True``, the configuration is processed
    309   as described in the section on :ref:`logging-config-dict-incremental`.
    310 
    311 * *disable_existing_loggers* - whether any existing non-root loggers are
    312   to be disabled. This setting mirrors the parameter of the same name in
    313   :func:`fileConfig`. If absent, this parameter defaults to ``True``.
    314   This value is ignored if *incremental* is ``True``.
    315 
    316 .. _logging-config-dict-incremental:
    317 
    318 Incremental Configuration
    319 """""""""""""""""""""""""
    320 
    321 It is difficult to provide complete flexibility for incremental
    322 configuration.  For example, because objects such as filters
    323 and formatters are anonymous, once a configuration is set up, it is
    324 not possible to refer to such anonymous objects when augmenting a
    325 configuration.
    326 
    327 Furthermore, there is not a compelling case for arbitrarily altering
    328 the object graph of loggers, handlers, filters, formatters at
    329 run-time, once a configuration is set up; the verbosity of loggers and
    330 handlers can be controlled just by setting levels (and, in the case of
    331 loggers, propagation flags).  Changing the object graph arbitrarily in
    332 a safe way is problematic in a multi-threaded environment; while not
    333 impossible, the benefits are not worth the complexity it adds to the
    334 implementation.
    335 
    336 Thus, when the ``incremental`` key of a configuration dict is present
    337 and is ``True``, the system will completely ignore any ``formatters`` and
    338 ``filters`` entries, and process only the ``level``
    339 settings in the ``handlers`` entries, and the ``level`` and
    340 ``propagate`` settings in the ``loggers`` and ``root`` entries.
    341 
    342 Using a value in the configuration dict lets configurations to be sent
    343 over the wire as pickled dicts to a socket listener. Thus, the logging
    344 verbosity of a long-running application can be altered over time with
    345 no need to stop and restart the application.
    346 
    347 .. _logging-config-dict-connections:
    348 
    349 Object connections
    350 """"""""""""""""""
    351 
    352 The schema describes a set of logging objects - loggers,
    353 handlers, formatters, filters - which are connected to each other in
    354 an object graph.  Thus, the schema needs to represent connections
    355 between the objects.  For example, say that, once configured, a
    356 particular logger has attached to it a particular handler.  For the
    357 purposes of this discussion, we can say that the logger represents the
    358 source, and the handler the destination, of a connection between the
    359 two.  Of course in the configured objects this is represented by the
    360 logger holding a reference to the handler.  In the configuration dict,
    361 this is done by giving each destination object an id which identifies
    362 it unambiguously, and then using the id in the source object's
    363 configuration to indicate that a connection exists between the source
    364 and the destination object with that id.
    365 
    366 So, for example, consider the following YAML snippet:
    367 
    368 .. code-block:: yaml
    369 
    370     formatters:
    371       brief:
    372         # configuration for formatter with id 'brief' goes here
    373       precise:
    374         # configuration for formatter with id 'precise' goes here
    375     handlers:
    376       h1: #This is an id
    377        # configuration of handler with id 'h1' goes here
    378        formatter: brief
    379       h2: #This is another id
    380        # configuration of handler with id 'h2' goes here
    381        formatter: precise
    382     loggers:
    383       foo.bar.baz:
    384         # other configuration for logger 'foo.bar.baz'
    385         handlers: [h1, h2]
    386 
    387 (Note: YAML used here because it's a little more readable than the
    388 equivalent Python source form for the dictionary.)
    389 
    390 The ids for loggers are the logger names which would be used
    391 programmatically to obtain a reference to those loggers, e.g.
    392 ``foo.bar.baz``.  The ids for Formatters and Filters can be any string
    393 value (such as ``brief``, ``precise`` above) and they are transient,
    394 in that they are only meaningful for processing the configuration
    395 dictionary and used to determine connections between objects, and are
    396 not persisted anywhere when the configuration call is complete.
    397 
    398 The above snippet indicates that logger named ``foo.bar.baz`` should
    399 have two handlers attached to it, which are described by the handler
    400 ids ``h1`` and ``h2``. The formatter for ``h1`` is that described by id
    401 ``brief``, and the formatter for ``h2`` is that described by id
    402 ``precise``.
    403 
    404 
    405 .. _logging-config-dict-userdef:
    406 
    407 User-defined objects
    408 """"""""""""""""""""
    409 
    410 The schema supports user-defined objects for handlers, filters and
    411 formatters.  (Loggers do not need to have different types for
    412 different instances, so there is no support in this configuration
    413 schema for user-defined logger classes.)
    414 
    415 Objects to be configured are described by dictionaries
    416 which detail their configuration.  In some places, the logging system
    417 will be able to infer from the context how an object is to be
    418 instantiated, but when a user-defined object is to be instantiated,
    419 the system will not know how to do this.  In order to provide complete
    420 flexibility for user-defined object instantiation, the user needs
    421 to provide a 'factory' - a callable which is called with a
    422 configuration dictionary and which returns the instantiated object.
    423 This is signalled by an absolute import path to the factory being
    424 made available under the special key ``'()'``.  Here's a concrete
    425 example:
    426 
    427 .. code-block:: yaml
    428 
    429     formatters:
    430       brief:
    431         format: '%(message)s'
    432       default:
    433         format: '%(asctime)s %(levelname)-8s %(name)-15s %(message)s'
    434         datefmt: '%Y-%m-%d %H:%M:%S'
    435       custom:
    436           (): my.package.customFormatterFactory
    437           bar: baz
    438           spam: 99.9
    439           answer: 42
    440 
    441 The above YAML snippet defines three formatters.  The first, with id
    442 ``brief``, is a standard :class:`logging.Formatter` instance with the
    443 specified format string.  The second, with id ``default``, has a
    444 longer format and also defines the time format explicitly, and will
    445 result in a :class:`logging.Formatter` initialized with those two format
    446 strings.  Shown in Python source form, the ``brief`` and ``default``
    447 formatters have configuration sub-dictionaries::
    448 
    449     {
    450       'format' : '%(message)s'
    451     }
    452 
    453 and::
    454 
    455     {
    456       'format' : '%(asctime)s %(levelname)-8s %(name)-15s %(message)s',
    457       'datefmt' : '%Y-%m-%d %H:%M:%S'
    458     }
    459 
    460 respectively, and as these dictionaries do not contain the special key
    461 ``'()'``, the instantiation is inferred from the context: as a result,
    462 standard :class:`logging.Formatter` instances are created.  The
    463 configuration sub-dictionary for the third formatter, with id
    464 ``custom``, is::
    465 
    466   {
    467     '()' : 'my.package.customFormatterFactory',
    468     'bar' : 'baz',
    469     'spam' : 99.9,
    470     'answer' : 42
    471   }
    472 
    473 and this contains the special key ``'()'``, which means that
    474 user-defined instantiation is wanted.  In this case, the specified
    475 factory callable will be used. If it is an actual callable it will be
    476 used directly - otherwise, if you specify a string (as in the example)
    477 the actual callable will be located using normal import mechanisms.
    478 The callable will be called with the **remaining** items in the
    479 configuration sub-dictionary as keyword arguments.  In the above
    480 example, the formatter with id ``custom`` will be assumed to be
    481 returned by the call::
    482 
    483     my.package.customFormatterFactory(bar='baz', spam=99.9, answer=42)
    484 
    485 The key ``'()'`` has been used as the special key because it is not a
    486 valid keyword parameter name, and so will not clash with the names of
    487 the keyword arguments used in the call.  The ``'()'`` also serves as a
    488 mnemonic that the corresponding value is a callable.
    489 
    490 
    491 .. _logging-config-dict-externalobj:
    492 
    493 Access to external objects
    494 """"""""""""""""""""""""""
    495 
    496 There are times where a configuration needs to refer to objects
    497 external to the configuration, for example ``sys.stderr``.  If the
    498 configuration dict is constructed using Python code, this is
    499 straightforward, but a problem arises when the configuration is
    500 provided via a text file (e.g. JSON, YAML).  In a text file, there is
    501 no standard way to distinguish ``sys.stderr`` from the literal string
    502 ``'sys.stderr'``.  To facilitate this distinction, the configuration
    503 system looks for certain special prefixes in string values and
    504 treat them specially.  For example, if the literal string
    505 ``'ext://sys.stderr'`` is provided as a value in the configuration,
    506 then the ``ext://`` will be stripped off and the remainder of the
    507 value processed using normal import mechanisms.
    508 
    509 The handling of such prefixes is done in a way analogous to protocol
    510 handling: there is a generic mechanism to look for prefixes which
    511 match the regular expression ``^(?P<prefix>[a-z]+)://(?P<suffix>.*)$``
    512 whereby, if the ``prefix`` is recognised, the ``suffix`` is processed
    513 in a prefix-dependent manner and the result of the processing replaces
    514 the string value.  If the prefix is not recognised, then the string
    515 value will be left as-is.
    516 
    517 
    518 .. _logging-config-dict-internalobj:
    519 
    520 Access to internal objects
    521 """"""""""""""""""""""""""
    522 
    523 As well as external objects, there is sometimes also a need to refer
    524 to objects in the configuration.  This will be done implicitly by the
    525 configuration system for things that it knows about.  For example, the
    526 string value ``'DEBUG'`` for a ``level`` in a logger or handler will
    527 automatically be converted to the value ``logging.DEBUG``, and the
    528 ``handlers``, ``filters`` and ``formatter`` entries will take an
    529 object id and resolve to the appropriate destination object.
    530 
    531 However, a more generic mechanism is needed for user-defined
    532 objects which are not known to the :mod:`logging` module.  For
    533 example, consider :class:`logging.handlers.MemoryHandler`, which takes
    534 a ``target`` argument which is another handler to delegate to. Since
    535 the system already knows about this class, then in the configuration,
    536 the given ``target`` just needs to be the object id of the relevant
    537 target handler, and the system will resolve to the handler from the
    538 id.  If, however, a user defines a ``my.package.MyHandler`` which has
    539 an ``alternate`` handler, the configuration system would not know that
    540 the ``alternate`` referred to a handler.  To cater for this, a generic
    541 resolution system allows the user to specify:
    542 
    543 .. code-block:: yaml
    544 
    545     handlers:
    546       file:
    547         # configuration of file handler goes here
    548 
    549       custom:
    550         (): my.package.MyHandler
    551         alternate: cfg://handlers.file
    552 
    553 The literal string ``'cfg://handlers.file'`` will be resolved in an
    554 analogous way to strings with the ``ext://`` prefix, but looking
    555 in the configuration itself rather than the import namespace.  The
    556 mechanism allows access by dot or by index, in a similar way to
    557 that provided by ``str.format``.  Thus, given the following snippet:
    558 
    559 .. code-block:: yaml
    560 
    561     handlers:
    562       email:
    563         class: logging.handlers.SMTPHandler
    564         mailhost: localhost
    565         fromaddr: my_app (a] domain.tld
    566         toaddrs:
    567           - support_team (a] domain.tld
    568           - dev_team (a] domain.tld
    569         subject: Houston, we have a problem.
    570 
    571 in the configuration, the string ``'cfg://handlers'`` would resolve to
    572 the dict with key ``handlers``, the string ``'cfg://handlers.email``
    573 would resolve to the dict with key ``email`` in the ``handlers`` dict,
    574 and so on.  The string ``'cfg://handlers.email.toaddrs[1]`` would
    575 resolve to ``'dev_team.domain.tld'`` and the string
    576 ``'cfg://handlers.email.toaddrs[0]'`` would resolve to the value
    577 ``'support_team (a] domain.tld'``. The ``subject`` value could be accessed
    578 using either ``'cfg://handlers.email.subject'`` or, equivalently,
    579 ``'cfg://handlers.email[subject]'``.  The latter form only needs to be
    580 used if the key contains spaces or non-alphanumeric characters.  If an
    581 index value consists only of decimal digits, access will be attempted
    582 using the corresponding integer value, falling back to the string
    583 value if needed.
    584 
    585 Given a string ``cfg://handlers.myhandler.mykey.123``, this will
    586 resolve to ``config_dict['handlers']['myhandler']['mykey']['123']``.
    587 If the string is specified as ``cfg://handlers.myhandler.mykey[123]``,
    588 the system will attempt to retrieve the value from
    589 ``config_dict['handlers']['myhandler']['mykey'][123]``, and fall back
    590 to ``config_dict['handlers']['myhandler']['mykey']['123']`` if that
    591 fails.
    592 
    593 
    594 .. _logging-import-resolution:
    595 
    596 Import resolution and custom importers
    597 """"""""""""""""""""""""""""""""""""""
    598 
    599 Import resolution, by default, uses the builtin :func:`__import__` function
    600 to do its importing. You may want to replace this with your own importing
    601 mechanism: if so, you can replace the :attr:`importer` attribute of the
    602 :class:`DictConfigurator` or its superclass, the
    603 :class:`BaseConfigurator` class. However, you need to be
    604 careful because of the way functions are accessed from classes via
    605 descriptors. If you are using a Python callable to do your imports, and you
    606 want to define it at class level rather than instance level, you need to wrap
    607 it with :func:`staticmethod`. For example::
    608 
    609    from importlib import import_module
    610    from logging.config import BaseConfigurator
    611 
    612    BaseConfigurator.importer = staticmethod(import_module)
    613 
    614 You don't need to wrap with :func:`staticmethod` if you're setting the import
    615 callable on a configurator *instance*.
    616 
    617 
    618 .. _logging-config-fileformat:
    619 
    620 Configuration file format
    621 ^^^^^^^^^^^^^^^^^^^^^^^^^
    622 
    623 The configuration file format understood by :func:`fileConfig` is based on
    624 :mod:`configparser` functionality. The file must contain sections called
    625 ``[loggers]``, ``[handlers]`` and ``[formatters]`` which identify by name the
    626 entities of each type which are defined in the file. For each such entity, there
    627 is a separate section which identifies how that entity is configured.  Thus, for
    628 a logger named ``log01`` in the ``[loggers]`` section, the relevant
    629 configuration details are held in a section ``[logger_log01]``. Similarly, a
    630 handler called ``hand01`` in the ``[handlers]`` section will have its
    631 configuration held in a section called ``[handler_hand01]``, while a formatter
    632 called ``form01`` in the ``[formatters]`` section will have its configuration
    633 specified in a section called ``[formatter_form01]``. The root logger
    634 configuration must be specified in a section called ``[logger_root]``.
    635 
    636 .. note::
    637 
    638    The :func:`fileConfig` API is older than the :func:`dictConfig` API and does
    639    not provide functionality to cover certain aspects of logging. For example,
    640    you cannot configure :class:`~logging.Filter` objects, which provide for
    641    filtering of messages beyond simple integer levels, using :func:`fileConfig`.
    642    If you need to have instances of :class:`~logging.Filter` in your logging
    643    configuration, you will need to use :func:`dictConfig`. Note that future
    644    enhancements to configuration functionality will be added to
    645    :func:`dictConfig`, so it's worth considering transitioning to this newer
    646    API when it's convenient to do so.
    647 
    648 Examples of these sections in the file are given below.
    649 
    650 .. code-block:: ini
    651 
    652    [loggers]
    653    keys=root,log02,log03,log04,log05,log06,log07
    654 
    655    [handlers]
    656    keys=hand01,hand02,hand03,hand04,hand05,hand06,hand07,hand08,hand09
    657 
    658    [formatters]
    659    keys=form01,form02,form03,form04,form05,form06,form07,form08,form09
    660 
    661 The root logger must specify a level and a list of handlers. An example of a
    662 root logger section is given below.
    663 
    664 .. code-block:: ini
    665 
    666    [logger_root]
    667    level=NOTSET
    668    handlers=hand01
    669 
    670 The ``level`` entry can be one of ``DEBUG, INFO, WARNING, ERROR, CRITICAL`` or
    671 ``NOTSET``. For the root logger only, ``NOTSET`` means that all messages will be
    672 logged. Level values are :func:`eval`\ uated in the context of the ``logging``
    673 package's namespace.
    674 
    675 The ``handlers`` entry is a comma-separated list of handler names, which must
    676 appear in the ``[handlers]`` section. These names must appear in the
    677 ``[handlers]`` section and have corresponding sections in the configuration
    678 file.
    679 
    680 For loggers other than the root logger, some additional information is required.
    681 This is illustrated by the following example.
    682 
    683 .. code-block:: ini
    684 
    685    [logger_parser]
    686    level=DEBUG
    687    handlers=hand01
    688    propagate=1
    689    qualname=compiler.parser
    690 
    691 The ``level`` and ``handlers`` entries are interpreted as for the root logger,
    692 except that if a non-root logger's level is specified as ``NOTSET``, the system
    693 consults loggers higher up the hierarchy to determine the effective level of the
    694 logger. The ``propagate`` entry is set to 1 to indicate that messages must
    695 propagate to handlers higher up the logger hierarchy from this logger, or 0 to
    696 indicate that messages are **not** propagated to handlers up the hierarchy. The
    697 ``qualname`` entry is the hierarchical channel name of the logger, that is to
    698 say the name used by the application to get the logger.
    699 
    700 Sections which specify handler configuration are exemplified by the following.
    701 
    702 .. code-block:: ini
    703 
    704    [handler_hand01]
    705    class=StreamHandler
    706    level=NOTSET
    707    formatter=form01
    708    args=(sys.stdout,)
    709 
    710 The ``class`` entry indicates the handler's class (as determined by :func:`eval`
    711 in the ``logging`` package's namespace). The ``level`` is interpreted as for
    712 loggers, and ``NOTSET`` is taken to mean 'log everything'.
    713 
    714 The ``formatter`` entry indicates the key name of the formatter for this
    715 handler. If blank, a default formatter (``logging._defaultFormatter``) is used.
    716 If a name is specified, it must appear in the ``[formatters]`` section and have
    717 a corresponding section in the configuration file.
    718 
    719 The ``args`` entry, when :func:`eval`\ uated in the context of the ``logging``
    720 package's namespace, is the list of arguments to the constructor for the handler
    721 class. Refer to the constructors for the relevant handlers, or to the examples
    722 below, to see how typical entries are constructed. If not provided, it defaults
    723 to ``()``.
    724 
    725 The optional ``kwargs`` entry, when :func:`eval`\ uated in the context of the
    726 ``logging`` package's namespace, is the keyword argument dict to the constructor
    727 for the handler class. If not provided, it defaults to ``{}``.
    728 
    729 .. code-block:: ini
    730 
    731    [handler_hand02]
    732    class=FileHandler
    733    level=DEBUG
    734    formatter=form02
    735    args=('python.log', 'w')
    736 
    737    [handler_hand03]
    738    class=handlers.SocketHandler
    739    level=INFO
    740    formatter=form03
    741    args=('localhost', handlers.DEFAULT_TCP_LOGGING_PORT)
    742 
    743    [handler_hand04]
    744    class=handlers.DatagramHandler
    745    level=WARN
    746    formatter=form04
    747    args=('localhost', handlers.DEFAULT_UDP_LOGGING_PORT)
    748 
    749    [handler_hand05]
    750    class=handlers.SysLogHandler
    751    level=ERROR
    752    formatter=form05
    753    args=(('localhost', handlers.SYSLOG_UDP_PORT), handlers.SysLogHandler.LOG_USER)
    754 
    755    [handler_hand06]
    756    class=handlers.NTEventLogHandler
    757    level=CRITICAL
    758    formatter=form06
    759    args=('Python Application', '', 'Application')
    760 
    761    [handler_hand07]
    762    class=handlers.SMTPHandler
    763    level=WARN
    764    formatter=form07
    765    args=('localhost', 'from@abc', ['user1@abc', 'user2@xyz'], 'Logger Subject')
    766    kwargs={'timeout': 10.0}
    767 
    768    [handler_hand08]
    769    class=handlers.MemoryHandler
    770    level=NOTSET
    771    formatter=form08
    772    target=
    773    args=(10, ERROR)
    774 
    775    [handler_hand09]
    776    class=handlers.HTTPHandler
    777    level=NOTSET
    778    formatter=form09
    779    args=('localhost:9022', '/log', 'GET')
    780    kwargs={'secure': True}
    781 
    782 Sections which specify formatter configuration are typified by the following.
    783 
    784 .. code-block:: ini
    785 
    786    [formatter_form01]
    787    format=F1 %(asctime)s %(levelname)s %(message)s
    788    datefmt=
    789    class=logging.Formatter
    790 
    791 The ``format`` entry is the overall format string, and the ``datefmt`` entry is
    792 the :func:`strftime`\ -compatible date/time format string.  If empty, the
    793 package substitutes something which is almost equivalent to specifying the date
    794 format string ``'%Y-%m-%d %H:%M:%S'``.  This format also specifies milliseconds,
    795 which are appended to the result of using the above format string, with a comma
    796 separator.  An example time in this format is ``2003-01-23 00:29:50,411``.
    797 
    798 The ``class`` entry is optional.  It indicates the name of the formatter's class
    799 (as a dotted module and class name.)  This option is useful for instantiating a
    800 :class:`~logging.Formatter` subclass.  Subclasses of
    801 :class:`~logging.Formatter` can present exception tracebacks in an expanded or
    802 condensed format.
    803 
    804 .. note::
    805 
    806    Due to the use of :func:`eval` as described above, there are
    807    potential security risks which result from using the :func:`listen` to send
    808    and receive configurations via sockets. The risks are limited to where
    809    multiple users with no mutual trust run code on the same machine; see the
    810    :func:`listen` documentation for more information.
    811 
    812 .. seealso::
    813 
    814    Module :mod:`logging`
    815       API reference for the logging module.
    816 
    817    Module :mod:`logging.handlers`
    818       Useful handlers included with the logging module.
    819