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