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