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