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