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