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