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