1:mod:`logging.config` --- Logging configuration 2=============================================== 3 4.. module:: logging.config 5 :synopsis: Configuration of the logging module. 6 7.. moduleauthor:: Vinay Sajip <[email protected]> 8.. sectionauthor:: Vinay Sajip <[email protected]> 9 10**Source code:** :source:`Lib/logging/config.py` 11 12.. sidebar:: Important 13 14 This page contains only reference information. For tutorials, 15 please see 16 17 * :ref:`Basic Tutorial <logging-basic-tutorial>` 18 * :ref:`Advanced Tutorial <logging-advanced-tutorial>` 19 * :ref:`Logging Cookbook <logging-cookbook>` 20 21-------------- 22 23This section describes the API for configuring the logging module. 24 25.. _logging-config-api: 26 27Configuration functions 28^^^^^^^^^^^^^^^^^^^^^^^ 29 30The following functions configure the logging module. They are located in the 31:mod:`logging.config` module. Their use is optional --- you can configure the 32logging module using these functions or by making calls to the main API (defined 33in :mod:`logging` itself) and defining handlers which are declared either in 34:mod:`logging` or :mod:`logging.handlers`. 35 36.. function:: dictConfig(config) 37 38 Takes the logging configuration from a dictionary. The contents of 39 this dictionary are described in :ref:`logging-config-dictschema` 40 below. 41 42 If an error is encountered during configuration, this function will 43 raise a :exc:`ValueError`, :exc:`TypeError`, :exc:`AttributeError` 44 or :exc:`ImportError` with a suitably descriptive message. The 45 following is a (possibly incomplete) list of conditions which will 46 raise an error: 47 48 * A ``level`` which is not a string or which is a string not 49 corresponding to an actual logging level. 50 * A ``propagate`` value which is not a boolean. 51 * An id which does not have a corresponding destination. 52 * A non-existent handler id found during an incremental call. 53 * An invalid logger name. 54 * Inability to resolve to an internal or external object. 55 56 Parsing is performed by the :class:`DictConfigurator` class, whose 57 constructor is passed the dictionary used for configuration, and 58 has a :meth:`configure` method. The :mod:`logging.config` module 59 has a callable attribute :attr:`dictConfigClass` 60 which is initially set to :class:`DictConfigurator`. 61 You can replace the value of :attr:`dictConfigClass` with a 62 suitable implementation of your own. 63 64 :func:`dictConfig` calls :attr:`dictConfigClass` passing 65 the specified dictionary, and then calls the :meth:`configure` method on 66 the returned object to put the configuration into effect:: 67 68 def dictConfig(config): 69 dictConfigClass(config).configure() 70 71 For example, a subclass of :class:`DictConfigurator` could call 72 ``DictConfigurator.__init__()`` in its own :meth:`__init__()`, then 73 set up custom prefixes which would be usable in the subsequent 74 :meth:`configure` call. :attr:`dictConfigClass` would be bound to 75 this new subclass, and then :func:`dictConfig` could be called exactly as 76 in the default, uncustomized state. 77 78 .. versionadded:: 3.2 79 80.. function:: fileConfig(fname, defaults=None, disable_existing_loggers=True, encoding=None) 81 82 Reads the logging configuration from a :mod:`configparser`\-format file. The 83 format of the file should be as described in 84 :ref:`logging-config-fileformat`. 85 This function can be called several times from an application, allowing an 86 end user to select from various pre-canned configurations (if the developer 87 provides a mechanism to present the choices and load the chosen 88 configuration). 89 90 It will raise :exc:`FileNotFoundError` if the file 91 doesn't exist and :exc:`RuntimeError` if the file is invalid or 92 empty. 93 94 :param fname: A filename, or a file-like object, or an instance derived 95 from :class:`~configparser.RawConfigParser`. If a 96 ``RawConfigParser``-derived instance is passed, it is used as 97 is. Otherwise, a :class:`~configparser.Configparser` is 98 instantiated, and the configuration read by it from the 99 object passed in ``fname``. If that has a :meth:`readline` 100 method, it is assumed to be a file-like object and read using 101 :meth:`~configparser.ConfigParser.read_file`; otherwise, 102 it is assumed to be a filename and passed to 103 :meth:`~configparser.ConfigParser.read`. 104 105 106 :param defaults: Defaults to be passed to the ConfigParser can be specified 107 in this argument. 108 109 :param disable_existing_loggers: If specified as ``False``, loggers which 110 exist when this call is made are left 111 enabled. The default is ``True`` because this 112 enables old behaviour in a 113 backward-compatible way. This behaviour is to 114 disable any existing non-root loggers unless 115 they or their ancestors are explicitly named 116 in the logging configuration. 117 118 :param encoding: The encoding used to open file when *fname* is filename. 119 120 .. versionchanged:: 3.4 121 An instance of a subclass of :class:`~configparser.RawConfigParser` is 122 now accepted as a value for ``fname``. This facilitates: 123 124 * Use of a configuration file where logging configuration is just part 125 of the overall application configuration. 126 * Use of a configuration read from a file, and then modified by the using 127 application (e.g. based on command-line parameters or other aspects 128 of the runtime environment) before being passed to ``fileConfig``. 129 130 .. versionadded:: 3.10 131 The *encoding* parameter is added. 132 133 .. versionchanged:: 3.11.4 134 An exception will be thrown if the provided file 135 doesn't exist or is invalid or empty. 136 137.. function:: listen(port=DEFAULT_LOGGING_CONFIG_PORT, verify=None) 138 139 Starts up a socket server on the specified port, and listens for new 140 configurations. If no port is specified, the module's default 141 :const:`DEFAULT_LOGGING_CONFIG_PORT` is used. Logging configurations will be 142 sent as a file suitable for processing by :func:`dictConfig` or 143 :func:`fileConfig`. Returns a :class:`~threading.Thread` instance on which 144 you can call :meth:`~threading.Thread.start` to start the server, and which 145 you can :meth:`~threading.Thread.join` when appropriate. To stop the server, 146 call :func:`stopListening`. 147 148 The ``verify`` argument, if specified, should be a callable which should 149 verify whether bytes received across the socket are valid and should be 150 processed. This could be done by encrypting and/or signing what is sent 151 across the socket, such that the ``verify`` callable can perform 152 signature verification and/or decryption. The ``verify`` callable is called 153 with a single argument - the bytes received across the socket - and should 154 return the bytes to be processed, or ``None`` to indicate that the bytes should 155 be discarded. The returned bytes could be the same as the passed in bytes 156 (e.g. when only verification is done), or they could be completely different 157 (perhaps if decryption were performed). 158 159 To send a configuration to the socket, read in the configuration file and 160 send it to the socket as a sequence of bytes preceded by a four-byte length 161 string packed in binary using ``struct.pack('>L', n)``. 162 163 .. _logging-eval-security: 164 165 .. note:: 166 167 Because portions of the configuration are passed through 168 :func:`eval`, use of this function may open its users to a security risk. 169 While the function only binds to a socket on ``localhost``, and so does 170 not accept connections from remote machines, there are scenarios where 171 untrusted code could be run under the account of the process which calls 172 :func:`listen`. Specifically, if the process calling :func:`listen` runs 173 on a multi-user machine where users cannot trust each other, then a 174 malicious user could arrange to run essentially arbitrary code in a 175 victim user's process, simply by connecting to the victim's 176 :func:`listen` socket and sending a configuration which runs whatever 177 code the attacker wants to have executed in the victim's process. This is 178 especially easy to do if the default port is used, but not hard even if a 179 different port is used. To avoid the risk of this happening, use the 180 ``verify`` argument to :func:`listen` to prevent unrecognised 181 configurations from being applied. 182 183 .. versionchanged:: 3.4 184 The ``verify`` argument was added. 185 186 .. note:: 187 188 If you want to send configurations to the listener which don't 189 disable existing loggers, you will need to use a JSON format for 190 the configuration, which will use :func:`dictConfig` for configuration. 191 This method allows you to specify ``disable_existing_loggers`` as 192 ``False`` in the configuration you send. 193 194 195.. function:: stopListening() 196 197 Stops the listening server which was created with a call to :func:`listen`. 198 This is typically called before calling :meth:`join` on the return value from 199 :func:`listen`. 200 201 202Security considerations 203^^^^^^^^^^^^^^^^^^^^^^^ 204 205The logging configuration functionality tries to offer convenience, and in part this 206is done by offering the ability to convert text in configuration files into Python 207objects used in logging configuration - for example, as described in 208:ref:`logging-config-dict-userdef`. However, these same mechanisms (importing 209callables from user-defined modules and calling them with parameters from the 210configuration) could be used to invoke any code you like, and for this reason you 211should treat configuration files from untrusted sources with *extreme caution* and 212satisfy yourself that nothing bad can happen if you load them, before actually loading 213them. 214 215 216.. _logging-config-dictschema: 217 218Configuration dictionary schema 219^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 220 221Describing a logging configuration requires listing the various 222objects to create and the connections between them; for example, you 223may create a handler named 'console' and then say that the logger 224named 'startup' will send its messages to the 'console' handler. 225These objects aren't limited to those provided by the :mod:`logging` 226module because you might write your own formatter or handler class. 227The parameters to these classes may also need to include external 228objects such as ``sys.stderr``. The syntax for describing these 229objects and connections is defined in :ref:`logging-config-dict-connections` 230below. 231 232Dictionary Schema Details 233""""""""""""""""""""""""" 234 235The dictionary passed to :func:`dictConfig` must contain the following 236keys: 237 238* *version* - to be set to an integer value representing the schema 239 version. The only valid value at present is 1, but having this key 240 allows the schema to evolve while still preserving backwards 241 compatibility. 242 243All other keys are optional, but if present they will be interpreted 244as described below. In all cases below where a 'configuring dict' is 245mentioned, it will be checked for the special ``'()'`` key to see if a 246custom instantiation is required. If so, the mechanism described in 247:ref:`logging-config-dict-userdef` below is used to create an instance; 248otherwise, the context is used to determine what to instantiate. 249 250.. _logging-config-dictschema-formatters: 251 252* *formatters* - the corresponding value will be a dict in which each 253 key is a formatter id and each value is a dict describing how to 254 configure the corresponding :class:`~logging.Formatter` instance. 255 256 The configuring dict is searched for the following optional keys 257 which correspond to the arguments passed to create a 258 :class:`~logging.Formatter` object: 259 260 * ``format`` 261 * ``datefmt`` 262 * ``style`` 263 * ``validate`` (since version >=3.8) 264 265 An optional ``class`` key indicates the name of the formatter's 266 class (as a dotted module and class name). The instantiation 267 arguments are as for :class:`~logging.Formatter`, thus this key is 268 most useful for instantiating a customised subclass of 269 :class:`~logging.Formatter`. For example, the alternative class 270 might present exception tracebacks in an expanded or condensed 271 format. If your formatter requires different or extra configuration 272 keys, you should use :ref:`logging-config-dict-userdef`. 273 274* *filters* - the corresponding value will be a dict in which each key 275 is a filter id and each value is a dict describing how to configure 276 the corresponding Filter instance. 277 278 The configuring dict is searched for the key ``name`` (defaulting to the 279 empty string) and this is used to construct a :class:`logging.Filter` 280 instance. 281 282* *handlers* - the corresponding value will be a dict in which each 283 key is a handler id and each value is a dict describing how to 284 configure the corresponding Handler instance. 285 286 The configuring dict is searched for the following keys: 287 288 * ``class`` (mandatory). This is the fully qualified name of the 289 handler class. 290 291 * ``level`` (optional). The level of the handler. 292 293 * ``formatter`` (optional). The id of the formatter for this 294 handler. 295 296 * ``filters`` (optional). A list of ids of the filters for this 297 handler. 298 299 .. versionchanged:: 3.11 300 ``filters`` can take filter instances in addition to ids. 301 302 All *other* keys are passed through as keyword arguments to the 303 handler's constructor. For example, given the snippet: 304 305 .. code-block:: yaml 306 307 handlers: 308 console: 309 class : logging.StreamHandler 310 formatter: brief 311 level : INFO 312 filters: [allow_foo] 313 stream : ext://sys.stdout 314 file: 315 class : logging.handlers.RotatingFileHandler 316 formatter: precise 317 filename: logconfig.log 318 maxBytes: 1024 319 backupCount: 3 320 321 the handler with id ``console`` is instantiated as a 322 :class:`logging.StreamHandler`, using ``sys.stdout`` as the underlying 323 stream. The handler with id ``file`` is instantiated as a 324 :class:`logging.handlers.RotatingFileHandler` with the keyword arguments 325 ``filename='logconfig.log', maxBytes=1024, backupCount=3``. 326 327* *loggers* - the corresponding value will be a dict in which each key 328 is a logger name and each value is a dict describing how to 329 configure the corresponding Logger instance. 330 331 The configuring dict is searched for the following keys: 332 333 * ``level`` (optional). The level of the logger. 334 335 * ``propagate`` (optional). The propagation setting of the logger. 336 337 * ``filters`` (optional). A list of ids of the filters for this 338 logger. 339 340 .. versionchanged:: 3.11 341 ``filters`` can take filter instances in addition to ids. 342 343 * ``handlers`` (optional). A list of ids of the handlers for this 344 logger. 345 346 The specified loggers will be configured according to the level, 347 propagation, filters and handlers specified. 348 349* *root* - this will be the configuration for the root logger. 350 Processing of the configuration will be as for any logger, except 351 that the ``propagate`` setting will not be applicable. 352 353* *incremental* - whether the configuration is to be interpreted as 354 incremental to the existing configuration. This value defaults to 355 ``False``, which means that the specified configuration replaces the 356 existing configuration with the same semantics as used by the 357 existing :func:`fileConfig` API. 358 359 If the specified value is ``True``, the configuration is processed 360 as described in the section on :ref:`logging-config-dict-incremental`. 361 362* *disable_existing_loggers* - whether any existing non-root loggers are 363 to be disabled. This setting mirrors the parameter of the same name in 364 :func:`fileConfig`. If absent, this parameter defaults to ``True``. 365 This value is ignored if *incremental* is ``True``. 366 367.. _logging-config-dict-incremental: 368 369Incremental Configuration 370""""""""""""""""""""""""" 371 372It is difficult to provide complete flexibility for incremental 373configuration. For example, because objects such as filters 374and formatters are anonymous, once a configuration is set up, it is 375not possible to refer to such anonymous objects when augmenting a 376configuration. 377 378Furthermore, there is not a compelling case for arbitrarily altering 379the object graph of loggers, handlers, filters, formatters at 380run-time, once a configuration is set up; the verbosity of loggers and 381handlers can be controlled just by setting levels (and, in the case of 382loggers, propagation flags). Changing the object graph arbitrarily in 383a safe way is problematic in a multi-threaded environment; while not 384impossible, the benefits are not worth the complexity it adds to the 385implementation. 386 387Thus, when the ``incremental`` key of a configuration dict is present 388and is ``True``, the system will completely ignore any ``formatters`` and 389``filters`` entries, and process only the ``level`` 390settings in the ``handlers`` entries, and the ``level`` and 391``propagate`` settings in the ``loggers`` and ``root`` entries. 392 393Using a value in the configuration dict lets configurations to be sent 394over the wire as pickled dicts to a socket listener. Thus, the logging 395verbosity of a long-running application can be altered over time with 396no need to stop and restart the application. 397 398.. _logging-config-dict-connections: 399 400Object connections 401"""""""""""""""""" 402 403The schema describes a set of logging objects - loggers, 404handlers, formatters, filters - which are connected to each other in 405an object graph. Thus, the schema needs to represent connections 406between the objects. For example, say that, once configured, a 407particular logger has attached to it a particular handler. For the 408purposes of this discussion, we can say that the logger represents the 409source, and the handler the destination, of a connection between the 410two. Of course in the configured objects this is represented by the 411logger holding a reference to the handler. In the configuration dict, 412this is done by giving each destination object an id which identifies 413it unambiguously, and then using the id in the source object's 414configuration to indicate that a connection exists between the source 415and the destination object with that id. 416 417So, for example, consider the following YAML snippet: 418 419.. code-block:: yaml 420 421 formatters: 422 brief: 423 # configuration for formatter with id 'brief' goes here 424 precise: 425 # configuration for formatter with id 'precise' goes here 426 handlers: 427 h1: #This is an id 428 # configuration of handler with id 'h1' goes here 429 formatter: brief 430 h2: #This is another id 431 # configuration of handler with id 'h2' goes here 432 formatter: precise 433 loggers: 434 foo.bar.baz: 435 # other configuration for logger 'foo.bar.baz' 436 handlers: [h1, h2] 437 438(Note: YAML used here because it's a little more readable than the 439equivalent Python source form for the dictionary.) 440 441The ids for loggers are the logger names which would be used 442programmatically to obtain a reference to those loggers, e.g. 443``foo.bar.baz``. The ids for Formatters and Filters can be any string 444value (such as ``brief``, ``precise`` above) and they are transient, 445in that they are only meaningful for processing the configuration 446dictionary and used to determine connections between objects, and are 447not persisted anywhere when the configuration call is complete. 448 449The above snippet indicates that logger named ``foo.bar.baz`` should 450have two handlers attached to it, which are described by the handler 451ids ``h1`` and ``h2``. The formatter for ``h1`` is that described by id 452``brief``, and the formatter for ``h2`` is that described by id 453``precise``. 454 455 456.. _logging-config-dict-userdef: 457 458User-defined objects 459"""""""""""""""""""" 460 461The schema supports user-defined objects for handlers, filters and 462formatters. (Loggers do not need to have different types for 463different instances, so there is no support in this configuration 464schema for user-defined logger classes.) 465 466Objects to be configured are described by dictionaries 467which detail their configuration. In some places, the logging system 468will be able to infer from the context how an object is to be 469instantiated, but when a user-defined object is to be instantiated, 470the system will not know how to do this. In order to provide complete 471flexibility for user-defined object instantiation, the user needs 472to provide a 'factory' - a callable which is called with a 473configuration dictionary and which returns the instantiated object. 474This is signalled by an absolute import path to the factory being 475made available under the special key ``'()'``. Here's a concrete 476example: 477 478.. code-block:: yaml 479 480 formatters: 481 brief: 482 format: '%(message)s' 483 default: 484 format: '%(asctime)s %(levelname)-8s %(name)-15s %(message)s' 485 datefmt: '%Y-%m-%d %H:%M:%S' 486 custom: 487 (): my.package.customFormatterFactory 488 bar: baz 489 spam: 99.9 490 answer: 42 491 492The above YAML snippet defines three formatters. The first, with id 493``brief``, is a standard :class:`logging.Formatter` instance with the 494specified format string. The second, with id ``default``, has a 495longer format and also defines the time format explicitly, and will 496result in a :class:`logging.Formatter` initialized with those two format 497strings. Shown in Python source form, the ``brief`` and ``default`` 498formatters have configuration sub-dictionaries:: 499 500 { 501 'format' : '%(message)s' 502 } 503 504and:: 505 506 { 507 'format' : '%(asctime)s %(levelname)-8s %(name)-15s %(message)s', 508 'datefmt' : '%Y-%m-%d %H:%M:%S' 509 } 510 511respectively, and as these dictionaries do not contain the special key 512``'()'``, the instantiation is inferred from the context: as a result, 513standard :class:`logging.Formatter` instances are created. The 514configuration sub-dictionary for the third formatter, with id 515``custom``, is:: 516 517 { 518 '()' : 'my.package.customFormatterFactory', 519 'bar' : 'baz', 520 'spam' : 99.9, 521 'answer' : 42 522 } 523 524and this contains the special key ``'()'``, which means that 525user-defined instantiation is wanted. In this case, the specified 526factory callable will be used. If it is an actual callable it will be 527used directly - otherwise, if you specify a string (as in the example) 528the actual callable will be located using normal import mechanisms. 529The callable will be called with the **remaining** items in the 530configuration sub-dictionary as keyword arguments. In the above 531example, the formatter with id ``custom`` will be assumed to be 532returned by the call:: 533 534 my.package.customFormatterFactory(bar='baz', spam=99.9, answer=42) 535 536.. warning:: The values for keys such as ``bar``, ``spam`` and ``answer`` in 537 the above example should not be configuration dictionaries or references such 538 as ``cfg://foo`` or ``ext://bar``, because they will not be processed by the 539 configuration machinery, but passed to the callable as-is. 540 541The key ``'()'`` has been used as the special key because it is not a 542valid keyword parameter name, and so will not clash with the names of 543the keyword arguments used in the call. The ``'()'`` also serves as a 544mnemonic that the corresponding value is a callable. 545 546 .. versionchanged:: 3.11 547 The ``filters`` member of ``handlers`` and ``loggers`` can take 548 filter instances in addition to ids. 549 550You can also specify a special key ``'.'`` whose value is a dictionary is a 551mapping of attribute names to values. If found, the specified attributes will 552be set on the user-defined object before it is returned. Thus, with the 553following configuration:: 554 555 { 556 '()' : 'my.package.customFormatterFactory', 557 'bar' : 'baz', 558 'spam' : 99.9, 559 'answer' : 42, 560 '.' { 561 'foo': 'bar', 562 'baz': 'bozz' 563 } 564 } 565 566the returned formatter will have attribute ``foo`` set to ``'bar'`` and 567attribute ``baz`` set to ``'bozz'``. 568 569.. warning:: The values for attributes such as ``foo`` and ``baz`` in 570 the above example should not be configuration dictionaries or references such 571 as ``cfg://foo`` or ``ext://bar``, because they will not be processed by the 572 configuration machinery, but set as attribute values as-is. 573 574 575.. _handler-config-dict-order: 576 577Handler configuration order 578""""""""""""""""""""""""""" 579 580Handlers are configured in alphabetical order of their keys, and a configured 581handler replaces the configuration dictionary in (a working copy of) the 582``handlers`` dictionary in the schema. If you use a construct such as 583``cfg://handlers.foo``, then initially ``handlers['foo']`` points to the 584configuration dictionary for the handler named ``foo``, and later (once that 585handler has been configured) it points to the configured handler instance. 586Thus, ``cfg://handlers.foo`` could resolve to either a dictionary or a handler 587instance. In general, it is wise to name handlers in a way such that dependent 588handlers are configured _after_ any handlers they depend on; that allows 589something like ``cfg://handlers.foo`` to be used in configuring a handler that 590depends on handler ``foo``. If that dependent handler were named ``bar``, 591problems would result, because the configuration of ``bar`` would be attempted 592before that of ``foo``, and ``foo`` would not yet have been configured. 593However, if the dependent handler were named ``foobar``, it would be configured 594after ``foo``, with the result that ``cfg://handlers.foo`` would resolve to 595configured handler ``foo``, and not its configuration dictionary. 596 597 598.. _logging-config-dict-externalobj: 599 600Access to external objects 601"""""""""""""""""""""""""" 602 603There are times where a configuration needs to refer to objects 604external to the configuration, for example ``sys.stderr``. If the 605configuration dict is constructed using Python code, this is 606straightforward, but a problem arises when the configuration is 607provided via a text file (e.g. JSON, YAML). In a text file, there is 608no standard way to distinguish ``sys.stderr`` from the literal string 609``'sys.stderr'``. To facilitate this distinction, the configuration 610system looks for certain special prefixes in string values and 611treat them specially. For example, if the literal string 612``'ext://sys.stderr'`` is provided as a value in the configuration, 613then the ``ext://`` will be stripped off and the remainder of the 614value processed using normal import mechanisms. 615 616The handling of such prefixes is done in a way analogous to protocol 617handling: there is a generic mechanism to look for prefixes which 618match the regular expression ``^(?P<prefix>[a-z]+)://(?P<suffix>.*)$`` 619whereby, if the ``prefix`` is recognised, the ``suffix`` is processed 620in a prefix-dependent manner and the result of the processing replaces 621the string value. If the prefix is not recognised, then the string 622value will be left as-is. 623 624 625.. _logging-config-dict-internalobj: 626 627Access to internal objects 628"""""""""""""""""""""""""" 629 630As well as external objects, there is sometimes also a need to refer 631to objects in the configuration. This will be done implicitly by the 632configuration system for things that it knows about. For example, the 633string value ``'DEBUG'`` for a ``level`` in a logger or handler will 634automatically be converted to the value ``logging.DEBUG``, and the 635``handlers``, ``filters`` and ``formatter`` entries will take an 636object id and resolve to the appropriate destination object. 637 638However, a more generic mechanism is needed for user-defined 639objects which are not known to the :mod:`logging` module. For 640example, consider :class:`logging.handlers.MemoryHandler`, which takes 641a ``target`` argument which is another handler to delegate to. Since 642the system already knows about this class, then in the configuration, 643the given ``target`` just needs to be the object id of the relevant 644target handler, and the system will resolve to the handler from the 645id. If, however, a user defines a ``my.package.MyHandler`` which has 646an ``alternate`` handler, the configuration system would not know that 647the ``alternate`` referred to a handler. To cater for this, a generic 648resolution system allows the user to specify: 649 650.. code-block:: yaml 651 652 handlers: 653 file: 654 # configuration of file handler goes here 655 656 custom: 657 (): my.package.MyHandler 658 alternate: cfg://handlers.file 659 660The literal string ``'cfg://handlers.file'`` will be resolved in an 661analogous way to strings with the ``ext://`` prefix, but looking 662in the configuration itself rather than the import namespace. The 663mechanism allows access by dot or by index, in a similar way to 664that provided by ``str.format``. Thus, given the following snippet: 665 666.. code-block:: yaml 667 668 handlers: 669 email: 670 class: logging.handlers.SMTPHandler 671 mailhost: localhost 672 fromaddr: [email protected] 673 toaddrs: 674 - [email protected] 675 - [email protected] 676 subject: Houston, we have a problem. 677 678in the configuration, the string ``'cfg://handlers'`` would resolve to 679the dict with key ``handlers``, the string ``'cfg://handlers.email`` 680would resolve to the dict with key ``email`` in the ``handlers`` dict, 681and so on. The string ``'cfg://handlers.email.toaddrs[1]`` would 682resolve to ``'[email protected]'`` and the string 683``'cfg://handlers.email.toaddrs[0]'`` would resolve to the value 684``'[email protected]'``. The ``subject`` value could be accessed 685using either ``'cfg://handlers.email.subject'`` or, equivalently, 686``'cfg://handlers.email[subject]'``. The latter form only needs to be 687used if the key contains spaces or non-alphanumeric characters. If an 688index value consists only of decimal digits, access will be attempted 689using the corresponding integer value, falling back to the string 690value if needed. 691 692Given a string ``cfg://handlers.myhandler.mykey.123``, this will 693resolve to ``config_dict['handlers']['myhandler']['mykey']['123']``. 694If the string is specified as ``cfg://handlers.myhandler.mykey[123]``, 695the system will attempt to retrieve the value from 696``config_dict['handlers']['myhandler']['mykey'][123]``, and fall back 697to ``config_dict['handlers']['myhandler']['mykey']['123']`` if that 698fails. 699 700 701.. _logging-import-resolution: 702 703Import resolution and custom importers 704"""""""""""""""""""""""""""""""""""""" 705 706Import resolution, by default, uses the builtin :func:`__import__` function 707to do its importing. You may want to replace this with your own importing 708mechanism: if so, you can replace the :attr:`importer` attribute of the 709:class:`DictConfigurator` or its superclass, the 710:class:`BaseConfigurator` class. However, you need to be 711careful because of the way functions are accessed from classes via 712descriptors. If you are using a Python callable to do your imports, and you 713want to define it at class level rather than instance level, you need to wrap 714it with :func:`staticmethod`. For example:: 715 716 from importlib import import_module 717 from logging.config import BaseConfigurator 718 719 BaseConfigurator.importer = staticmethod(import_module) 720 721You don't need to wrap with :func:`staticmethod` if you're setting the import 722callable on a configurator *instance*. 723 724 725.. _logging-config-fileformat: 726 727Configuration file format 728^^^^^^^^^^^^^^^^^^^^^^^^^ 729 730The configuration file format understood by :func:`fileConfig` is based on 731:mod:`configparser` functionality. The file must contain sections called 732``[loggers]``, ``[handlers]`` and ``[formatters]`` which identify by name the 733entities of each type which are defined in the file. For each such entity, there 734is a separate section which identifies how that entity is configured. Thus, for 735a logger named ``log01`` in the ``[loggers]`` section, the relevant 736configuration details are held in a section ``[logger_log01]``. Similarly, a 737handler called ``hand01`` in the ``[handlers]`` section will have its 738configuration held in a section called ``[handler_hand01]``, while a formatter 739called ``form01`` in the ``[formatters]`` section will have its configuration 740specified in a section called ``[formatter_form01]``. The root logger 741configuration must be specified in a section called ``[logger_root]``. 742 743.. note:: 744 745 The :func:`fileConfig` API is older than the :func:`dictConfig` API and does 746 not provide functionality to cover certain aspects of logging. For example, 747 you cannot configure :class:`~logging.Filter` objects, which provide for 748 filtering of messages beyond simple integer levels, using :func:`fileConfig`. 749 If you need to have instances of :class:`~logging.Filter` in your logging 750 configuration, you will need to use :func:`dictConfig`. Note that future 751 enhancements to configuration functionality will be added to 752 :func:`dictConfig`, so it's worth considering transitioning to this newer 753 API when it's convenient to do so. 754 755Examples of these sections in the file are given below. 756 757.. code-block:: ini 758 759 [loggers] 760 keys=root,log02,log03,log04,log05,log06,log07 761 762 [handlers] 763 keys=hand01,hand02,hand03,hand04,hand05,hand06,hand07,hand08,hand09 764 765 [formatters] 766 keys=form01,form02,form03,form04,form05,form06,form07,form08,form09 767 768The root logger must specify a level and a list of handlers. An example of a 769root logger section is given below. 770 771.. code-block:: ini 772 773 [logger_root] 774 level=NOTSET 775 handlers=hand01 776 777The ``level`` entry can be one of ``DEBUG, INFO, WARNING, ERROR, CRITICAL`` or 778``NOTSET``. For the root logger only, ``NOTSET`` means that all messages will be 779logged. Level values are :ref:`evaluated <func-eval>` in the context of the ``logging`` 780package's namespace. 781 782The ``handlers`` entry is a comma-separated list of handler names, which must 783appear in the ``[handlers]`` section. These names must appear in the 784``[handlers]`` section and have corresponding sections in the configuration 785file. 786 787For loggers other than the root logger, some additional information is required. 788This is illustrated by the following example. 789 790.. code-block:: ini 791 792 [logger_parser] 793 level=DEBUG 794 handlers=hand01 795 propagate=1 796 qualname=compiler.parser 797 798The ``level`` and ``handlers`` entries are interpreted as for the root logger, 799except that if a non-root logger's level is specified as ``NOTSET``, the system 800consults loggers higher up the hierarchy to determine the effective level of the 801logger. The ``propagate`` entry is set to 1 to indicate that messages must 802propagate to handlers higher up the logger hierarchy from this logger, or 0 to 803indicate that messages are **not** propagated to handlers up the hierarchy. The 804``qualname`` entry is the hierarchical channel name of the logger, that is to 805say the name used by the application to get the logger. 806 807Sections which specify handler configuration are exemplified by the following. 808 809.. code-block:: ini 810 811 [handler_hand01] 812 class=StreamHandler 813 level=NOTSET 814 formatter=form01 815 args=(sys.stdout,) 816 817The ``class`` entry indicates the handler's class (as determined by :func:`eval` 818in the ``logging`` package's namespace). The ``level`` is interpreted as for 819loggers, and ``NOTSET`` is taken to mean 'log everything'. 820 821The ``formatter`` entry indicates the key name of the formatter for this 822handler. If blank, a default formatter (``logging._defaultFormatter``) is used. 823If a name is specified, it must appear in the ``[formatters]`` section and have 824a corresponding section in the configuration file. 825 826The ``args`` entry, when :ref:`evaluated <func-eval>` in the context of the ``logging`` 827package's namespace, is the list of arguments to the constructor for the handler 828class. Refer to the constructors for the relevant handlers, or to the examples 829below, to see how typical entries are constructed. If not provided, it defaults 830to ``()``. 831 832The optional ``kwargs`` entry, when :ref:`evaluated <func-eval>` in the context of the 833``logging`` package's namespace, is the keyword argument dict to the constructor 834for the handler class. If not provided, it defaults to ``{}``. 835 836.. code-block:: ini 837 838 [handler_hand02] 839 class=FileHandler 840 level=DEBUG 841 formatter=form02 842 args=('python.log', 'w') 843 844 [handler_hand03] 845 class=handlers.SocketHandler 846 level=INFO 847 formatter=form03 848 args=('localhost', handlers.DEFAULT_TCP_LOGGING_PORT) 849 850 [handler_hand04] 851 class=handlers.DatagramHandler 852 level=WARN 853 formatter=form04 854 args=('localhost', handlers.DEFAULT_UDP_LOGGING_PORT) 855 856 [handler_hand05] 857 class=handlers.SysLogHandler 858 level=ERROR 859 formatter=form05 860 args=(('localhost', handlers.SYSLOG_UDP_PORT), handlers.SysLogHandler.LOG_USER) 861 862 [handler_hand06] 863 class=handlers.NTEventLogHandler 864 level=CRITICAL 865 formatter=form06 866 args=('Python Application', '', 'Application') 867 868 [handler_hand07] 869 class=handlers.SMTPHandler 870 level=WARN 871 formatter=form07 872 args=('localhost', 'from@abc', ['user1@abc', 'user2@xyz'], 'Logger Subject') 873 kwargs={'timeout': 10.0} 874 875 [handler_hand08] 876 class=handlers.MemoryHandler 877 level=NOTSET 878 formatter=form08 879 target= 880 args=(10, ERROR) 881 882 [handler_hand09] 883 class=handlers.HTTPHandler 884 level=NOTSET 885 formatter=form09 886 args=('localhost:9022', '/log', 'GET') 887 kwargs={'secure': True} 888 889Sections which specify formatter configuration are typified by the following. 890 891.. code-block:: ini 892 893 [formatter_form01] 894 format=F1 %(asctime)s %(levelname)s %(message)s 895 datefmt= 896 style=% 897 validate=True 898 class=logging.Formatter 899 900The arguments for the formatter configuration are the same as the keys 901in the dictionary schema :ref:`formatters section 902<logging-config-dictschema-formatters>`. 903 904.. note:: 905 906 Due to the use of :func:`eval` as described above, there are 907 potential security risks which result from using the :func:`listen` to send 908 and receive configurations via sockets. The risks are limited to where 909 multiple users with no mutual trust run code on the same machine; see the 910 :func:`listen` documentation for more information. 911 912.. seealso:: 913 914 Module :mod:`logging` 915 API reference for the logging module. 916 917 Module :mod:`logging.handlers` 918 Useful handlers included with the logging module. 919