• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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@red-dove.com>
8.. sectionauthor:: Vinay Sajip <vinay_sajip@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
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                 :class:`!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 :class:`!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    .. versionchanged:: 3.10
131       Added the *encoding* parameter.
132
133    .. versionchanged:: 3.12
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  * ``defaults`` (since version >=3.12)
265
266  An optional ``class`` key indicates the name of the formatter's
267  class (as a dotted module and class name).  The instantiation
268  arguments are as for :class:`~logging.Formatter`, thus this key is
269  most useful for instantiating a customised subclass of
270  :class:`~logging.Formatter`.  For example, the alternative class
271  might present exception tracebacks in an expanded or condensed
272  format.  If your formatter requires different or extra configuration
273  keys, you should use :ref:`logging-config-dict-userdef`.
274
275* *filters* - the corresponding value will be a dict in which each key
276  is a filter id and each value is a dict describing how to configure
277  the corresponding Filter instance.
278
279  The configuring dict is searched for the key ``name`` (defaulting to the
280  empty string) and this is used to construct a :class:`logging.Filter`
281  instance.
282
283* *handlers* - the corresponding value will be a dict in which each
284  key is a handler id and each value is a dict describing how to
285  configure the corresponding Handler instance.
286
287  The configuring dict is searched for the following keys:
288
289  * ``class`` (mandatory).  This is the fully qualified name of the
290    handler class.
291
292  * ``level`` (optional).  The level of the handler.
293
294  * ``formatter`` (optional).  The id of the formatter for this
295    handler.
296
297  * ``filters`` (optional).  A list of ids of the filters for this
298    handler.
299
300    .. versionchanged:: 3.11
301       ``filters`` can take filter instances in addition to ids.
302
303  All *other* keys are passed through as keyword arguments to the
304  handler's constructor.  For example, given the snippet:
305
306  .. code-block:: yaml
307
308      handlers:
309        console:
310          class : logging.StreamHandler
311          formatter: brief
312          level   : INFO
313          filters: [allow_foo]
314          stream  : ext://sys.stdout
315        file:
316          class : logging.handlers.RotatingFileHandler
317          formatter: precise
318          filename: logconfig.log
319          maxBytes: 1024
320          backupCount: 3
321
322  the handler with id ``console`` is instantiated as a
323  :class:`logging.StreamHandler`, using ``sys.stdout`` as the underlying
324  stream.  The handler with id ``file`` is instantiated as a
325  :class:`logging.handlers.RotatingFileHandler` with the keyword arguments
326  ``filename='logconfig.log', maxBytes=1024, backupCount=3``.
327
328* *loggers* - the corresponding value will be a dict in which each key
329  is a logger name and each value is a dict describing how to
330  configure the corresponding Logger instance.
331
332  The configuring dict is searched for the following keys:
333
334  * ``level`` (optional).  The level of the logger.
335
336  * ``propagate`` (optional).  The propagation setting of the logger.
337
338  * ``filters`` (optional).  A list of ids of the filters for this
339    logger.
340
341    .. versionchanged:: 3.11
342       ``filters`` can take filter instances in addition to ids.
343
344  * ``handlers`` (optional).  A list of ids of the handlers for this
345    logger.
346
347  The specified loggers will be configured according to the level,
348  propagation, filters and handlers specified.
349
350* *root* - this will be the configuration for the root logger.
351  Processing of the configuration will be as for any logger, except
352  that the ``propagate`` setting will not be applicable.
353
354* *incremental* - whether the configuration is to be interpreted as
355  incremental to the existing configuration.  This value defaults to
356  ``False``, which means that the specified configuration replaces the
357  existing configuration with the same semantics as used by the
358  existing :func:`fileConfig` API.
359
360  If the specified value is ``True``, the configuration is processed
361  as described in the section on :ref:`logging-config-dict-incremental`.
362
363* *disable_existing_loggers* - whether any existing non-root loggers are
364  to be disabled. This setting mirrors the parameter of the same name in
365  :func:`fileConfig`. If absent, this parameter defaults to ``True``.
366  This value is ignored if *incremental* is ``True``.
367
368.. _logging-config-dict-incremental:
369
370Incremental Configuration
371"""""""""""""""""""""""""
372
373It is difficult to provide complete flexibility for incremental
374configuration.  For example, because objects such as filters
375and formatters are anonymous, once a configuration is set up, it is
376not possible to refer to such anonymous objects when augmenting a
377configuration.
378
379Furthermore, there is not a compelling case for arbitrarily altering
380the object graph of loggers, handlers, filters, formatters at
381run-time, once a configuration is set up; the verbosity of loggers and
382handlers can be controlled just by setting levels (and, in the case of
383loggers, propagation flags).  Changing the object graph arbitrarily in
384a safe way is problematic in a multi-threaded environment; while not
385impossible, the benefits are not worth the complexity it adds to the
386implementation.
387
388Thus, when the ``incremental`` key of a configuration dict is present
389and is ``True``, the system will completely ignore any ``formatters`` and
390``filters`` entries, and process only the ``level``
391settings in the ``handlers`` entries, and the ``level`` and
392``propagate`` settings in the ``loggers`` and ``root`` entries.
393
394Using a value in the configuration dict lets configurations to be sent
395over the wire as pickled dicts to a socket listener. Thus, the logging
396verbosity of a long-running application can be altered over time with
397no need to stop and restart the application.
398
399.. _logging-config-dict-connections:
400
401Object connections
402""""""""""""""""""
403
404The schema describes a set of logging objects - loggers,
405handlers, formatters, filters - which are connected to each other in
406an object graph.  Thus, the schema needs to represent connections
407between the objects.  For example, say that, once configured, a
408particular logger has attached to it a particular handler.  For the
409purposes of this discussion, we can say that the logger represents the
410source, and the handler the destination, of a connection between the
411two.  Of course in the configured objects this is represented by the
412logger holding a reference to the handler.  In the configuration dict,
413this is done by giving each destination object an id which identifies
414it unambiguously, and then using the id in the source object's
415configuration to indicate that a connection exists between the source
416and the destination object with that id.
417
418So, for example, consider the following YAML snippet:
419
420.. code-block:: yaml
421
422    formatters:
423      brief:
424        # configuration for formatter with id 'brief' goes here
425      precise:
426        # configuration for formatter with id 'precise' goes here
427    handlers:
428      h1: #This is an id
429       # configuration of handler with id 'h1' goes here
430       formatter: brief
431      h2: #This is another id
432       # configuration of handler with id 'h2' goes here
433       formatter: precise
434    loggers:
435      foo.bar.baz:
436        # other configuration for logger 'foo.bar.baz'
437        handlers: [h1, h2]
438
439(Note: YAML used here because it's a little more readable than the
440equivalent Python source form for the dictionary.)
441
442The ids for loggers are the logger names which would be used
443programmatically to obtain a reference to those loggers, e.g.
444``foo.bar.baz``.  The ids for Formatters and Filters can be any string
445value (such as ``brief``, ``precise`` above) and they are transient,
446in that they are only meaningful for processing the configuration
447dictionary and used to determine connections between objects, and are
448not persisted anywhere when the configuration call is complete.
449
450The above snippet indicates that logger named ``foo.bar.baz`` should
451have two handlers attached to it, which are described by the handler
452ids ``h1`` and ``h2``. The formatter for ``h1`` is that described by id
453``brief``, and the formatter for ``h2`` is that described by id
454``precise``.
455
456
457.. _logging-config-dict-userdef:
458
459User-defined objects
460""""""""""""""""""""
461
462The schema supports user-defined objects for handlers, filters and
463formatters.  (Loggers do not need to have different types for
464different instances, so there is no support in this configuration
465schema for user-defined logger classes.)
466
467Objects to be configured are described by dictionaries
468which detail their configuration.  In some places, the logging system
469will be able to infer from the context how an object is to be
470instantiated, but when a user-defined object is to be instantiated,
471the system will not know how to do this.  In order to provide complete
472flexibility for user-defined object instantiation, the user needs
473to provide a 'factory' - a callable which is called with a
474configuration dictionary and which returns the instantiated object.
475This is signalled by an absolute import path to the factory being
476made available under the special key ``'()'``.  Here's a concrete
477example:
478
479.. code-block:: yaml
480
481    formatters:
482      brief:
483        format: '%(message)s'
484      default:
485        format: '%(asctime)s %(levelname)-8s %(name)-15s %(message)s'
486        datefmt: '%Y-%m-%d %H:%M:%S'
487      custom:
488          (): my.package.customFormatterFactory
489          bar: baz
490          spam: 99.9
491          answer: 42
492
493The above YAML snippet defines three formatters.  The first, with id
494``brief``, is a standard :class:`logging.Formatter` instance with the
495specified format string.  The second, with id ``default``, has a
496longer format and also defines the time format explicitly, and will
497result in a :class:`logging.Formatter` initialized with those two format
498strings.  Shown in Python source form, the ``brief`` and ``default``
499formatters have configuration sub-dictionaries::
500
501    {
502      'format' : '%(message)s'
503    }
504
505and::
506
507    {
508      'format' : '%(asctime)s %(levelname)-8s %(name)-15s %(message)s',
509      'datefmt' : '%Y-%m-%d %H:%M:%S'
510    }
511
512respectively, and as these dictionaries do not contain the special key
513``'()'``, the instantiation is inferred from the context: as a result,
514standard :class:`logging.Formatter` instances are created.  The
515configuration sub-dictionary for the third formatter, with id
516``custom``, is::
517
518  {
519    '()' : 'my.package.customFormatterFactory',
520    'bar' : 'baz',
521    'spam' : 99.9,
522    'answer' : 42
523  }
524
525and this contains the special key ``'()'``, which means that
526user-defined instantiation is wanted.  In this case, the specified
527factory callable will be used. If it is an actual callable it will be
528used directly - otherwise, if you specify a string (as in the example)
529the actual callable will be located using normal import mechanisms.
530The callable will be called with the **remaining** items in the
531configuration sub-dictionary as keyword arguments.  In the above
532example, the formatter with id ``custom`` will be assumed to be
533returned by the call::
534
535    my.package.customFormatterFactory(bar='baz', spam=99.9, answer=42)
536
537.. warning:: The values for keys such as ``bar``, ``spam`` and ``answer`` in
538   the above example should not be configuration dictionaries or references such
539   as ``cfg://foo`` or ``ext://bar``, because they will not be processed by the
540   configuration machinery, but passed to the callable as-is.
541
542The key ``'()'`` has been used as the special key because it is not a
543valid keyword parameter name, and so will not clash with the names of
544the keyword arguments used in the call.  The ``'()'`` also serves as a
545mnemonic that the corresponding value is a callable.
546
547.. versionchanged:: 3.11
548   The ``filters`` member of ``handlers`` and ``loggers`` can take
549   filter instances in addition to ids.
550
551You can also specify a special key ``'.'`` whose value is a dictionary is a
552mapping of attribute names to values. If found, the specified attributes will
553be set on the user-defined object before it is returned. Thus, with the
554following configuration::
555
556    {
557      '()' : 'my.package.customFormatterFactory',
558      'bar' : 'baz',
559      'spam' : 99.9,
560      'answer' : 42,
561      '.' {
562        'foo': 'bar',
563        'baz': 'bozz'
564      }
565    }
566
567the returned formatter will have attribute ``foo`` set to ``'bar'`` and
568attribute ``baz`` set to ``'bozz'``.
569
570.. warning:: The values for attributes such as ``foo`` and ``baz`` in
571   the above example should not be configuration dictionaries or references such
572   as ``cfg://foo`` or ``ext://bar``, because they will not be processed by the
573   configuration machinery, but set as attribute values as-is.
574
575
576.. _handler-config-dict-order:
577
578Handler configuration order
579"""""""""""""""""""""""""""
580
581Handlers are configured in alphabetical order of their keys, and a configured
582handler replaces the configuration dictionary in (a working copy of) the
583``handlers`` dictionary in the schema. If you use a construct such as
584``cfg://handlers.foo``, then initially ``handlers['foo']`` points to the
585configuration dictionary for the handler named ``foo``, and later (once that
586handler has been configured) it points to the configured handler instance.
587Thus, ``cfg://handlers.foo`` could resolve to either a dictionary or a handler
588instance. In general, it is wise to name handlers in a way such that dependent
589handlers are configured _after_ any handlers they depend on; that allows
590something like ``cfg://handlers.foo`` to be used in configuring a handler that
591depends on handler ``foo``. If that dependent handler were named ``bar``,
592problems would result, because the configuration of ``bar`` would be attempted
593before that of ``foo``, and ``foo`` would not yet have been configured.
594However, if the dependent handler were named ``foobar``, it would be configured
595after ``foo``, with the result that ``cfg://handlers.foo`` would resolve to
596configured handler ``foo``, and not its configuration dictionary.
597
598
599.. _logging-config-dict-externalobj:
600
601Access to external objects
602""""""""""""""""""""""""""
603
604There are times where a configuration needs to refer to objects
605external to the configuration, for example ``sys.stderr``.  If the
606configuration dict is constructed using Python code, this is
607straightforward, but a problem arises when the configuration is
608provided via a text file (e.g. JSON, YAML).  In a text file, there is
609no standard way to distinguish ``sys.stderr`` from the literal string
610``'sys.stderr'``.  To facilitate this distinction, the configuration
611system looks for certain special prefixes in string values and
612treat them specially.  For example, if the literal string
613``'ext://sys.stderr'`` is provided as a value in the configuration,
614then the ``ext://`` will be stripped off and the remainder of the
615value processed using normal import mechanisms.
616
617The handling of such prefixes is done in a way analogous to protocol
618handling: there is a generic mechanism to look for prefixes which
619match the regular expression ``^(?P<prefix>[a-z]+)://(?P<suffix>.*)$``
620whereby, if the ``prefix`` is recognised, the ``suffix`` is processed
621in a prefix-dependent manner and the result of the processing replaces
622the string value.  If the prefix is not recognised, then the string
623value will be left as-is.
624
625
626.. _logging-config-dict-internalobj:
627
628Access to internal objects
629""""""""""""""""""""""""""
630
631As well as external objects, there is sometimes also a need to refer
632to objects in the configuration.  This will be done implicitly by the
633configuration system for things that it knows about.  For example, the
634string value ``'DEBUG'`` for a ``level`` in a logger or handler will
635automatically be converted to the value ``logging.DEBUG``, and the
636``handlers``, ``filters`` and ``formatter`` entries will take an
637object id and resolve to the appropriate destination object.
638
639However, a more generic mechanism is needed for user-defined
640objects which are not known to the :mod:`logging` module.  For
641example, consider :class:`logging.handlers.MemoryHandler`, which takes
642a ``target`` argument which is another handler to delegate to. Since
643the system already knows about this class, then in the configuration,
644the given ``target`` just needs to be the object id of the relevant
645target handler, and the system will resolve to the handler from the
646id.  If, however, a user defines a ``my.package.MyHandler`` which has
647an ``alternate`` handler, the configuration system would not know that
648the ``alternate`` referred to a handler.  To cater for this, a generic
649resolution system allows the user to specify:
650
651.. code-block:: yaml
652
653    handlers:
654      file:
655        # configuration of file handler goes here
656
657      custom:
658        (): my.package.MyHandler
659        alternate: cfg://handlers.file
660
661The literal string ``'cfg://handlers.file'`` will be resolved in an
662analogous way to strings with the ``ext://`` prefix, but looking
663in the configuration itself rather than the import namespace.  The
664mechanism allows access by dot or by index, in a similar way to
665that provided by ``str.format``.  Thus, given the following snippet:
666
667.. code-block:: yaml
668
669    handlers:
670      email:
671        class: logging.handlers.SMTPHandler
672        mailhost: localhost
673        fromaddr: my_app@domain.tld
674        toaddrs:
675          - support_team@domain.tld
676          - dev_team@domain.tld
677        subject: Houston, we have a problem.
678
679in the configuration, the string ``'cfg://handlers'`` would resolve to
680the dict with key ``handlers``, the string ``'cfg://handlers.email``
681would resolve to the dict with key ``email`` in the ``handlers`` dict,
682and so on.  The string ``'cfg://handlers.email.toaddrs[1]`` would
683resolve to ``'dev_team@domain.tld'`` and the string
684``'cfg://handlers.email.toaddrs[0]'`` would resolve to the value
685``'support_team@domain.tld'``. The ``subject`` value could be accessed
686using either ``'cfg://handlers.email.subject'`` or, equivalently,
687``'cfg://handlers.email[subject]'``.  The latter form only needs to be
688used if the key contains spaces or non-alphanumeric characters. Please note
689that the characters ``[`` and ``]`` are not allowed in the keys. If an
690index value consists only of decimal digits, access will be attempted
691using the corresponding integer value, falling back to the string
692value if needed.
693
694Given a string ``cfg://handlers.myhandler.mykey.123``, this will
695resolve to ``config_dict['handlers']['myhandler']['mykey']['123']``.
696If the string is specified as ``cfg://handlers.myhandler.mykey[123]``,
697the system will attempt to retrieve the value from
698``config_dict['handlers']['myhandler']['mykey'][123]``, and fall back
699to ``config_dict['handlers']['myhandler']['mykey']['123']`` if that
700fails.
701
702
703.. _logging-import-resolution:
704
705Import resolution and custom importers
706""""""""""""""""""""""""""""""""""""""
707
708Import resolution, by default, uses the builtin :func:`__import__` function
709to do its importing. You may want to replace this with your own importing
710mechanism: if so, you can replace the :attr:`importer` attribute of the
711:class:`DictConfigurator` or its superclass, the
712:class:`BaseConfigurator` class. However, you need to be
713careful because of the way functions are accessed from classes via
714descriptors. If you are using a Python callable to do your imports, and you
715want to define it at class level rather than instance level, you need to wrap
716it with :func:`staticmethod`. For example::
717
718   from importlib import import_module
719   from logging.config import BaseConfigurator
720
721   BaseConfigurator.importer = staticmethod(import_module)
722
723You don't need to wrap with :func:`staticmethod` if you're setting the import
724callable on a configurator *instance*.
725
726.. _configure-queue:
727
728Configuring QueueHandler and QueueListener
729""""""""""""""""""""""""""""""""""""""""""
730
731If you want to configure a :class:`~logging.handlers.QueueHandler`, noting that this
732is normally used in conjunction with a :class:`~logging.handlers.QueueListener`, you
733can configure both together. After the configuration, the ``QueueListener`` instance
734will be available as the :attr:`~logging.handlers.QueueHandler.listener` attribute of
735the created handler, and that in turn will be available to you using
736:func:`~logging.getHandlerByName` and passing the name you have used for the
737``QueueHandler`` in your configuration. The dictionary schema for configuring the pair
738is shown in the example YAML snippet below.
739
740.. code-block:: yaml
741
742    handlers:
743      qhand:
744        class: logging.handlers.QueueHandler
745        queue: my.module.queue_factory
746        listener: my.package.CustomListener
747        handlers:
748          - hand_name_1
749          - hand_name_2
750          ...
751
752The ``queue`` and ``listener`` keys are optional.
753
754If the ``queue`` key is present, the corresponding value can be one of the following:
755
756* An object implementing the :meth:`Queue.put_nowait <queue.Queue.put_nowait>`
757  and :meth:`Queue.get <queue.Queue.get>` public API. For instance, this may be
758  an actual instance of :class:`queue.Queue` or a subclass thereof, or a proxy
759  obtained by :meth:`multiprocessing.managers.SyncManager.Queue`.
760
761  This is of course only possible if you are constructing or modifying
762  the configuration dictionary in code.
763
764* A string that resolves to a callable which, when called with no arguments, returns
765  the queue instance to use. That callable could be a :class:`queue.Queue` subclass
766  or a function which returns a suitable queue instance,
767  such as ``my.module.queue_factory()``.
768
769* A dict with a ``'()'`` key which is constructed in the usual way as discussed in
770  :ref:`logging-config-dict-userdef`. The result of this construction should be a
771  :class:`queue.Queue` instance.
772
773If the  ``queue`` key is absent, a standard unbounded :class:`queue.Queue` instance is
774created and used.
775
776If the ``listener`` key is present, the corresponding value can be one of the following:
777
778* A subclass of :class:`logging.handlers.QueueListener`. This is of course only
779  possible if you are constructing or modifying the configuration dictionary in
780  code.
781
782* A string which resolves to a class which is a subclass of ``QueueListener``, such as
783  ``'my.package.CustomListener'``.
784
785* A dict with a ``'()'`` key which is constructed in the usual way as discussed in
786  :ref:`logging-config-dict-userdef`. The result of this construction should be a
787  callable with the same signature as the ``QueueListener`` initializer.
788
789If the ``listener`` key is absent, :class:`logging.handlers.QueueListener` is used.
790
791The values under the ``handlers`` key are the names of other handlers in the
792configuration (not shown in the above snippet) which will be passed to the queue
793listener.
794
795Any custom queue handler and listener classes will need to be defined with the same
796initialization signatures as :class:`~logging.handlers.QueueHandler` and
797:class:`~logging.handlers.QueueListener`.
798
799.. versionadded:: 3.12
800
801.. _logging-config-fileformat:
802
803Configuration file format
804^^^^^^^^^^^^^^^^^^^^^^^^^
805
806The configuration file format understood by :func:`fileConfig` is based on
807:mod:`configparser` functionality. The file must contain sections called
808``[loggers]``, ``[handlers]`` and ``[formatters]`` which identify by name the
809entities of each type which are defined in the file. For each such entity, there
810is a separate section which identifies how that entity is configured.  Thus, for
811a logger named ``log01`` in the ``[loggers]`` section, the relevant
812configuration details are held in a section ``[logger_log01]``. Similarly, a
813handler called ``hand01`` in the ``[handlers]`` section will have its
814configuration held in a section called ``[handler_hand01]``, while a formatter
815called ``form01`` in the ``[formatters]`` section will have its configuration
816specified in a section called ``[formatter_form01]``. The root logger
817configuration must be specified in a section called ``[logger_root]``.
818
819.. note::
820
821   The :func:`fileConfig` API is older than the :func:`dictConfig` API and does
822   not provide functionality to cover certain aspects of logging. For example,
823   you cannot configure :class:`~logging.Filter` objects, which provide for
824   filtering of messages beyond simple integer levels, using :func:`fileConfig`.
825   If you need to have instances of :class:`~logging.Filter` in your logging
826   configuration, you will need to use :func:`dictConfig`. Note that future
827   enhancements to configuration functionality will be added to
828   :func:`dictConfig`, so it's worth considering transitioning to this newer
829   API when it's convenient to do so.
830
831Examples of these sections in the file are given below.
832
833.. code-block:: ini
834
835   [loggers]
836   keys=root,log02,log03,log04,log05,log06,log07
837
838   [handlers]
839   keys=hand01,hand02,hand03,hand04,hand05,hand06,hand07,hand08,hand09
840
841   [formatters]
842   keys=form01,form02,form03,form04,form05,form06,form07,form08,form09
843
844The root logger must specify a level and a list of handlers. An example of a
845root logger section is given below.
846
847.. code-block:: ini
848
849   [logger_root]
850   level=NOTSET
851   handlers=hand01
852
853The ``level`` entry can be one of ``DEBUG, INFO, WARNING, ERROR, CRITICAL`` or
854``NOTSET``. For the root logger only, ``NOTSET`` means that all messages will be
855logged. Level values are :ref:`evaluated <func-eval>` in the context of the ``logging``
856package's namespace.
857
858The ``handlers`` entry is a comma-separated list of handler names, which must
859appear in the ``[handlers]`` section. These names must appear in the
860``[handlers]`` section and have corresponding sections in the configuration
861file.
862
863For loggers other than the root logger, some additional information is required.
864This is illustrated by the following example.
865
866.. code-block:: ini
867
868   [logger_parser]
869   level=DEBUG
870   handlers=hand01
871   propagate=1
872   qualname=compiler.parser
873
874The ``level`` and ``handlers`` entries are interpreted as for the root logger,
875except that if a non-root logger's level is specified as ``NOTSET``, the system
876consults loggers higher up the hierarchy to determine the effective level of the
877logger. The ``propagate`` entry is set to 1 to indicate that messages must
878propagate to handlers higher up the logger hierarchy from this logger, or 0 to
879indicate that messages are **not** propagated to handlers up the hierarchy. The
880``qualname`` entry is the hierarchical channel name of the logger, that is to
881say the name used by the application to get the logger.
882
883Sections which specify handler configuration are exemplified by the following.
884
885.. code-block:: ini
886
887   [handler_hand01]
888   class=StreamHandler
889   level=NOTSET
890   formatter=form01
891   args=(sys.stdout,)
892
893The ``class`` entry indicates the handler's class (as determined by :func:`eval`
894in the ``logging`` package's namespace). The ``level`` is interpreted as for
895loggers, and ``NOTSET`` is taken to mean 'log everything'.
896
897The ``formatter`` entry indicates the key name of the formatter for this
898handler. If blank, a default formatter (``logging._defaultFormatter``) is used.
899If a name is specified, it must appear in the ``[formatters]`` section and have
900a corresponding section in the configuration file.
901
902The ``args`` entry, when :ref:`evaluated <func-eval>` in the context of the ``logging``
903package's namespace, is the list of arguments to the constructor for the handler
904class. Refer to the constructors for the relevant handlers, or to the examples
905below, to see how typical entries are constructed. If not provided, it defaults
906to ``()``.
907
908The optional ``kwargs`` entry, when :ref:`evaluated <func-eval>` in the context of the
909``logging`` package's namespace, is the keyword argument dict to the constructor
910for the handler class. If not provided, it defaults to ``{}``.
911
912.. code-block:: ini
913
914   [handler_hand02]
915   class=FileHandler
916   level=DEBUG
917   formatter=form02
918   args=('python.log', 'w')
919
920   [handler_hand03]
921   class=handlers.SocketHandler
922   level=INFO
923   formatter=form03
924   args=('localhost', handlers.DEFAULT_TCP_LOGGING_PORT)
925
926   [handler_hand04]
927   class=handlers.DatagramHandler
928   level=WARN
929   formatter=form04
930   args=('localhost', handlers.DEFAULT_UDP_LOGGING_PORT)
931
932   [handler_hand05]
933   class=handlers.SysLogHandler
934   level=ERROR
935   formatter=form05
936   args=(('localhost', handlers.SYSLOG_UDP_PORT), handlers.SysLogHandler.LOG_USER)
937
938   [handler_hand06]
939   class=handlers.NTEventLogHandler
940   level=CRITICAL
941   formatter=form06
942   args=('Python Application', '', 'Application')
943
944   [handler_hand07]
945   class=handlers.SMTPHandler
946   level=WARN
947   formatter=form07
948   args=('localhost', 'from@abc', ['user1@abc', 'user2@xyz'], 'Logger Subject')
949   kwargs={'timeout': 10.0}
950
951   [handler_hand08]
952   class=handlers.MemoryHandler
953   level=NOTSET
954   formatter=form08
955   target=
956   args=(10, ERROR)
957
958   [handler_hand09]
959   class=handlers.HTTPHandler
960   level=NOTSET
961   formatter=form09
962   args=('localhost:9022', '/log', 'GET')
963   kwargs={'secure': True}
964
965Sections which specify formatter configuration are typified by the following.
966
967.. code-block:: ini
968
969   [formatter_form01]
970   format=F1 %(asctime)s %(levelname)s %(message)s %(customfield)s
971   datefmt=
972   style=%
973   validate=True
974   defaults={'customfield': 'defaultvalue'}
975   class=logging.Formatter
976
977The arguments for the formatter configuration are the same as the keys
978in the dictionary schema :ref:`formatters section
979<logging-config-dictschema-formatters>`.
980
981The ``defaults`` entry, when :ref:`evaluated <func-eval>` in the context of
982the ``logging`` package's namespace, is a dictionary of default values for
983custom formatting fields. If not provided, it defaults to ``None``.
984
985
986.. note::
987
988   Due to the use of :func:`eval` as described above, there are
989   potential security risks which result from using the :func:`listen` to send
990   and receive configurations via sockets. The risks are limited to where
991   multiple users with no mutual trust run code on the same machine; see the
992   :func:`listen` documentation for more information.
993
994.. seealso::
995
996   Module :mod:`logging`
997      API reference for the logging module.
998
999   Module :mod:`logging.handlers`
1000      Useful handlers included with the logging module.
1001