symbian-qemu-0.9.1-12/python-2.6.1/Doc/library/logging.rst
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     1 :mod:`logging` --- Logging facility for Python
       
     2 ==============================================
       
     3 
       
     4 .. module:: logging
       
     5    :synopsis: Flexible error logging system for applications.
       
     6 
       
     7 
       
     8 .. moduleauthor:: Vinay Sajip <vinay_sajip@red-dove.com>
       
     9 .. sectionauthor:: Vinay Sajip <vinay_sajip@red-dove.com>
       
    10 
       
    11 
       
    12 .. index:: pair: Errors; logging
       
    13 
       
    14 .. versionadded:: 2.3
       
    15 
       
    16 This module defines functions and classes which implement a flexible error
       
    17 logging system for applications.
       
    18 
       
    19 Logging is performed by calling methods on instances of the :class:`Logger`
       
    20 class (hereafter called :dfn:`loggers`). Each instance has a name, and they are
       
    21 conceptually arranged in a namespace hierarchy using dots (periods) as
       
    22 separators. For example, a logger named "scan" is the parent of loggers
       
    23 "scan.text", "scan.html" and "scan.pdf". Logger names can be anything you want,
       
    24 and indicate the area of an application in which a logged message originates.
       
    25 
       
    26 Logged messages also have levels of importance associated with them. The default
       
    27 levels provided are :const:`DEBUG`, :const:`INFO`, :const:`WARNING`,
       
    28 :const:`ERROR` and :const:`CRITICAL`. As a convenience, you indicate the
       
    29 importance of a logged message by calling an appropriate method of
       
    30 :class:`Logger`. The methods are :meth:`debug`, :meth:`info`, :meth:`warning`,
       
    31 :meth:`error` and :meth:`critical`, which mirror the default levels. You are not
       
    32 constrained to use these levels: you can specify your own and use a more general
       
    33 :class:`Logger` method, :meth:`log`, which takes an explicit level argument.
       
    34 
       
    35 
       
    36 Logging tutorial
       
    37 ----------------
       
    38 
       
    39 The key benefit of having the logging API provided by a standard library module
       
    40 is that all Python modules can participate in logging, so your application log
       
    41 can include messages from third-party modules.
       
    42 
       
    43 It is, of course, possible to log messages with different verbosity levels or to
       
    44 different destinations.  Support for writing log messages to files, HTTP
       
    45 GET/POST locations, email via SMTP, generic sockets, or OS-specific logging
       
    46 mechanisms are all supported by the standard module.  You can also create your
       
    47 own log destination class if you have special requirements not met by any of the
       
    48 built-in classes.
       
    49 
       
    50 Simple examples
       
    51 ^^^^^^^^^^^^^^^
       
    52 
       
    53 .. sectionauthor:: Doug Hellmann
       
    54 .. (see <http://blog.doughellmann.com/2007/05/pymotw-logging.html>)
       
    55 
       
    56 Most applications are probably going to want to log to a file, so let's start
       
    57 with that case. Using the :func:`basicConfig` function, we can set up the
       
    58 default handler so that debug messages are written to a file::
       
    59 
       
    60    import logging
       
    61    LOG_FILENAME = '/tmp/logging_example.out'
       
    62    logging.basicConfig(filename=LOG_FILENAME,level=logging.DEBUG,)
       
    63 
       
    64    logging.debug('This message should go to the log file')
       
    65 
       
    66 And now if we open the file and look at what we have, we should find the log
       
    67 message::
       
    68 
       
    69    DEBUG:root:This message should go to the log file
       
    70 
       
    71 If you run the script repeatedly, the additional log messages are appended to
       
    72 the file.  To create a new file each time, you can pass a filemode argument to
       
    73 :func:`basicConfig` with a value of ``'w'``.  Rather than managing the file size
       
    74 yourself, though, it is simpler to use a :class:`RotatingFileHandler`::
       
    75 
       
    76    import glob
       
    77    import logging
       
    78    import logging.handlers
       
    79 
       
    80    LOG_FILENAME = '/tmp/logging_rotatingfile_example.out'
       
    81 
       
    82    # Set up a specific logger with our desired output level
       
    83    my_logger = logging.getLogger('MyLogger')
       
    84    my_logger.setLevel(logging.DEBUG)
       
    85 
       
    86    # Add the log message handler to the logger
       
    87    handler = logging.handlers.RotatingFileHandler(
       
    88                  LOG_FILENAME, maxBytes=20, backupCount=5)
       
    89 
       
    90    my_logger.addHandler(handler)
       
    91 
       
    92    # Log some messages
       
    93    for i in range(20):
       
    94        my_logger.debug('i = %d' % i)
       
    95 
       
    96    # See what files are created
       
    97    logfiles = glob.glob('%s*' % LOG_FILENAME)
       
    98 
       
    99    for filename in logfiles:
       
   100        print filename
       
   101 
       
   102 The result should be 6 separate files, each with part of the log history for the
       
   103 application::
       
   104 
       
   105    /tmp/logging_rotatingfile_example.out
       
   106    /tmp/logging_rotatingfile_example.out.1
       
   107    /tmp/logging_rotatingfile_example.out.2
       
   108    /tmp/logging_rotatingfile_example.out.3
       
   109    /tmp/logging_rotatingfile_example.out.4
       
   110    /tmp/logging_rotatingfile_example.out.5
       
   111 
       
   112 The most current file is always :file:`/tmp/logging_rotatingfile_example.out`,
       
   113 and each time it reaches the size limit it is renamed with the suffix
       
   114 ``.1``. Each of the existing backup files is renamed to increment the suffix
       
   115 (``.1`` becomes ``.2``, etc.)  and the ``.5`` file is erased.
       
   116 
       
   117 Obviously this example sets the log length much much too small as an extreme
       
   118 example.  You would want to set *maxBytes* to an appropriate value.
       
   119 
       
   120 Another useful feature of the logging API is the ability to produce different
       
   121 messages at different log levels.  This allows you to instrument your code with
       
   122 debug messages, for example, but turning the log level down so that those debug
       
   123 messages are not written for your production system.  The default levels are
       
   124 ``CRITICAL``, ``ERROR``, ``WARNING``, ``INFO``, ``DEBUG`` and ``UNSET``.
       
   125 
       
   126 The logger, handler, and log message call each specify a level.  The log message
       
   127 is only emitted if the handler and logger are configured to emit messages of
       
   128 that level or lower.  For example, if a message is ``CRITICAL``, and the logger
       
   129 is set to ``ERROR``, the message is emitted.  If a message is a ``WARNING``, and
       
   130 the logger is set to produce only ``ERROR``\s, the message is not emitted::
       
   131 
       
   132    import logging
       
   133    import sys
       
   134 
       
   135    LEVELS = {'debug': logging.DEBUG,
       
   136              'info': logging.INFO,
       
   137              'warning': logging.WARNING,
       
   138              'error': logging.ERROR,
       
   139              'critical': logging.CRITICAL}
       
   140 
       
   141    if len(sys.argv) > 1:
       
   142        level_name = sys.argv[1]
       
   143        level = LEVELS.get(level_name, logging.NOTSET)
       
   144        logging.basicConfig(level=level)
       
   145 
       
   146    logging.debug('This is a debug message')
       
   147    logging.info('This is an info message')
       
   148    logging.warning('This is a warning message')
       
   149    logging.error('This is an error message')
       
   150    logging.critical('This is a critical error message')
       
   151 
       
   152 Run the script with an argument like 'debug' or 'warning' to see which messages
       
   153 show up at different levels::
       
   154 
       
   155    $ python logging_level_example.py debug
       
   156    DEBUG:root:This is a debug message
       
   157    INFO:root:This is an info message
       
   158    WARNING:root:This is a warning message
       
   159    ERROR:root:This is an error message
       
   160    CRITICAL:root:This is a critical error message
       
   161 
       
   162    $ python logging_level_example.py info
       
   163    INFO:root:This is an info message
       
   164    WARNING:root:This is a warning message
       
   165    ERROR:root:This is an error message
       
   166    CRITICAL:root:This is a critical error message
       
   167 
       
   168 You will notice that these log messages all have ``root`` embedded in them.  The
       
   169 logging module supports a hierarchy of loggers with different names.  An easy
       
   170 way to tell where a specific log message comes from is to use a separate logger
       
   171 object for each of your modules.  Each new logger "inherits" the configuration
       
   172 of its parent, and log messages sent to a logger include the name of that
       
   173 logger.  Optionally, each logger can be configured differently, so that messages
       
   174 from different modules are handled in different ways.  Let's look at a simple
       
   175 example of how to log from different modules so it is easy to trace the source
       
   176 of the message::
       
   177 
       
   178    import logging
       
   179 
       
   180    logging.basicConfig(level=logging.WARNING)
       
   181 
       
   182    logger1 = logging.getLogger('package1.module1')
       
   183    logger2 = logging.getLogger('package2.module2')
       
   184 
       
   185    logger1.warning('This message comes from one module')
       
   186    logger2.warning('And this message comes from another module')
       
   187 
       
   188 And the output::
       
   189 
       
   190    $ python logging_modules_example.py
       
   191    WARNING:package1.module1:This message comes from one module
       
   192    WARNING:package2.module2:And this message comes from another module
       
   193 
       
   194 There are many more options for configuring logging, including different log
       
   195 message formatting options, having messages delivered to multiple destinations,
       
   196 and changing the configuration of a long-running application on the fly using a
       
   197 socket interface.  All of these options are covered in depth in the library
       
   198 module documentation.
       
   199 
       
   200 Loggers
       
   201 ^^^^^^^
       
   202 
       
   203 The logging library takes a modular approach and offers the several categories
       
   204 of components: loggers, handlers, filters, and formatters.  Loggers expose the
       
   205 interface that application code directly uses.  Handlers send the log records to
       
   206 the appropriate destination. Filters provide a finer grained facility for
       
   207 determining which log records to send on to a handler.  Formatters specify the
       
   208 layout of the resultant log record.
       
   209 
       
   210 :class:`Logger` objects have a threefold job.  First, they expose several
       
   211 methods to application code so that applications can log messages at runtime.
       
   212 Second, logger objects determine which log messages to act upon based upon
       
   213 severity (the default filtering facility) or filter objects.  Third, logger
       
   214 objects pass along relevant log messages to all interested log handlers.
       
   215 
       
   216 The most widely used methods on logger objects fall into two categories:
       
   217 configuration and message sending.
       
   218 
       
   219 * :meth:`Logger.setLevel` specifies the lowest-severity log message a logger
       
   220   will handle, where debug is the lowest built-in severity level and critical is
       
   221   the highest built-in severity.  For example, if the severity level is info,
       
   222   the logger will handle only info, warning, error, and critical messages and
       
   223   will ignore debug messages.
       
   224 
       
   225 * :meth:`Logger.addFilter` and :meth:`Logger.removeFilter` add and remove filter
       
   226   objects from the logger object.  This tutorial does not address filters.
       
   227 
       
   228 With the logger object configured, the following methods create log messages:
       
   229 
       
   230 * :meth:`Logger.debug`, :meth:`Logger.info`, :meth:`Logger.warning`,
       
   231   :meth:`Logger.error`, and :meth:`Logger.critical` all create log records with
       
   232   a message and a level that corresponds to their respective method names. The
       
   233   message is actually a format string, which may contain the standard string
       
   234   substitution syntax of :const:`%s`, :const:`%d`, :const:`%f`, and so on.  The
       
   235   rest of their arguments is a list of objects that correspond with the
       
   236   substitution fields in the message.  With regard to :const:`**kwargs`, the
       
   237   logging methods care only about a keyword of :const:`exc_info` and use it to
       
   238   determine whether to log exception information.
       
   239 
       
   240 * :meth:`Logger.exception` creates a log message similar to
       
   241   :meth:`Logger.error`.  The difference is that :meth:`Logger.exception` dumps a
       
   242   stack trace along with it.  Call this method only from an exception handler.
       
   243 
       
   244 * :meth:`Logger.log` takes a log level as an explicit argument.  This is a
       
   245   little more verbose for logging messages than using the log level convenience
       
   246   methods listed above, but this is how to log at custom log levels.
       
   247 
       
   248 :func:`getLogger` returns a reference to a logger instance with the specified
       
   249 if it it is provided, or ``root`` if not.  The names are period-separated
       
   250 hierarchical structures.  Multiple calls to :func:`getLogger` with the same name
       
   251 will return a reference to the same logger object.  Loggers that are further
       
   252 down in the hierarchical list are children of loggers higher up in the list.
       
   253 For example, given a logger with a name of ``foo``, loggers with names of
       
   254 ``foo.bar``, ``foo.bar.baz``, and ``foo.bam`` are all children of ``foo``.
       
   255 Child loggers propagate messages up to their parent loggers.  Because of this,
       
   256 it is unnecessary to define and configure all the loggers an application uses.
       
   257 It is sufficient to configure a top-level logger and create child loggers as
       
   258 needed.
       
   259 
       
   260 
       
   261 Handlers
       
   262 ^^^^^^^^
       
   263 
       
   264 :class:`Handler` objects are responsible for dispatching the appropriate log
       
   265 messages (based on the log messages' severity) to the handler's specified
       
   266 destination.  Logger objects can add zero or more handler objects to themselves
       
   267 with an :func:`addHandler` method.  As an example scenario, an application may
       
   268 want to send all log messages to a log file, all log messages of error or higher
       
   269 to stdout, and all messages of critical to an email address.  This scenario
       
   270 requires three individual handlers where each handler is responsible for sending
       
   271 messages of a specific severity to a specific location.
       
   272 
       
   273 The standard library includes quite a few handler types; this tutorial uses only
       
   274 :class:`StreamHandler` and :class:`FileHandler` in its examples.
       
   275 
       
   276 There are very few methods in a handler for application developers to concern
       
   277 themselves with.  The only handler methods that seem relevant for application
       
   278 developers who are using the built-in handler objects (that is, not creating
       
   279 custom handlers) are the following configuration methods:
       
   280 
       
   281 * The :meth:`Handler.setLevel` method, just as in logger objects, specifies the
       
   282   lowest severity that will be dispatched to the appropriate destination.  Why
       
   283   are there two :func:`setLevel` methods?  The level set in the logger
       
   284   determines which severity of messages it will pass to its handlers.  The level
       
   285   set in each handler determines which messages that handler will send on.
       
   286   :func:`setFormatter` selects a Formatter object for this handler to use.
       
   287 
       
   288 * :func:`addFilter` and :func:`removeFilter` respectively configure and
       
   289   deconfigure filter objects on handlers.
       
   290 
       
   291 Application code should not directly instantiate and use handlers.  Instead, the
       
   292 :class:`Handler` class is a base class that defines the interface that all
       
   293 Handlers should have and establishes some default behavior that child classes
       
   294 can use (or override).
       
   295 
       
   296 
       
   297 Formatters
       
   298 ^^^^^^^^^^
       
   299 
       
   300 Formatter objects configure the final order, structure, and contents of the log
       
   301 message.  Unlike the base :class:`logging.Handler` class, application code may
       
   302 instantiate formatter classes, although you could likely subclass the formatter
       
   303 if your application needs special behavior.  The constructor takes two optional
       
   304 arguments: a message format string and a date format string.  If there is no
       
   305 message format string, the default is to use the raw message.  If there is no
       
   306 date format string, the default date format is::
       
   307 
       
   308     %Y-%m-%d %H:%M:%S
       
   309 
       
   310 with the milliseconds tacked on at the end.
       
   311 
       
   312 The message format string uses ``%(<dictionary key>)s`` styled string
       
   313 substitution; the possible keys are documented in :ref:`formatter-objects`.
       
   314 
       
   315 The following message format string will log the time in a human-readable
       
   316 format, the severity of the message, and the contents of the message, in that
       
   317 order::
       
   318 
       
   319     "%(asctime)s - %(levelname)s - %(message)s"
       
   320 
       
   321 
       
   322 Configuring Logging
       
   323 ^^^^^^^^^^^^^^^^^^^
       
   324 
       
   325 Programmers can configure logging either by creating loggers, handlers, and
       
   326 formatters explicitly in a main module with the configuration methods listed
       
   327 above (using Python code), or by creating a logging config file.  The following
       
   328 code is an example of configuring a very simple logger, a console handler, and a
       
   329 simple formatter in a Python module::
       
   330 
       
   331     import logging
       
   332 
       
   333     # create logger
       
   334     logger = logging.getLogger("simple_example")
       
   335     logger.setLevel(logging.DEBUG)
       
   336     # create console handler and set level to debug
       
   337     ch = logging.StreamHandler()
       
   338     ch.setLevel(logging.DEBUG)
       
   339     # create formatter
       
   340     formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
       
   341     # add formatter to ch
       
   342     ch.setFormatter(formatter)
       
   343     # add ch to logger
       
   344     logger.addHandler(ch)
       
   345 
       
   346     # "application" code
       
   347     logger.debug("debug message")
       
   348     logger.info("info message")
       
   349     logger.warn("warn message")
       
   350     logger.error("error message")
       
   351     logger.critical("critical message")
       
   352 
       
   353 Running this module from the command line produces the following output::
       
   354 
       
   355     $ python simple_logging_module.py
       
   356     2005-03-19 15:10:26,618 - simple_example - DEBUG - debug message
       
   357     2005-03-19 15:10:26,620 - simple_example - INFO - info message
       
   358     2005-03-19 15:10:26,695 - simple_example - WARNING - warn message
       
   359     2005-03-19 15:10:26,697 - simple_example - ERROR - error message
       
   360     2005-03-19 15:10:26,773 - simple_example - CRITICAL - critical message
       
   361 
       
   362 The following Python module creates a logger, handler, and formatter nearly
       
   363 identical to those in the example listed above, with the only difference being
       
   364 the names of the objects::
       
   365 
       
   366     import logging
       
   367     import logging.config
       
   368 
       
   369     logging.config.fileConfig("logging.conf")
       
   370 
       
   371     # create logger
       
   372     logger = logging.getLogger("simpleExample")
       
   373 
       
   374     # "application" code
       
   375     logger.debug("debug message")
       
   376     logger.info("info message")
       
   377     logger.warn("warn message")
       
   378     logger.error("error message")
       
   379     logger.critical("critical message")
       
   380 
       
   381 Here is the logging.conf file::
       
   382 
       
   383     [loggers]
       
   384     keys=root,simpleExample
       
   385 
       
   386     [handlers]
       
   387     keys=consoleHandler
       
   388 
       
   389     [formatters]
       
   390     keys=simpleFormatter
       
   391 
       
   392     [logger_root]
       
   393     level=DEBUG
       
   394     handlers=consoleHandler
       
   395 
       
   396     [logger_simpleExample]
       
   397     level=DEBUG
       
   398     handlers=consoleHandler
       
   399     qualname=simpleExample
       
   400     propagate=0
       
   401 
       
   402     [handler_consoleHandler]
       
   403     class=StreamHandler
       
   404     level=DEBUG
       
   405     formatter=simpleFormatter
       
   406     args=(sys.stdout,)
       
   407 
       
   408     [formatter_simpleFormatter]
       
   409     format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
       
   410     datefmt=
       
   411 
       
   412 The output is nearly identical to that of the non-config-file-based example::
       
   413 
       
   414     $ python simple_logging_config.py
       
   415     2005-03-19 15:38:55,977 - simpleExample - DEBUG - debug message
       
   416     2005-03-19 15:38:55,979 - simpleExample - INFO - info message
       
   417     2005-03-19 15:38:56,054 - simpleExample - WARNING - warn message
       
   418     2005-03-19 15:38:56,055 - simpleExample - ERROR - error message
       
   419     2005-03-19 15:38:56,130 - simpleExample - CRITICAL - critical message
       
   420 
       
   421 You can see that the config file approach has a few advantages over the Python
       
   422 code approach, mainly separation of configuration and code and the ability of
       
   423 noncoders to easily modify the logging properties.
       
   424 
       
   425 Configuring Logging for a Library
       
   426 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
       
   427 
       
   428 When developing a library which uses logging, some consideration needs to be
       
   429 given to its configuration. If the using application does not use logging, and
       
   430 library code makes logging calls, then a one-off message "No handlers could be
       
   431 found for logger X.Y.Z" is printed to the console. This message is intended
       
   432 to catch mistakes in logging configuration, but will confuse an application
       
   433 developer who is not aware of logging by the library.
       
   434 
       
   435 In addition to documenting how a library uses logging, a good way to configure
       
   436 library logging so that it does not cause a spurious message is to add a
       
   437 handler which does nothing. This avoids the message being printed, since a
       
   438 handler will be found: it just doesn't produce any output. If the library user
       
   439 configures logging for application use, presumably that configuration will add
       
   440 some handlers, and if levels are suitably configured then logging calls made
       
   441 in library code will send output to those handlers, as normal.
       
   442 
       
   443 A do-nothing handler can be simply defined as follows::
       
   444 
       
   445     import logging
       
   446 
       
   447     class NullHandler(logging.Handler):
       
   448         def emit(self, record):
       
   449             pass
       
   450 
       
   451 An instance of this handler should be added to the top-level logger of the
       
   452 logging namespace used by the library. If all logging by a library *foo* is
       
   453 done using loggers with names matching "foo.x.y", then the code::
       
   454 
       
   455     import logging
       
   456 
       
   457     h = NullHandler()
       
   458     logging.getLogger("foo").addHandler(h)
       
   459 
       
   460 should have the desired effect. If an organisation produces a number of
       
   461 libraries, then the logger name specified can be "orgname.foo" rather than
       
   462 just "foo".
       
   463 
       
   464 
       
   465 Logging Levels
       
   466 --------------
       
   467 
       
   468 The numeric values of logging levels are given in the following table. These are
       
   469 primarily of interest if you want to define your own levels, and need them to
       
   470 have specific values relative to the predefined levels. If you define a level
       
   471 with the same numeric value, it overwrites the predefined value; the predefined
       
   472 name is lost.
       
   473 
       
   474 +--------------+---------------+
       
   475 | Level        | Numeric value |
       
   476 +==============+===============+
       
   477 | ``CRITICAL`` | 50            |
       
   478 +--------------+---------------+
       
   479 | ``ERROR``    | 40            |
       
   480 +--------------+---------------+
       
   481 | ``WARNING``  | 30            |
       
   482 +--------------+---------------+
       
   483 | ``INFO``     | 20            |
       
   484 +--------------+---------------+
       
   485 | ``DEBUG``    | 10            |
       
   486 +--------------+---------------+
       
   487 | ``NOTSET``   | 0             |
       
   488 +--------------+---------------+
       
   489 
       
   490 Levels can also be associated with loggers, being set either by the developer or
       
   491 through loading a saved logging configuration. When a logging method is called
       
   492 on a logger, the logger compares its own level with the level associated with
       
   493 the method call. If the logger's level is higher than the method call's, no
       
   494 logging message is actually generated. This is the basic mechanism controlling
       
   495 the verbosity of logging output.
       
   496 
       
   497 Logging messages are encoded as instances of the :class:`LogRecord` class. When
       
   498 a logger decides to actually log an event, a :class:`LogRecord` instance is
       
   499 created from the logging message.
       
   500 
       
   501 Logging messages are subjected to a dispatch mechanism through the use of
       
   502 :dfn:`handlers`, which are instances of subclasses of the :class:`Handler`
       
   503 class. Handlers are responsible for ensuring that a logged message (in the form
       
   504 of a :class:`LogRecord`) ends up in a particular location (or set of locations)
       
   505 which is useful for the target audience for that message (such as end users,
       
   506 support desk staff, system administrators, developers). Handlers are passed
       
   507 :class:`LogRecord` instances intended for particular destinations. Each logger
       
   508 can have zero, one or more handlers associated with it (via the
       
   509 :meth:`addHandler` method of :class:`Logger`). In addition to any handlers
       
   510 directly associated with a logger, *all handlers associated with all ancestors
       
   511 of the logger* are called to dispatch the message.
       
   512 
       
   513 Just as for loggers, handlers can have levels associated with them. A handler's
       
   514 level acts as a filter in the same way as a logger's level does. If a handler
       
   515 decides to actually dispatch an event, the :meth:`emit` method is used to send
       
   516 the message to its destination. Most user-defined subclasses of :class:`Handler`
       
   517 will need to override this :meth:`emit`.
       
   518 
       
   519 In addition to the base :class:`Handler` class, many useful subclasses are
       
   520 provided:
       
   521 
       
   522 #. :class:`StreamHandler` instances send error messages to streams (file-like
       
   523    objects).
       
   524 
       
   525 #. :class:`FileHandler` instances send error messages to disk files.
       
   526 
       
   527 #. :class:`BaseRotatingHandler` is the base class for handlers that rotate log
       
   528    files at a certain point. It is not meant to be  instantiated directly. Instead,
       
   529    use :class:`RotatingFileHandler` or :class:`TimedRotatingFileHandler`.
       
   530 
       
   531 #. :class:`RotatingFileHandler` instances send error messages to disk files,
       
   532    with support for maximum log file sizes and log file rotation.
       
   533 
       
   534 #. :class:`TimedRotatingFileHandler` instances send error messages to disk files
       
   535    rotating the log file at certain timed intervals.
       
   536 
       
   537 #. :class:`SocketHandler` instances send error messages to TCP/IP sockets.
       
   538 
       
   539 #. :class:`DatagramHandler` instances send error messages to UDP sockets.
       
   540 
       
   541 #. :class:`SMTPHandler` instances send error messages to a designated email
       
   542    address.
       
   543 
       
   544 #. :class:`SysLogHandler` instances send error messages to a Unix syslog daemon,
       
   545    possibly on a remote machine.
       
   546 
       
   547 #. :class:`NTEventLogHandler` instances send error messages to a Windows
       
   548    NT/2000/XP event log.
       
   549 
       
   550 #. :class:`MemoryHandler` instances send error messages to a buffer in memory,
       
   551    which is flushed whenever specific criteria are met.
       
   552 
       
   553 #. :class:`HTTPHandler` instances send error messages to an HTTP server using
       
   554    either ``GET`` or ``POST`` semantics.
       
   555 
       
   556 The :class:`StreamHandler` and :class:`FileHandler` classes are defined in the
       
   557 core logging package. The other handlers are defined in a sub- module,
       
   558 :mod:`logging.handlers`. (There is also another sub-module,
       
   559 :mod:`logging.config`, for configuration functionality.)
       
   560 
       
   561 Logged messages are formatted for presentation through instances of the
       
   562 :class:`Formatter` class. They are initialized with a format string suitable for
       
   563 use with the % operator and a dictionary.
       
   564 
       
   565 For formatting multiple messages in a batch, instances of
       
   566 :class:`BufferingFormatter` can be used. In addition to the format string (which
       
   567 is applied to each message in the batch), there is provision for header and
       
   568 trailer format strings.
       
   569 
       
   570 When filtering based on logger level and/or handler level is not enough,
       
   571 instances of :class:`Filter` can be added to both :class:`Logger` and
       
   572 :class:`Handler` instances (through their :meth:`addFilter` method). Before
       
   573 deciding to process a message further, both loggers and handlers consult all
       
   574 their filters for permission. If any filter returns a false value, the message
       
   575 is not processed further.
       
   576 
       
   577 The basic :class:`Filter` functionality allows filtering by specific logger
       
   578 name. If this feature is used, messages sent to the named logger and its
       
   579 children are allowed through the filter, and all others dropped.
       
   580 
       
   581 In addition to the classes described above, there are a number of module- level
       
   582 functions.
       
   583 
       
   584 
       
   585 .. function:: getLogger([name])
       
   586 
       
   587    Return a logger with the specified name or, if no name is specified, return a
       
   588    logger which is the root logger of the hierarchy. If specified, the name is
       
   589    typically a dot-separated hierarchical name like *"a"*, *"a.b"* or *"a.b.c.d"*.
       
   590    Choice of these names is entirely up to the developer who is using logging.
       
   591 
       
   592    All calls to this function with a given name return the same logger instance.
       
   593    This means that logger instances never need to be passed between different parts
       
   594    of an application.
       
   595 
       
   596 
       
   597 .. function:: getLoggerClass()
       
   598 
       
   599    Return either the standard :class:`Logger` class, or the last class passed to
       
   600    :func:`setLoggerClass`. This function may be called from within a new class
       
   601    definition, to ensure that installing a customised :class:`Logger` class will
       
   602    not undo customisations already applied by other code. For example::
       
   603 
       
   604       class MyLogger(logging.getLoggerClass()):
       
   605           # ... override behaviour here
       
   606 
       
   607 
       
   608 .. function:: debug(msg[, *args[, **kwargs]])
       
   609 
       
   610    Logs a message with level :const:`DEBUG` on the root logger. The *msg* is the
       
   611    message format string, and the *args* are the arguments which are merged into
       
   612    *msg* using the string formatting operator. (Note that this means that you can
       
   613    use keywords in the format string, together with a single dictionary argument.)
       
   614 
       
   615    There are two keyword arguments in *kwargs* which are inspected: *exc_info*
       
   616    which, if it does not evaluate as false, causes exception information to be
       
   617    added to the logging message. If an exception tuple (in the format returned by
       
   618    :func:`sys.exc_info`) is provided, it is used; otherwise, :func:`sys.exc_info`
       
   619    is called to get the exception information.
       
   620 
       
   621    The other optional keyword argument is *extra* which can be used to pass a
       
   622    dictionary which is used to populate the __dict__ of the LogRecord created for
       
   623    the logging event with user-defined attributes. These custom attributes can then
       
   624    be used as you like. For example, they could be incorporated into logged
       
   625    messages. For example::
       
   626 
       
   627       FORMAT = "%(asctime)-15s %(clientip)s %(user)-8s %(message)s"
       
   628       logging.basicConfig(format=FORMAT)
       
   629       d = {'clientip': '192.168.0.1', 'user': 'fbloggs'}
       
   630       logging.warning("Protocol problem: %s", "connection reset", extra=d)
       
   631 
       
   632    would print something like  ::
       
   633 
       
   634       2006-02-08 22:20:02,165 192.168.0.1 fbloggs  Protocol problem: connection reset
       
   635 
       
   636    The keys in the dictionary passed in *extra* should not clash with the keys used
       
   637    by the logging system. (See the :class:`Formatter` documentation for more
       
   638    information on which keys are used by the logging system.)
       
   639 
       
   640    If you choose to use these attributes in logged messages, you need to exercise
       
   641    some care. In the above example, for instance, the :class:`Formatter` has been
       
   642    set up with a format string which expects 'clientip' and 'user' in the attribute
       
   643    dictionary of the LogRecord. If these are missing, the message will not be
       
   644    logged because a string formatting exception will occur. So in this case, you
       
   645    always need to pass the *extra* dictionary with these keys.
       
   646 
       
   647    While this might be annoying, this feature is intended for use in specialized
       
   648    circumstances, such as multi-threaded servers where the same code executes in
       
   649    many contexts, and interesting conditions which arise are dependent on this
       
   650    context (such as remote client IP address and authenticated user name, in the
       
   651    above example). In such circumstances, it is likely that specialized
       
   652    :class:`Formatter`\ s would be used with particular :class:`Handler`\ s.
       
   653 
       
   654    .. versionchanged:: 2.5
       
   655       *extra* was added.
       
   656 
       
   657 
       
   658 .. function:: info(msg[, *args[, **kwargs]])
       
   659 
       
   660    Logs a message with level :const:`INFO` on the root logger. The arguments are
       
   661    interpreted as for :func:`debug`.
       
   662 
       
   663 
       
   664 .. function:: warning(msg[, *args[, **kwargs]])
       
   665 
       
   666    Logs a message with level :const:`WARNING` on the root logger. The arguments are
       
   667    interpreted as for :func:`debug`.
       
   668 
       
   669 
       
   670 .. function:: error(msg[, *args[, **kwargs]])
       
   671 
       
   672    Logs a message with level :const:`ERROR` on the root logger. The arguments are
       
   673    interpreted as for :func:`debug`.
       
   674 
       
   675 
       
   676 .. function:: critical(msg[, *args[, **kwargs]])
       
   677 
       
   678    Logs a message with level :const:`CRITICAL` on the root logger. The arguments
       
   679    are interpreted as for :func:`debug`.
       
   680 
       
   681 
       
   682 .. function:: exception(msg[, *args])
       
   683 
       
   684    Logs a message with level :const:`ERROR` on the root logger. The arguments are
       
   685    interpreted as for :func:`debug`. Exception info is added to the logging
       
   686    message. This function should only be called from an exception handler.
       
   687 
       
   688 
       
   689 .. function:: log(level, msg[, *args[, **kwargs]])
       
   690 
       
   691    Logs a message with level *level* on the root logger. The other arguments are
       
   692    interpreted as for :func:`debug`.
       
   693 
       
   694 
       
   695 .. function:: disable(lvl)
       
   696 
       
   697    Provides an overriding level *lvl* for all loggers which takes precedence over
       
   698    the logger's own level. When the need arises to temporarily throttle logging
       
   699    output down across the whole application, this function can be useful.
       
   700 
       
   701 
       
   702 .. function:: addLevelName(lvl, levelName)
       
   703 
       
   704    Associates level *lvl* with text *levelName* in an internal dictionary, which is
       
   705    used to map numeric levels to a textual representation, for example when a
       
   706    :class:`Formatter` formats a message. This function can also be used to define
       
   707    your own levels. The only constraints are that all levels used must be
       
   708    registered using this function, levels should be positive integers and they
       
   709    should increase in increasing order of severity.
       
   710 
       
   711 
       
   712 .. function:: getLevelName(lvl)
       
   713 
       
   714    Returns the textual representation of logging level *lvl*. If the level is one
       
   715    of the predefined levels :const:`CRITICAL`, :const:`ERROR`, :const:`WARNING`,
       
   716    :const:`INFO` or :const:`DEBUG` then you get the corresponding string. If you
       
   717    have associated levels with names using :func:`addLevelName` then the name you
       
   718    have associated with *lvl* is returned. If a numeric value corresponding to one
       
   719    of the defined levels is passed in, the corresponding string representation is
       
   720    returned. Otherwise, the string "Level %s" % lvl is returned.
       
   721 
       
   722 
       
   723 .. function:: makeLogRecord(attrdict)
       
   724 
       
   725    Creates and returns a new :class:`LogRecord` instance whose attributes are
       
   726    defined by *attrdict*. This function is useful for taking a pickled
       
   727    :class:`LogRecord` attribute dictionary, sent over a socket, and reconstituting
       
   728    it as a :class:`LogRecord` instance at the receiving end.
       
   729 
       
   730 
       
   731 .. function:: basicConfig([**kwargs])
       
   732 
       
   733    Does basic configuration for the logging system by creating a
       
   734    :class:`StreamHandler` with a default :class:`Formatter` and adding it to the
       
   735    root logger. The function does nothing if any handlers have been defined for
       
   736    the root logger. The functions :func:`debug`, :func:`info`, :func:`warning`,
       
   737    :func:`error` and :func:`critical` will call :func:`basicConfig` automatically
       
   738    if no handlers are defined for the root logger.
       
   739 
       
   740    This function does nothing if the root logger already has handlers configured.
       
   741 
       
   742    .. versionchanged:: 2.4
       
   743       Formerly, :func:`basicConfig` did not take any keyword arguments.
       
   744 
       
   745    The following keyword arguments are supported.
       
   746 
       
   747    +--------------+---------------------------------------------+
       
   748    | Format       | Description                                 |
       
   749    +==============+=============================================+
       
   750    | ``filename`` | Specifies that a FileHandler be created,    |
       
   751    |              | using the specified filename, rather than a |
       
   752    |              | StreamHandler.                              |
       
   753    +--------------+---------------------------------------------+
       
   754    | ``filemode`` | Specifies the mode to open the file, if     |
       
   755    |              | filename is specified (if filemode is       |
       
   756    |              | unspecified, it defaults to 'a').           |
       
   757    +--------------+---------------------------------------------+
       
   758    | ``format``   | Use the specified format string for the     |
       
   759    |              | handler.                                    |
       
   760    +--------------+---------------------------------------------+
       
   761    | ``datefmt``  | Use the specified date/time format.         |
       
   762    +--------------+---------------------------------------------+
       
   763    | ``level``    | Set the root logger level to the specified  |
       
   764    |              | level.                                      |
       
   765    +--------------+---------------------------------------------+
       
   766    | ``stream``   | Use the specified stream to initialize the  |
       
   767    |              | StreamHandler. Note that this argument is   |
       
   768    |              | incompatible with 'filename' - if both are  |
       
   769    |              | present, 'stream' is ignored.               |
       
   770    +--------------+---------------------------------------------+
       
   771 
       
   772 
       
   773 .. function:: shutdown()
       
   774 
       
   775    Informs the logging system to perform an orderly shutdown by flushing and
       
   776    closing all handlers. This should be called at application exit and no
       
   777    further use of the logging system should be made after this call.
       
   778 
       
   779 
       
   780 .. function:: setLoggerClass(klass)
       
   781 
       
   782    Tells the logging system to use the class *klass* when instantiating a logger.
       
   783    The class should define :meth:`__init__` such that only a name argument is
       
   784    required, and the :meth:`__init__` should call :meth:`Logger.__init__`. This
       
   785    function is typically called before any loggers are instantiated by applications
       
   786    which need to use custom logger behavior.
       
   787 
       
   788 
       
   789 .. seealso::
       
   790 
       
   791    :pep:`282` - A Logging System
       
   792       The proposal which described this feature for inclusion in the Python standard
       
   793       library.
       
   794 
       
   795    `Original Python logging package <http://www.red-dove.com/python_logging.html>`_
       
   796       This is the original source for the :mod:`logging` package.  The version of the
       
   797       package available from this site is suitable for use with Python 1.5.2, 2.1.x
       
   798       and 2.2.x, which do not include the :mod:`logging` package in the standard
       
   799       library.
       
   800 
       
   801 
       
   802 Logger Objects
       
   803 --------------
       
   804 
       
   805 Loggers have the following attributes and methods. Note that Loggers are never
       
   806 instantiated directly, but always through the module-level function
       
   807 ``logging.getLogger(name)``.
       
   808 
       
   809 
       
   810 .. attribute:: Logger.propagate
       
   811 
       
   812    If this evaluates to false, logging messages are not passed by this logger or by
       
   813    child loggers to higher level (ancestor) loggers. The constructor sets this
       
   814    attribute to 1.
       
   815 
       
   816 
       
   817 .. method:: Logger.setLevel(lvl)
       
   818 
       
   819    Sets the threshold for this logger to *lvl*. Logging messages which are less
       
   820    severe than *lvl* will be ignored. When a logger is created, the level is set to
       
   821    :const:`NOTSET` (which causes all messages to be processed when the logger is
       
   822    the root logger, or delegation to the parent when the logger is a non-root
       
   823    logger). Note that the root logger is created with level :const:`WARNING`.
       
   824 
       
   825    The term "delegation to the parent" means that if a logger has a level of
       
   826    NOTSET, its chain of ancestor loggers is traversed until either an ancestor with
       
   827    a level other than NOTSET is found, or the root is reached.
       
   828 
       
   829    If an ancestor is found with a level other than NOTSET, then that ancestor's
       
   830    level is treated as the effective level of the logger where the ancestor search
       
   831    began, and is used to determine how a logging event is handled.
       
   832 
       
   833    If the root is reached, and it has a level of NOTSET, then all messages will be
       
   834    processed. Otherwise, the root's level will be used as the effective level.
       
   835 
       
   836 
       
   837 .. method:: Logger.isEnabledFor(lvl)
       
   838 
       
   839    Indicates if a message of severity *lvl* would be processed by this logger.
       
   840    This method checks first the module-level level set by
       
   841    ``logging.disable(lvl)`` and then the logger's effective level as determined
       
   842    by :meth:`getEffectiveLevel`.
       
   843 
       
   844 
       
   845 .. method:: Logger.getEffectiveLevel()
       
   846 
       
   847    Indicates the effective level for this logger. If a value other than
       
   848    :const:`NOTSET` has been set using :meth:`setLevel`, it is returned. Otherwise,
       
   849    the hierarchy is traversed towards the root until a value other than
       
   850    :const:`NOTSET` is found, and that value is returned.
       
   851 
       
   852 
       
   853 .. method:: Logger.debug(msg[, *args[, **kwargs]])
       
   854 
       
   855    Logs a message with level :const:`DEBUG` on this logger. The *msg* is the
       
   856    message format string, and the *args* are the arguments which are merged into
       
   857    *msg* using the string formatting operator. (Note that this means that you can
       
   858    use keywords in the format string, together with a single dictionary argument.)
       
   859 
       
   860    There are two keyword arguments in *kwargs* which are inspected: *exc_info*
       
   861    which, if it does not evaluate as false, causes exception information to be
       
   862    added to the logging message. If an exception tuple (in the format returned by
       
   863    :func:`sys.exc_info`) is provided, it is used; otherwise, :func:`sys.exc_info`
       
   864    is called to get the exception information.
       
   865 
       
   866    The other optional keyword argument is *extra* which can be used to pass a
       
   867    dictionary which is used to populate the __dict__ of the LogRecord created for
       
   868    the logging event with user-defined attributes. These custom attributes can then
       
   869    be used as you like. For example, they could be incorporated into logged
       
   870    messages. For example::
       
   871 
       
   872       FORMAT = "%(asctime)-15s %(clientip)s %(user)-8s %(message)s"
       
   873       logging.basicConfig(format=FORMAT)
       
   874       d = { 'clientip' : '192.168.0.1', 'user' : 'fbloggs' }
       
   875       logger = logging.getLogger("tcpserver")
       
   876       logger.warning("Protocol problem: %s", "connection reset", extra=d)
       
   877 
       
   878    would print something like  ::
       
   879 
       
   880       2006-02-08 22:20:02,165 192.168.0.1 fbloggs  Protocol problem: connection reset
       
   881 
       
   882    The keys in the dictionary passed in *extra* should not clash with the keys used
       
   883    by the logging system. (See the :class:`Formatter` documentation for more
       
   884    information on which keys are used by the logging system.)
       
   885 
       
   886    If you choose to use these attributes in logged messages, you need to exercise
       
   887    some care. In the above example, for instance, the :class:`Formatter` has been
       
   888    set up with a format string which expects 'clientip' and 'user' in the attribute
       
   889    dictionary of the LogRecord. If these are missing, the message will not be
       
   890    logged because a string formatting exception will occur. So in this case, you
       
   891    always need to pass the *extra* dictionary with these keys.
       
   892 
       
   893    While this might be annoying, this feature is intended for use in specialized
       
   894    circumstances, such as multi-threaded servers where the same code executes in
       
   895    many contexts, and interesting conditions which arise are dependent on this
       
   896    context (such as remote client IP address and authenticated user name, in the
       
   897    above example). In such circumstances, it is likely that specialized
       
   898    :class:`Formatter`\ s would be used with particular :class:`Handler`\ s.
       
   899 
       
   900    .. versionchanged:: 2.5
       
   901       *extra* was added.
       
   902 
       
   903 
       
   904 .. method:: Logger.info(msg[, *args[, **kwargs]])
       
   905 
       
   906    Logs a message with level :const:`INFO` on this logger. The arguments are
       
   907    interpreted as for :meth:`debug`.
       
   908 
       
   909 
       
   910 .. method:: Logger.warning(msg[, *args[, **kwargs]])
       
   911 
       
   912    Logs a message with level :const:`WARNING` on this logger. The arguments are
       
   913    interpreted as for :meth:`debug`.
       
   914 
       
   915 
       
   916 .. method:: Logger.error(msg[, *args[, **kwargs]])
       
   917 
       
   918    Logs a message with level :const:`ERROR` on this logger. The arguments are
       
   919    interpreted as for :meth:`debug`.
       
   920 
       
   921 
       
   922 .. method:: Logger.critical(msg[, *args[, **kwargs]])
       
   923 
       
   924    Logs a message with level :const:`CRITICAL` on this logger. The arguments are
       
   925    interpreted as for :meth:`debug`.
       
   926 
       
   927 
       
   928 .. method:: Logger.log(lvl, msg[, *args[, **kwargs]])
       
   929 
       
   930    Logs a message with integer level *lvl* on this logger. The other arguments are
       
   931    interpreted as for :meth:`debug`.
       
   932 
       
   933 
       
   934 .. method:: Logger.exception(msg[, *args])
       
   935 
       
   936    Logs a message with level :const:`ERROR` on this logger. The arguments are
       
   937    interpreted as for :meth:`debug`. Exception info is added to the logging
       
   938    message. This method should only be called from an exception handler.
       
   939 
       
   940 
       
   941 .. method:: Logger.addFilter(filt)
       
   942 
       
   943    Adds the specified filter *filt* to this logger.
       
   944 
       
   945 
       
   946 .. method:: Logger.removeFilter(filt)
       
   947 
       
   948    Removes the specified filter *filt* from this logger.
       
   949 
       
   950 
       
   951 .. method:: Logger.filter(record)
       
   952 
       
   953    Applies this logger's filters to the record and returns a true value if the
       
   954    record is to be processed.
       
   955 
       
   956 
       
   957 .. method:: Logger.addHandler(hdlr)
       
   958 
       
   959    Adds the specified handler *hdlr* to this logger.
       
   960 
       
   961 
       
   962 .. method:: Logger.removeHandler(hdlr)
       
   963 
       
   964    Removes the specified handler *hdlr* from this logger.
       
   965 
       
   966 
       
   967 .. method:: Logger.findCaller()
       
   968 
       
   969    Finds the caller's source filename and line number. Returns the filename, line
       
   970    number and function name as a 3-element tuple.
       
   971 
       
   972    .. versionchanged:: 2.4
       
   973       The function name was added. In earlier versions, the filename and line number
       
   974       were returned as a 2-element tuple..
       
   975 
       
   976 
       
   977 .. method:: Logger.handle(record)
       
   978 
       
   979    Handles a record by passing it to all handlers associated with this logger and
       
   980    its ancestors (until a false value of *propagate* is found). This method is used
       
   981    for unpickled records received from a socket, as well as those created locally.
       
   982    Logger-level filtering is applied using :meth:`filter`.
       
   983 
       
   984 
       
   985 .. method:: Logger.makeRecord(name, lvl, fn, lno, msg, args, exc_info [, func, extra])
       
   986 
       
   987    This is a factory method which can be overridden in subclasses to create
       
   988    specialized :class:`LogRecord` instances.
       
   989 
       
   990    .. versionchanged:: 2.5
       
   991       *func* and *extra* were added.
       
   992 
       
   993 
       
   994 .. _minimal-example:
       
   995 
       
   996 Basic example
       
   997 -------------
       
   998 
       
   999 .. versionchanged:: 2.4
       
  1000    formerly :func:`basicConfig` did not take any keyword arguments.
       
  1001 
       
  1002 The :mod:`logging` package provides a lot of flexibility, and its configuration
       
  1003 can appear daunting.  This section demonstrates that simple use of the logging
       
  1004 package is possible.
       
  1005 
       
  1006 The simplest example shows logging to the console::
       
  1007 
       
  1008    import logging
       
  1009 
       
  1010    logging.debug('A debug message')
       
  1011    logging.info('Some information')
       
  1012    logging.warning('A shot across the bows')
       
  1013 
       
  1014 If you run the above script, you'll see this::
       
  1015 
       
  1016    WARNING:root:A shot across the bows
       
  1017 
       
  1018 Because no particular logger was specified, the system used the root logger. The
       
  1019 debug and info messages didn't appear because by default, the root logger is
       
  1020 configured to only handle messages with a severity of WARNING or above. The
       
  1021 message format is also a configuration default, as is the output destination of
       
  1022 the messages - ``sys.stderr``. The severity level, the message format and
       
  1023 destination can be easily changed, as shown in the example below::
       
  1024 
       
  1025    import logging
       
  1026 
       
  1027    logging.basicConfig(level=logging.DEBUG,
       
  1028                        format='%(asctime)s %(levelname)s %(message)s',
       
  1029                        filename='/tmp/myapp.log',
       
  1030                        filemode='w')
       
  1031    logging.debug('A debug message')
       
  1032    logging.info('Some information')
       
  1033    logging.warning('A shot across the bows')
       
  1034 
       
  1035 The :meth:`basicConfig` method is used to change the configuration defaults,
       
  1036 which results in output (written to ``/tmp/myapp.log``) which should look
       
  1037 something like the following::
       
  1038 
       
  1039    2004-07-02 13:00:08,743 DEBUG A debug message
       
  1040    2004-07-02 13:00:08,743 INFO Some information
       
  1041    2004-07-02 13:00:08,743 WARNING A shot across the bows
       
  1042 
       
  1043 This time, all messages with a severity of DEBUG or above were handled, and the
       
  1044 format of the messages was also changed, and output went to the specified file
       
  1045 rather than the console.
       
  1046 
       
  1047 Formatting uses standard Python string formatting - see section
       
  1048 :ref:`string-formatting`. The format string takes the following common
       
  1049 specifiers. For a complete list of specifiers, consult the :class:`Formatter`
       
  1050 documentation.
       
  1051 
       
  1052 +-------------------+-----------------------------------------------+
       
  1053 | Format            | Description                                   |
       
  1054 +===================+===============================================+
       
  1055 | ``%(name)s``      | Name of the logger (logging channel).         |
       
  1056 +-------------------+-----------------------------------------------+
       
  1057 | ``%(levelname)s`` | Text logging level for the message            |
       
  1058 |                   | (``'DEBUG'``, ``'INFO'``, ``'WARNING'``,      |
       
  1059 |                   | ``'ERROR'``, ``'CRITICAL'``).                 |
       
  1060 +-------------------+-----------------------------------------------+
       
  1061 | ``%(asctime)s``   | Human-readable time when the                  |
       
  1062 |                   | :class:`LogRecord` was created.  By default   |
       
  1063 |                   | this is of the form "2003-07-08 16:49:45,896" |
       
  1064 |                   | (the numbers after the comma are millisecond  |
       
  1065 |                   | portion of the time).                         |
       
  1066 +-------------------+-----------------------------------------------+
       
  1067 | ``%(message)s``   | The logged message.                           |
       
  1068 +-------------------+-----------------------------------------------+
       
  1069 
       
  1070 To change the date/time format, you can pass an additional keyword parameter,
       
  1071 *datefmt*, as in the following::
       
  1072 
       
  1073    import logging
       
  1074 
       
  1075    logging.basicConfig(level=logging.DEBUG,
       
  1076                        format='%(asctime)s %(levelname)-8s %(message)s',
       
  1077                        datefmt='%a, %d %b %Y %H:%M:%S',
       
  1078                        filename='/temp/myapp.log',
       
  1079                        filemode='w')
       
  1080    logging.debug('A debug message')
       
  1081    logging.info('Some information')
       
  1082    logging.warning('A shot across the bows')
       
  1083 
       
  1084 which would result in output like ::
       
  1085 
       
  1086    Fri, 02 Jul 2004 13:06:18 DEBUG    A debug message
       
  1087    Fri, 02 Jul 2004 13:06:18 INFO     Some information
       
  1088    Fri, 02 Jul 2004 13:06:18 WARNING  A shot across the bows
       
  1089 
       
  1090 The date format string follows the requirements of :func:`strftime` - see the
       
  1091 documentation for the :mod:`time` module.
       
  1092 
       
  1093 If, instead of sending logging output to the console or a file, you'd rather use
       
  1094 a file-like object which you have created separately, you can pass it to
       
  1095 :func:`basicConfig` using the *stream* keyword argument. Note that if both
       
  1096 *stream* and *filename* keyword arguments are passed, the *stream* argument is
       
  1097 ignored.
       
  1098 
       
  1099 Of course, you can put variable information in your output. To do this, simply
       
  1100 have the message be a format string and pass in additional arguments containing
       
  1101 the variable information, as in the following example::
       
  1102 
       
  1103    import logging
       
  1104 
       
  1105    logging.basicConfig(level=logging.DEBUG,
       
  1106                        format='%(asctime)s %(levelname)-8s %(message)s',
       
  1107                        datefmt='%a, %d %b %Y %H:%M:%S',
       
  1108                        filename='/temp/myapp.log',
       
  1109                        filemode='w')
       
  1110    logging.error('Pack my box with %d dozen %s', 5, 'liquor jugs')
       
  1111 
       
  1112 which would result in ::
       
  1113 
       
  1114    Wed, 21 Jul 2004 15:35:16 ERROR    Pack my box with 5 dozen liquor jugs
       
  1115 
       
  1116 
       
  1117 .. _multiple-destinations:
       
  1118 
       
  1119 Logging to multiple destinations
       
  1120 --------------------------------
       
  1121 
       
  1122 Let's say you want to log to console and file with different message formats and
       
  1123 in differing circumstances. Say you want to log messages with levels of DEBUG
       
  1124 and higher to file, and those messages at level INFO and higher to the console.
       
  1125 Let's also assume that the file should contain timestamps, but the console
       
  1126 messages should not. Here's how you can achieve this::
       
  1127 
       
  1128    import logging
       
  1129 
       
  1130    # set up logging to file - see previous section for more details
       
  1131    logging.basicConfig(level=logging.DEBUG,
       
  1132                        format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
       
  1133                        datefmt='%m-%d %H:%M',
       
  1134                        filename='/temp/myapp.log',
       
  1135                        filemode='w')
       
  1136    # define a Handler which writes INFO messages or higher to the sys.stderr
       
  1137    console = logging.StreamHandler()
       
  1138    console.setLevel(logging.INFO)
       
  1139    # set a format which is simpler for console use
       
  1140    formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
       
  1141    # tell the handler to use this format
       
  1142    console.setFormatter(formatter)
       
  1143    # add the handler to the root logger
       
  1144    logging.getLogger('').addHandler(console)
       
  1145 
       
  1146    # Now, we can log to the root logger, or any other logger. First the root...
       
  1147    logging.info('Jackdaws love my big sphinx of quartz.')
       
  1148 
       
  1149    # Now, define a couple of other loggers which might represent areas in your
       
  1150    # application:
       
  1151 
       
  1152    logger1 = logging.getLogger('myapp.area1')
       
  1153    logger2 = logging.getLogger('myapp.area2')
       
  1154 
       
  1155    logger1.debug('Quick zephyrs blow, vexing daft Jim.')
       
  1156    logger1.info('How quickly daft jumping zebras vex.')
       
  1157    logger2.warning('Jail zesty vixen who grabbed pay from quack.')
       
  1158    logger2.error('The five boxing wizards jump quickly.')
       
  1159 
       
  1160 When you run this, on the console you will see ::
       
  1161 
       
  1162    root        : INFO     Jackdaws love my big sphinx of quartz.
       
  1163    myapp.area1 : INFO     How quickly daft jumping zebras vex.
       
  1164    myapp.area2 : WARNING  Jail zesty vixen who grabbed pay from quack.
       
  1165    myapp.area2 : ERROR    The five boxing wizards jump quickly.
       
  1166 
       
  1167 and in the file you will see something like ::
       
  1168 
       
  1169    10-22 22:19 root         INFO     Jackdaws love my big sphinx of quartz.
       
  1170    10-22 22:19 myapp.area1  DEBUG    Quick zephyrs blow, vexing daft Jim.
       
  1171    10-22 22:19 myapp.area1  INFO     How quickly daft jumping zebras vex.
       
  1172    10-22 22:19 myapp.area2  WARNING  Jail zesty vixen who grabbed pay from quack.
       
  1173    10-22 22:19 myapp.area2  ERROR    The five boxing wizards jump quickly.
       
  1174 
       
  1175 As you can see, the DEBUG message only shows up in the file. The other messages
       
  1176 are sent to both destinations.
       
  1177 
       
  1178 This example uses console and file handlers, but you can use any number and
       
  1179 combination of handlers you choose.
       
  1180 
       
  1181 
       
  1182 .. _context-info:
       
  1183 
       
  1184 Adding contextual information to your logging output
       
  1185 ----------------------------------------------------
       
  1186 
       
  1187 Sometimes you want logging output to contain contextual information in
       
  1188 addition to the parameters passed to the logging call. For example, in a
       
  1189 networked application, it may be desirable to log client-specific information
       
  1190 in the log (e.g. remote client's username, or IP address). Although you could
       
  1191 use the *extra* parameter to achieve this, it's not always convenient to pass
       
  1192 the information in this way. While it might be tempting to create
       
  1193 :class:`Logger` instances on a per-connection basis, this is not a good idea
       
  1194 because these instances are not garbage collected. While this is not a problem
       
  1195 in practice, when the number of :class:`Logger` instances is dependent on the
       
  1196 level of granularity you want to use in logging an application, it could
       
  1197 be hard to manage if the number of :class:`Logger` instances becomes
       
  1198 effectively unbounded.
       
  1199 
       
  1200 An easy way in which you can pass contextual information to be output along
       
  1201 with logging event information is to use the :class:`LoggerAdapter` class.
       
  1202 This class is designed to look like a :class:`Logger`, so that you can call
       
  1203 :meth:`debug`, :meth:`info`, :meth:`warning`, :meth:`error`,
       
  1204 :meth:`exception`, :meth:`critical` and :meth:`log`. These methods have the
       
  1205 same signatures as their counterparts in :class:`Logger`, so you can use the
       
  1206 two types of instances interchangeably.
       
  1207 
       
  1208 When you create an instance of :class:`LoggerAdapter`, you pass it a
       
  1209 :class:`Logger` instance and a dict-like object which contains your contextual
       
  1210 information. When you call one of the logging methods on an instance of
       
  1211 :class:`LoggerAdapter`, it delegates the call to the underlying instance of
       
  1212 :class:`Logger` passed to its constructor, and arranges to pass the contextual
       
  1213 information in the delegated call. Here's a snippet from the code of
       
  1214 :class:`LoggerAdapter`::
       
  1215 
       
  1216     def debug(self, msg, *args, **kwargs):
       
  1217         """
       
  1218         Delegate a debug call to the underlying logger, after adding
       
  1219         contextual information from this adapter instance.
       
  1220         """
       
  1221         msg, kwargs = self.process(msg, kwargs)
       
  1222         self.logger.debug(msg, *args, **kwargs)
       
  1223 
       
  1224 The :meth:`process` method of :class:`LoggerAdapter` is where the contextual
       
  1225 information is added to the logging output. It's passed the message and
       
  1226 keyword arguments of the logging call, and it passes back (potentially)
       
  1227 modified versions of these to use in the call to the underlying logger. The
       
  1228 default implementation of this method leaves the message alone, but inserts
       
  1229 an "extra" key in the keyword argument whose value is the dict-like object
       
  1230 passed to the constructor. Of course, if you had passed an "extra" keyword
       
  1231 argument in the call to the adapter, it will be silently overwritten.
       
  1232 
       
  1233 The advantage of using "extra" is that the values in the dict-like object are
       
  1234 merged into the :class:`LogRecord` instance's __dict__, allowing you to use
       
  1235 customized strings with your :class:`Formatter` instances which know about
       
  1236 the keys of the dict-like object. If you need a different method, e.g. if you
       
  1237 want to prepend or append the contextual information to the message string,
       
  1238 you just need to subclass :class:`LoggerAdapter` and override :meth:`process`
       
  1239 to do what you need. Here's an example script which uses this class, which
       
  1240 also illustrates what dict-like behaviour is needed from an arbitrary
       
  1241 "dict-like" object for use in the constructor::
       
  1242 
       
  1243    import logging
       
  1244 
       
  1245    class ConnInfo:
       
  1246        """
       
  1247        An example class which shows how an arbitrary class can be used as
       
  1248        the 'extra' context information repository passed to a LoggerAdapter.
       
  1249        """
       
  1250 
       
  1251        def __getitem__(self, name):
       
  1252            """
       
  1253            To allow this instance to look like a dict.
       
  1254            """
       
  1255            from random import choice
       
  1256            if name == "ip":
       
  1257                result = choice(["127.0.0.1", "192.168.0.1"])
       
  1258            elif name == "user":
       
  1259                result = choice(["jim", "fred", "sheila"])
       
  1260            else:
       
  1261                result = self.__dict__.get(name, "?")
       
  1262            return result
       
  1263 
       
  1264        def __iter__(self):
       
  1265            """
       
  1266            To allow iteration over keys, which will be merged into
       
  1267            the LogRecord dict before formatting and output.
       
  1268            """
       
  1269            keys = ["ip", "user"]
       
  1270            keys.extend(self.__dict__.keys())
       
  1271            return keys.__iter__()
       
  1272 
       
  1273    if __name__ == "__main__":
       
  1274        from random import choice
       
  1275        levels = (logging.DEBUG, logging.INFO, logging.WARNING, logging.ERROR, logging.CRITICAL)
       
  1276        a1 = logging.LoggerAdapter(logging.getLogger("a.b.c"),
       
  1277                                   { "ip" : "123.231.231.123", "user" : "sheila" })
       
  1278        logging.basicConfig(level=logging.DEBUG,
       
  1279                            format="%(asctime)-15s %(name)-5s %(levelname)-8s IP: %(ip)-15s User: %(user)-8s %(message)s")
       
  1280        a1.debug("A debug message")
       
  1281        a1.info("An info message with %s", "some parameters")
       
  1282        a2 = logging.LoggerAdapter(logging.getLogger("d.e.f"), ConnInfo())
       
  1283        for x in range(10):
       
  1284            lvl = choice(levels)
       
  1285            lvlname = logging.getLevelName(lvl)
       
  1286            a2.log(lvl, "A message at %s level with %d %s", lvlname, 2, "parameters")
       
  1287 
       
  1288 When this script is run, the output should look something like this::
       
  1289 
       
  1290    2008-01-18 14:49:54,023 a.b.c DEBUG    IP: 123.231.231.123 User: sheila   A debug message
       
  1291    2008-01-18 14:49:54,023 a.b.c INFO     IP: 123.231.231.123 User: sheila   An info message with some parameters
       
  1292    2008-01-18 14:49:54,023 d.e.f CRITICAL IP: 192.168.0.1     User: jim      A message at CRITICAL level with 2 parameters
       
  1293    2008-01-18 14:49:54,033 d.e.f INFO     IP: 192.168.0.1     User: jim      A message at INFO level with 2 parameters
       
  1294    2008-01-18 14:49:54,033 d.e.f WARNING  IP: 192.168.0.1     User: sheila   A message at WARNING level with 2 parameters
       
  1295    2008-01-18 14:49:54,033 d.e.f ERROR    IP: 127.0.0.1       User: fred     A message at ERROR level with 2 parameters
       
  1296    2008-01-18 14:49:54,033 d.e.f ERROR    IP: 127.0.0.1       User: sheila   A message at ERROR level with 2 parameters
       
  1297    2008-01-18 14:49:54,033 d.e.f WARNING  IP: 192.168.0.1     User: sheila   A message at WARNING level with 2 parameters
       
  1298    2008-01-18 14:49:54,033 d.e.f WARNING  IP: 192.168.0.1     User: jim      A message at WARNING level with 2 parameters
       
  1299    2008-01-18 14:49:54,033 d.e.f INFO     IP: 192.168.0.1     User: fred     A message at INFO level with 2 parameters
       
  1300    2008-01-18 14:49:54,033 d.e.f WARNING  IP: 192.168.0.1     User: sheila   A message at WARNING level with 2 parameters
       
  1301    2008-01-18 14:49:54,033 d.e.f WARNING  IP: 127.0.0.1       User: jim      A message at WARNING level with 2 parameters
       
  1302 
       
  1303 .. versionadded:: 2.6
       
  1304 
       
  1305 The :class:`LoggerAdapter` class was not present in previous versions.
       
  1306 
       
  1307 
       
  1308 .. _network-logging:
       
  1309 
       
  1310 Sending and receiving logging events across a network
       
  1311 -----------------------------------------------------
       
  1312 
       
  1313 Let's say you want to send logging events across a network, and handle them at
       
  1314 the receiving end. A simple way of doing this is attaching a
       
  1315 :class:`SocketHandler` instance to the root logger at the sending end::
       
  1316 
       
  1317    import logging, logging.handlers
       
  1318 
       
  1319    rootLogger = logging.getLogger('')
       
  1320    rootLogger.setLevel(logging.DEBUG)
       
  1321    socketHandler = logging.handlers.SocketHandler('localhost',
       
  1322                        logging.handlers.DEFAULT_TCP_LOGGING_PORT)
       
  1323    # don't bother with a formatter, since a socket handler sends the event as
       
  1324    # an unformatted pickle
       
  1325    rootLogger.addHandler(socketHandler)
       
  1326 
       
  1327    # Now, we can log to the root logger, or any other logger. First the root...
       
  1328    logging.info('Jackdaws love my big sphinx of quartz.')
       
  1329 
       
  1330    # Now, define a couple of other loggers which might represent areas in your
       
  1331    # application:
       
  1332 
       
  1333    logger1 = logging.getLogger('myapp.area1')
       
  1334    logger2 = logging.getLogger('myapp.area2')
       
  1335 
       
  1336    logger1.debug('Quick zephyrs blow, vexing daft Jim.')
       
  1337    logger1.info('How quickly daft jumping zebras vex.')
       
  1338    logger2.warning('Jail zesty vixen who grabbed pay from quack.')
       
  1339    logger2.error('The five boxing wizards jump quickly.')
       
  1340 
       
  1341 At the receiving end, you can set up a receiver using the :mod:`SocketServer`
       
  1342 module. Here is a basic working example::
       
  1343 
       
  1344    import cPickle
       
  1345    import logging
       
  1346    import logging.handlers
       
  1347    import SocketServer
       
  1348    import struct
       
  1349 
       
  1350 
       
  1351    class LogRecordStreamHandler(SocketServer.StreamRequestHandler):
       
  1352        """Handler for a streaming logging request.
       
  1353 
       
  1354        This basically logs the record using whatever logging policy is
       
  1355        configured locally.
       
  1356        """
       
  1357 
       
  1358        def handle(self):
       
  1359            """
       
  1360            Handle multiple requests - each expected to be a 4-byte length,
       
  1361            followed by the LogRecord in pickle format. Logs the record
       
  1362            according to whatever policy is configured locally.
       
  1363            """
       
  1364            while 1:
       
  1365                chunk = self.connection.recv(4)
       
  1366                if len(chunk) < 4:
       
  1367                    break
       
  1368                slen = struct.unpack(">L", chunk)[0]
       
  1369                chunk = self.connection.recv(slen)
       
  1370                while len(chunk) < slen:
       
  1371                    chunk = chunk + self.connection.recv(slen - len(chunk))
       
  1372                obj = self.unPickle(chunk)
       
  1373                record = logging.makeLogRecord(obj)
       
  1374                self.handleLogRecord(record)
       
  1375 
       
  1376        def unPickle(self, data):
       
  1377            return cPickle.loads(data)
       
  1378 
       
  1379        def handleLogRecord(self, record):
       
  1380            # if a name is specified, we use the named logger rather than the one
       
  1381            # implied by the record.
       
  1382            if self.server.logname is not None:
       
  1383                name = self.server.logname
       
  1384            else:
       
  1385                name = record.name
       
  1386            logger = logging.getLogger(name)
       
  1387            # N.B. EVERY record gets logged. This is because Logger.handle
       
  1388            # is normally called AFTER logger-level filtering. If you want
       
  1389            # to do filtering, do it at the client end to save wasting
       
  1390            # cycles and network bandwidth!
       
  1391            logger.handle(record)
       
  1392 
       
  1393    class LogRecordSocketReceiver(SocketServer.ThreadingTCPServer):
       
  1394        """simple TCP socket-based logging receiver suitable for testing.
       
  1395        """
       
  1396 
       
  1397        allow_reuse_address = 1
       
  1398 
       
  1399        def __init__(self, host='localhost',
       
  1400                     port=logging.handlers.DEFAULT_TCP_LOGGING_PORT,
       
  1401                     handler=LogRecordStreamHandler):
       
  1402            SocketServer.ThreadingTCPServer.__init__(self, (host, port), handler)
       
  1403            self.abort = 0
       
  1404            self.timeout = 1
       
  1405            self.logname = None
       
  1406 
       
  1407        def serve_until_stopped(self):
       
  1408            import select
       
  1409            abort = 0
       
  1410            while not abort:
       
  1411                rd, wr, ex = select.select([self.socket.fileno()],
       
  1412                                           [], [],
       
  1413                                           self.timeout)
       
  1414                if rd:
       
  1415                    self.handle_request()
       
  1416                abort = self.abort
       
  1417 
       
  1418    def main():
       
  1419        logging.basicConfig(
       
  1420            format="%(relativeCreated)5d %(name)-15s %(levelname)-8s %(message)s")
       
  1421        tcpserver = LogRecordSocketReceiver()
       
  1422        print "About to start TCP server..."
       
  1423        tcpserver.serve_until_stopped()
       
  1424 
       
  1425    if __name__ == "__main__":
       
  1426        main()
       
  1427 
       
  1428 First run the server, and then the client. On the client side, nothing is
       
  1429 printed on the console; on the server side, you should see something like::
       
  1430 
       
  1431    About to start TCP server...
       
  1432       59 root            INFO     Jackdaws love my big sphinx of quartz.
       
  1433       59 myapp.area1     DEBUG    Quick zephyrs blow, vexing daft Jim.
       
  1434       69 myapp.area1     INFO     How quickly daft jumping zebras vex.
       
  1435       69 myapp.area2     WARNING  Jail zesty vixen who grabbed pay from quack.
       
  1436       69 myapp.area2     ERROR    The five boxing wizards jump quickly.
       
  1437 
       
  1438 
       
  1439 Handler Objects
       
  1440 ---------------
       
  1441 
       
  1442 Handlers have the following attributes and methods. Note that :class:`Handler`
       
  1443 is never instantiated directly; this class acts as a base for more useful
       
  1444 subclasses. However, the :meth:`__init__` method in subclasses needs to call
       
  1445 :meth:`Handler.__init__`.
       
  1446 
       
  1447 
       
  1448 .. method:: Handler.__init__(level=NOTSET)
       
  1449 
       
  1450    Initializes the :class:`Handler` instance by setting its level, setting the list
       
  1451    of filters to the empty list and creating a lock (using :meth:`createLock`) for
       
  1452    serializing access to an I/O mechanism.
       
  1453 
       
  1454 
       
  1455 .. method:: Handler.createLock()
       
  1456 
       
  1457    Initializes a thread lock which can be used to serialize access to underlying
       
  1458    I/O functionality which may not be threadsafe.
       
  1459 
       
  1460 
       
  1461 .. method:: Handler.acquire()
       
  1462 
       
  1463    Acquires the thread lock created with :meth:`createLock`.
       
  1464 
       
  1465 
       
  1466 .. method:: Handler.release()
       
  1467 
       
  1468    Releases the thread lock acquired with :meth:`acquire`.
       
  1469 
       
  1470 
       
  1471 .. method:: Handler.setLevel(lvl)
       
  1472 
       
  1473    Sets the threshold for this handler to *lvl*. Logging messages which are less
       
  1474    severe than *lvl* will be ignored. When a handler is created, the level is set
       
  1475    to :const:`NOTSET` (which causes all messages to be processed).
       
  1476 
       
  1477 
       
  1478 .. method:: Handler.setFormatter(form)
       
  1479 
       
  1480    Sets the :class:`Formatter` for this handler to *form*.
       
  1481 
       
  1482 
       
  1483 .. method:: Handler.addFilter(filt)
       
  1484 
       
  1485    Adds the specified filter *filt* to this handler.
       
  1486 
       
  1487 
       
  1488 .. method:: Handler.removeFilter(filt)
       
  1489 
       
  1490    Removes the specified filter *filt* from this handler.
       
  1491 
       
  1492 
       
  1493 .. method:: Handler.filter(record)
       
  1494 
       
  1495    Applies this handler's filters to the record and returns a true value if the
       
  1496    record is to be processed.
       
  1497 
       
  1498 
       
  1499 .. method:: Handler.flush()
       
  1500 
       
  1501    Ensure all logging output has been flushed. This version does nothing and is
       
  1502    intended to be implemented by subclasses.
       
  1503 
       
  1504 
       
  1505 .. method:: Handler.close()
       
  1506 
       
  1507    Tidy up any resources used by the handler. This version does no output but
       
  1508    removes the handler from an internal list of handlers which is closed when
       
  1509    :func:`shutdown` is called. Subclasses should ensure that this gets called
       
  1510    from overridden :meth:`close` methods.
       
  1511 
       
  1512 
       
  1513 .. method:: Handler.handle(record)
       
  1514 
       
  1515    Conditionally emits the specified logging record, depending on filters which may
       
  1516    have been added to the handler. Wraps the actual emission of the record with
       
  1517    acquisition/release of the I/O thread lock.
       
  1518 
       
  1519 
       
  1520 .. method:: Handler.handleError(record)
       
  1521 
       
  1522    This method should be called from handlers when an exception is encountered
       
  1523    during an :meth:`emit` call. By default it does nothing, which means that
       
  1524    exceptions get silently ignored. This is what is mostly wanted for a logging
       
  1525    system - most users will not care about errors in the logging system, they are
       
  1526    more interested in application errors. You could, however, replace this with a
       
  1527    custom handler if you wish. The specified record is the one which was being
       
  1528    processed when the exception occurred.
       
  1529 
       
  1530 
       
  1531 .. method:: Handler.format(record)
       
  1532 
       
  1533    Do formatting for a record - if a formatter is set, use it. Otherwise, use the
       
  1534    default formatter for the module.
       
  1535 
       
  1536 
       
  1537 .. method:: Handler.emit(record)
       
  1538 
       
  1539    Do whatever it takes to actually log the specified logging record. This version
       
  1540    is intended to be implemented by subclasses and so raises a
       
  1541    :exc:`NotImplementedError`.
       
  1542 
       
  1543 
       
  1544 StreamHandler
       
  1545 ^^^^^^^^^^^^^
       
  1546 
       
  1547 The :class:`StreamHandler` class, located in the core :mod:`logging` package,
       
  1548 sends logging output to streams such as *sys.stdout*, *sys.stderr* or any
       
  1549 file-like object (or, more precisely, any object which supports :meth:`write`
       
  1550 and :meth:`flush` methods).
       
  1551 
       
  1552 
       
  1553 .. class:: StreamHandler([strm])
       
  1554 
       
  1555    Returns a new instance of the :class:`StreamHandler` class. If *strm* is
       
  1556    specified, the instance will use it for logging output; otherwise, *sys.stderr*
       
  1557    will be used.
       
  1558 
       
  1559 
       
  1560    .. method:: emit(record)
       
  1561 
       
  1562       If a formatter is specified, it is used to format the record. The record
       
  1563       is then written to the stream with a trailing newline. If exception
       
  1564       information is present, it is formatted using
       
  1565       :func:`traceback.print_exception` and appended to the stream.
       
  1566 
       
  1567 
       
  1568    .. method:: flush()
       
  1569 
       
  1570       Flushes the stream by calling its :meth:`flush` method. Note that the
       
  1571       :meth:`close` method is inherited from :class:`Handler` and so does
       
  1572       no output, so an explicit :meth:`flush` call may be needed at times.
       
  1573 
       
  1574 
       
  1575 FileHandler
       
  1576 ^^^^^^^^^^^
       
  1577 
       
  1578 The :class:`FileHandler` class, located in the core :mod:`logging` package,
       
  1579 sends logging output to a disk file.  It inherits the output functionality from
       
  1580 :class:`StreamHandler`.
       
  1581 
       
  1582 
       
  1583 .. class:: FileHandler(filename[, mode[, encoding[, delay]]])
       
  1584 
       
  1585    Returns a new instance of the :class:`FileHandler` class. The specified file is
       
  1586    opened and used as the stream for logging. If *mode* is not specified,
       
  1587    :const:`'a'` is used.  If *encoding* is not *None*, it is used to open the file
       
  1588    with that encoding.  If *delay* is true, then file opening is deferred until the
       
  1589    first call to :meth:`emit`. By default, the file grows indefinitely.
       
  1590 
       
  1591 
       
  1592    .. method:: close()
       
  1593 
       
  1594       Closes the file.
       
  1595 
       
  1596 
       
  1597    .. method:: emit(record)
       
  1598 
       
  1599       Outputs the record to the file.
       
  1600 
       
  1601 
       
  1602 WatchedFileHandler
       
  1603 ^^^^^^^^^^^^^^^^^^
       
  1604 
       
  1605 .. versionadded:: 2.6
       
  1606 
       
  1607 The :class:`WatchedFileHandler` class, located in the :mod:`logging.handlers`
       
  1608 module, is a :class:`FileHandler` which watches the file it is logging to. If
       
  1609 the file changes, it is closed and reopened using the file name.
       
  1610 
       
  1611 A file change can happen because of usage of programs such as *newsyslog* and
       
  1612 *logrotate* which perform log file rotation. This handler, intended for use
       
  1613 under Unix/Linux, watches the file to see if it has changed since the last emit.
       
  1614 (A file is deemed to have changed if its device or inode have changed.) If the
       
  1615 file has changed, the old file stream is closed, and the file opened to get a
       
  1616 new stream.
       
  1617 
       
  1618 This handler is not appropriate for use under Windows, because under Windows
       
  1619 open log files cannot be moved or renamed - logging opens the files with
       
  1620 exclusive locks - and so there is no need for such a handler. Furthermore,
       
  1621 *ST_INO* is not supported under Windows; :func:`stat` always returns zero for
       
  1622 this value.
       
  1623 
       
  1624 
       
  1625 .. class:: WatchedFileHandler(filename[,mode[, encoding[, delay]]])
       
  1626 
       
  1627    Returns a new instance of the :class:`WatchedFileHandler` class. The specified
       
  1628    file is opened and used as the stream for logging. If *mode* is not specified,
       
  1629    :const:`'a'` is used.  If *encoding* is not *None*, it is used to open the file
       
  1630    with that encoding.  If *delay* is true, then file opening is deferred until the
       
  1631    first call to :meth:`emit`.  By default, the file grows indefinitely.
       
  1632 
       
  1633 
       
  1634    .. method:: emit(record)
       
  1635 
       
  1636       Outputs the record to the file, but first checks to see if the file has
       
  1637       changed.  If it has, the existing stream is flushed and closed and the
       
  1638       file opened again, before outputting the record to the file.
       
  1639 
       
  1640 
       
  1641 RotatingFileHandler
       
  1642 ^^^^^^^^^^^^^^^^^^^
       
  1643 
       
  1644 The :class:`RotatingFileHandler` class, located in the :mod:`logging.handlers`
       
  1645 module, supports rotation of disk log files.
       
  1646 
       
  1647 
       
  1648 .. class:: RotatingFileHandler(filename[, mode[, maxBytes[, backupCount[, encoding[, delay]]]]])
       
  1649 
       
  1650    Returns a new instance of the :class:`RotatingFileHandler` class. The specified
       
  1651    file is opened and used as the stream for logging. If *mode* is not specified,
       
  1652    ``'a'`` is used.  If *encoding* is not *None*, it is used to open the file
       
  1653    with that encoding.  If *delay* is true, then file opening is deferred until the
       
  1654    first call to :meth:`emit`.  By default, the file grows indefinitely.
       
  1655 
       
  1656    You can use the *maxBytes* and *backupCount* values to allow the file to
       
  1657    :dfn:`rollover` at a predetermined size. When the size is about to be exceeded,
       
  1658    the file is closed and a new file is silently opened for output. Rollover occurs
       
  1659    whenever the current log file is nearly *maxBytes* in length; if *maxBytes* is
       
  1660    zero, rollover never occurs.  If *backupCount* is non-zero, the system will save
       
  1661    old log files by appending the extensions ".1", ".2" etc., to the filename. For
       
  1662    example, with a *backupCount* of 5 and a base file name of :file:`app.log`, you
       
  1663    would get :file:`app.log`, :file:`app.log.1`, :file:`app.log.2`, up to
       
  1664    :file:`app.log.5`. The file being written to is always :file:`app.log`.  When
       
  1665    this file is filled, it is closed and renamed to :file:`app.log.1`, and if files
       
  1666    :file:`app.log.1`, :file:`app.log.2`, etc.  exist, then they are renamed to
       
  1667    :file:`app.log.2`, :file:`app.log.3` etc.  respectively.
       
  1668 
       
  1669 
       
  1670    .. method:: doRollover()
       
  1671 
       
  1672       Does a rollover, as described above.
       
  1673 
       
  1674 
       
  1675    .. method:: emit(record)
       
  1676 
       
  1677       Outputs the record to the file, catering for rollover as described
       
  1678       previously.
       
  1679 
       
  1680 
       
  1681 TimedRotatingFileHandler
       
  1682 ^^^^^^^^^^^^^^^^^^^^^^^^
       
  1683 
       
  1684 The :class:`TimedRotatingFileHandler` class, located in the
       
  1685 :mod:`logging.handlers` module, supports rotation of disk log files at certain
       
  1686 timed intervals.
       
  1687 
       
  1688 
       
  1689 .. class:: TimedRotatingFileHandler(filename [,when [,interval [,backupCount[, encoding[, delay[, utc]]]]]])
       
  1690 
       
  1691    Returns a new instance of the :class:`TimedRotatingFileHandler` class. The
       
  1692    specified file is opened and used as the stream for logging. On rotating it also
       
  1693    sets the filename suffix. Rotating happens based on the product of *when* and
       
  1694    *interval*.
       
  1695 
       
  1696    You can use the *when* to specify the type of *interval*. The list of possible
       
  1697    values is below.  Note that they are not case sensitive.
       
  1698 
       
  1699    +----------------+-----------------------+
       
  1700    | Value          | Type of interval      |
       
  1701    +================+=======================+
       
  1702    | ``'S'``        | Seconds               |
       
  1703    +----------------+-----------------------+
       
  1704    | ``'M'``        | Minutes               |
       
  1705    +----------------+-----------------------+
       
  1706    | ``'H'``        | Hours                 |
       
  1707    +----------------+-----------------------+
       
  1708    | ``'D'``        | Days                  |
       
  1709    +----------------+-----------------------+
       
  1710    | ``'W'``        | Week day (0=Monday)   |
       
  1711    +----------------+-----------------------+
       
  1712    | ``'midnight'`` | Roll over at midnight |
       
  1713    +----------------+-----------------------+
       
  1714 
       
  1715    The system will save old log files by appending extensions to the filename.
       
  1716    The extensions are date-and-time based, using the strftime format
       
  1717    ``%Y-%m-%d_%H-%M-%S`` or a leading portion thereof, depending on the
       
  1718    rollover interval.
       
  1719    If the *utc* argument is true, times in UTC will be used; otherwise
       
  1720    local time is used.
       
  1721 
       
  1722    If *backupCount* is nonzero, at most *backupCount* files
       
  1723    will be kept, and if more would be created when rollover occurs, the oldest
       
  1724    one is deleted. The deletion logic uses the interval to determine which
       
  1725    files to delete, so changing the interval may leave old files lying around.
       
  1726 
       
  1727 
       
  1728    .. method:: doRollover()
       
  1729 
       
  1730       Does a rollover, as described above.
       
  1731 
       
  1732 
       
  1733    .. method:: emit(record)
       
  1734 
       
  1735       Outputs the record to the file, catering for rollover as described above.
       
  1736 
       
  1737 
       
  1738 SocketHandler
       
  1739 ^^^^^^^^^^^^^
       
  1740 
       
  1741 The :class:`SocketHandler` class, located in the :mod:`logging.handlers` module,
       
  1742 sends logging output to a network socket. The base class uses a TCP socket.
       
  1743 
       
  1744 
       
  1745 .. class:: SocketHandler(host, port)
       
  1746 
       
  1747    Returns a new instance of the :class:`SocketHandler` class intended to
       
  1748    communicate with a remote machine whose address is given by *host* and *port*.
       
  1749 
       
  1750 
       
  1751    .. method:: close()
       
  1752 
       
  1753       Closes the socket.
       
  1754 
       
  1755 
       
  1756    .. method:: emit()
       
  1757 
       
  1758       Pickles the record's attribute dictionary and writes it to the socket in
       
  1759       binary format. If there is an error with the socket, silently drops the
       
  1760       packet. If the connection was previously lost, re-establishes the
       
  1761       connection. To unpickle the record at the receiving end into a
       
  1762       :class:`LogRecord`, use the :func:`makeLogRecord` function.
       
  1763 
       
  1764 
       
  1765    .. method:: handleError()
       
  1766 
       
  1767       Handles an error which has occurred during :meth:`emit`. The most likely
       
  1768       cause is a lost connection. Closes the socket so that we can retry on the
       
  1769       next event.
       
  1770 
       
  1771 
       
  1772    .. method:: makeSocket()
       
  1773 
       
  1774       This is a factory method which allows subclasses to define the precise
       
  1775       type of socket they want. The default implementation creates a TCP socket
       
  1776       (:const:`socket.SOCK_STREAM`).
       
  1777 
       
  1778 
       
  1779    .. method:: makePickle(record)
       
  1780 
       
  1781       Pickles the record's attribute dictionary in binary format with a length
       
  1782       prefix, and returns it ready for transmission across the socket.
       
  1783 
       
  1784 
       
  1785    .. method:: send(packet)
       
  1786 
       
  1787       Send a pickled string *packet* to the socket. This function allows for
       
  1788       partial sends which can happen when the network is busy.
       
  1789 
       
  1790 
       
  1791 DatagramHandler
       
  1792 ^^^^^^^^^^^^^^^
       
  1793 
       
  1794 The :class:`DatagramHandler` class, located in the :mod:`logging.handlers`
       
  1795 module, inherits from :class:`SocketHandler` to support sending logging messages
       
  1796 over UDP sockets.
       
  1797 
       
  1798 
       
  1799 .. class:: DatagramHandler(host, port)
       
  1800 
       
  1801    Returns a new instance of the :class:`DatagramHandler` class intended to
       
  1802    communicate with a remote machine whose address is given by *host* and *port*.
       
  1803 
       
  1804 
       
  1805    .. method:: emit()
       
  1806 
       
  1807       Pickles the record's attribute dictionary and writes it to the socket in
       
  1808       binary format. If there is an error with the socket, silently drops the
       
  1809       packet. To unpickle the record at the receiving end into a
       
  1810       :class:`LogRecord`, use the :func:`makeLogRecord` function.
       
  1811 
       
  1812 
       
  1813    .. method:: makeSocket()
       
  1814 
       
  1815       The factory method of :class:`SocketHandler` is here overridden to create
       
  1816       a UDP socket (:const:`socket.SOCK_DGRAM`).
       
  1817 
       
  1818 
       
  1819    .. method:: send(s)
       
  1820 
       
  1821       Send a pickled string to a socket.
       
  1822 
       
  1823 
       
  1824 SysLogHandler
       
  1825 ^^^^^^^^^^^^^
       
  1826 
       
  1827 The :class:`SysLogHandler` class, located in the :mod:`logging.handlers` module,
       
  1828 supports sending logging messages to a remote or local Unix syslog.
       
  1829 
       
  1830 
       
  1831 .. class:: SysLogHandler([address[, facility]])
       
  1832 
       
  1833    Returns a new instance of the :class:`SysLogHandler` class intended to
       
  1834    communicate with a remote Unix machine whose address is given by *address* in
       
  1835    the form of a ``(host, port)`` tuple.  If *address* is not specified,
       
  1836    ``('localhost', 514)`` is used.  The address is used to open a UDP socket.  An
       
  1837    alternative to providing a ``(host, port)`` tuple is providing an address as a
       
  1838    string, for example "/dev/log". In this case, a Unix domain socket is used to
       
  1839    send the message to the syslog. If *facility* is not specified,
       
  1840    :const:`LOG_USER` is used.
       
  1841 
       
  1842 
       
  1843    .. method:: close()
       
  1844 
       
  1845       Closes the socket to the remote host.
       
  1846 
       
  1847 
       
  1848    .. method:: emit(record)
       
  1849 
       
  1850       The record is formatted, and then sent to the syslog server. If exception
       
  1851       information is present, it is *not* sent to the server.
       
  1852 
       
  1853 
       
  1854    .. method:: encodePriority(facility, priority)
       
  1855 
       
  1856       Encodes the facility and priority into an integer. You can pass in strings
       
  1857       or integers - if strings are passed, internal mapping dictionaries are
       
  1858       used to convert them to integers.
       
  1859 
       
  1860 
       
  1861 NTEventLogHandler
       
  1862 ^^^^^^^^^^^^^^^^^
       
  1863 
       
  1864 The :class:`NTEventLogHandler` class, located in the :mod:`logging.handlers`
       
  1865 module, supports sending logging messages to a local Windows NT, Windows 2000 or
       
  1866 Windows XP event log. Before you can use it, you need Mark Hammond's Win32
       
  1867 extensions for Python installed.
       
  1868 
       
  1869 
       
  1870 .. class:: NTEventLogHandler(appname[, dllname[, logtype]])
       
  1871 
       
  1872    Returns a new instance of the :class:`NTEventLogHandler` class. The *appname* is
       
  1873    used to define the application name as it appears in the event log. An
       
  1874    appropriate registry entry is created using this name. The *dllname* should give
       
  1875    the fully qualified pathname of a .dll or .exe which contains message
       
  1876    definitions to hold in the log (if not specified, ``'win32service.pyd'`` is used
       
  1877    - this is installed with the Win32 extensions and contains some basic
       
  1878    placeholder message definitions. Note that use of these placeholders will make
       
  1879    your event logs big, as the entire message source is held in the log. If you
       
  1880    want slimmer logs, you have to pass in the name of your own .dll or .exe which
       
  1881    contains the message definitions you want to use in the event log). The
       
  1882    *logtype* is one of ``'Application'``, ``'System'`` or ``'Security'``, and
       
  1883    defaults to ``'Application'``.
       
  1884 
       
  1885 
       
  1886    .. method:: close()
       
  1887 
       
  1888       At this point, you can remove the application name from the registry as a
       
  1889       source of event log entries. However, if you do this, you will not be able
       
  1890       to see the events as you intended in the Event Log Viewer - it needs to be
       
  1891       able to access the registry to get the .dll name. The current version does
       
  1892       not do this.
       
  1893 
       
  1894 
       
  1895    .. method:: emit(record)
       
  1896 
       
  1897       Determines the message ID, event category and event type, and then logs
       
  1898       the message in the NT event log.
       
  1899 
       
  1900 
       
  1901    .. method:: getEventCategory(record)
       
  1902 
       
  1903       Returns the event category for the record. Override this if you want to
       
  1904       specify your own categories. This version returns 0.
       
  1905 
       
  1906 
       
  1907    .. method:: getEventType(record)
       
  1908 
       
  1909       Returns the event type for the record. Override this if you want to
       
  1910       specify your own types. This version does a mapping using the handler's
       
  1911       typemap attribute, which is set up in :meth:`__init__` to a dictionary
       
  1912       which contains mappings for :const:`DEBUG`, :const:`INFO`,
       
  1913       :const:`WARNING`, :const:`ERROR` and :const:`CRITICAL`. If you are using
       
  1914       your own levels, you will either need to override this method or place a
       
  1915       suitable dictionary in the handler's *typemap* attribute.
       
  1916 
       
  1917 
       
  1918    .. method:: getMessageID(record)
       
  1919 
       
  1920       Returns the message ID for the record. If you are using your own messages,
       
  1921       you could do this by having the *msg* passed to the logger being an ID
       
  1922       rather than a format string. Then, in here, you could use a dictionary
       
  1923       lookup to get the message ID. This version returns 1, which is the base
       
  1924       message ID in :file:`win32service.pyd`.
       
  1925 
       
  1926 
       
  1927 SMTPHandler
       
  1928 ^^^^^^^^^^^
       
  1929 
       
  1930 The :class:`SMTPHandler` class, located in the :mod:`logging.handlers` module,
       
  1931 supports sending logging messages to an email address via SMTP.
       
  1932 
       
  1933 
       
  1934 .. class:: SMTPHandler(mailhost, fromaddr, toaddrs, subject[, credentials])
       
  1935 
       
  1936    Returns a new instance of the :class:`SMTPHandler` class. The instance is
       
  1937    initialized with the from and to addresses and subject line of the email. The
       
  1938    *toaddrs* should be a list of strings. To specify a non-standard SMTP port, use
       
  1939    the (host, port) tuple format for the *mailhost* argument. If you use a string,
       
  1940    the standard SMTP port is used. If your SMTP server requires authentication, you
       
  1941    can specify a (username, password) tuple for the *credentials* argument.
       
  1942 
       
  1943    .. versionchanged:: 2.6
       
  1944       *credentials* was added.
       
  1945 
       
  1946 
       
  1947    .. method:: emit(record)
       
  1948 
       
  1949       Formats the record and sends it to the specified addressees.
       
  1950 
       
  1951 
       
  1952    .. method:: getSubject(record)
       
  1953 
       
  1954       If you want to specify a subject line which is record-dependent, override
       
  1955       this method.
       
  1956 
       
  1957 
       
  1958 MemoryHandler
       
  1959 ^^^^^^^^^^^^^
       
  1960 
       
  1961 The :class:`MemoryHandler` class, located in the :mod:`logging.handlers` module,
       
  1962 supports buffering of logging records in memory, periodically flushing them to a
       
  1963 :dfn:`target` handler. Flushing occurs whenever the buffer is full, or when an
       
  1964 event of a certain severity or greater is seen.
       
  1965 
       
  1966 :class:`MemoryHandler` is a subclass of the more general
       
  1967 :class:`BufferingHandler`, which is an abstract class. This buffers logging
       
  1968 records in memory. Whenever each record is added to the buffer, a check is made
       
  1969 by calling :meth:`shouldFlush` to see if the buffer should be flushed.  If it
       
  1970 should, then :meth:`flush` is expected to do the needful.
       
  1971 
       
  1972 
       
  1973 .. class:: BufferingHandler(capacity)
       
  1974 
       
  1975    Initializes the handler with a buffer of the specified capacity.
       
  1976 
       
  1977 
       
  1978    .. method:: emit(record)
       
  1979 
       
  1980       Appends the record to the buffer. If :meth:`shouldFlush` returns true,
       
  1981       calls :meth:`flush` to process the buffer.
       
  1982 
       
  1983 
       
  1984    .. method:: flush()
       
  1985 
       
  1986       You can override this to implement custom flushing behavior. This version
       
  1987       just zaps the buffer to empty.
       
  1988 
       
  1989 
       
  1990    .. method:: shouldFlush(record)
       
  1991 
       
  1992       Returns true if the buffer is up to capacity. This method can be
       
  1993       overridden to implement custom flushing strategies.
       
  1994 
       
  1995 
       
  1996 .. class:: MemoryHandler(capacity[, flushLevel [, target]])
       
  1997 
       
  1998    Returns a new instance of the :class:`MemoryHandler` class. The instance is
       
  1999    initialized with a buffer size of *capacity*. If *flushLevel* is not specified,
       
  2000    :const:`ERROR` is used. If no *target* is specified, the target will need to be
       
  2001    set using :meth:`setTarget` before this handler does anything useful.
       
  2002 
       
  2003 
       
  2004    .. method:: close()
       
  2005 
       
  2006       Calls :meth:`flush`, sets the target to :const:`None` and clears the
       
  2007       buffer.
       
  2008 
       
  2009 
       
  2010    .. method:: flush()
       
  2011 
       
  2012       For a :class:`MemoryHandler`, flushing means just sending the buffered
       
  2013       records to the target, if there is one. Override if you want different
       
  2014       behavior.
       
  2015 
       
  2016 
       
  2017    .. method:: setTarget(target)
       
  2018 
       
  2019       Sets the target handler for this handler.
       
  2020 
       
  2021 
       
  2022    .. method:: shouldFlush(record)
       
  2023 
       
  2024       Checks for buffer full or a record at the *flushLevel* or higher.
       
  2025 
       
  2026 
       
  2027 HTTPHandler
       
  2028 ^^^^^^^^^^^
       
  2029 
       
  2030 The :class:`HTTPHandler` class, located in the :mod:`logging.handlers` module,
       
  2031 supports sending logging messages to a Web server, using either ``GET`` or
       
  2032 ``POST`` semantics.
       
  2033 
       
  2034 
       
  2035 .. class:: HTTPHandler(host, url[, method])
       
  2036 
       
  2037    Returns a new instance of the :class:`HTTPHandler` class. The instance is
       
  2038    initialized with a host address, url and HTTP method. The *host* can be of the
       
  2039    form ``host:port``, should you need to use a specific port number. If no
       
  2040    *method* is specified, ``GET`` is used.
       
  2041 
       
  2042 
       
  2043    .. method:: emit(record)
       
  2044 
       
  2045       Sends the record to the Web server as an URL-encoded dictionary.
       
  2046 
       
  2047 
       
  2048 .. _formatter-objects:
       
  2049 
       
  2050 Formatter Objects
       
  2051 -----------------
       
  2052 
       
  2053 :class:`Formatter`\ s have the following attributes and methods. They are
       
  2054 responsible for converting a :class:`LogRecord` to (usually) a string which can
       
  2055 be interpreted by either a human or an external system. The base
       
  2056 :class:`Formatter` allows a formatting string to be specified. If none is
       
  2057 supplied, the default value of ``'%(message)s'`` is used.
       
  2058 
       
  2059 A Formatter can be initialized with a format string which makes use of knowledge
       
  2060 of the :class:`LogRecord` attributes - such as the default value mentioned above
       
  2061 making use of the fact that the user's message and arguments are pre-formatted
       
  2062 into a :class:`LogRecord`'s *message* attribute.  This format string contains
       
  2063 standard python %-style mapping keys. See section :ref:`string-formatting`
       
  2064 for more information on string formatting.
       
  2065 
       
  2066 Currently, the useful mapping keys in a :class:`LogRecord` are:
       
  2067 
       
  2068 +-------------------------+-----------------------------------------------+
       
  2069 | Format                  | Description                                   |
       
  2070 +=========================+===============================================+
       
  2071 | ``%(name)s``            | Name of the logger (logging channel).         |
       
  2072 +-------------------------+-----------------------------------------------+
       
  2073 | ``%(levelno)s``         | Numeric logging level for the message         |
       
  2074 |                         | (:const:`DEBUG`, :const:`INFO`,               |
       
  2075 |                         | :const:`WARNING`, :const:`ERROR`,             |
       
  2076 |                         | :const:`CRITICAL`).                           |
       
  2077 +-------------------------+-----------------------------------------------+
       
  2078 | ``%(levelname)s``       | Text logging level for the message            |
       
  2079 |                         | (``'DEBUG'``, ``'INFO'``, ``'WARNING'``,      |
       
  2080 |                         | ``'ERROR'``, ``'CRITICAL'``).                 |
       
  2081 +-------------------------+-----------------------------------------------+
       
  2082 | ``%(pathname)s``        | Full pathname of the source file where the    |
       
  2083 |                         | logging call was issued (if available).       |
       
  2084 +-------------------------+-----------------------------------------------+
       
  2085 | ``%(filename)s``        | Filename portion of pathname.                 |
       
  2086 +-------------------------+-----------------------------------------------+
       
  2087 | ``%(module)s``          | Module (name portion of filename).            |
       
  2088 +-------------------------+-----------------------------------------------+
       
  2089 | ``%(funcName)s``        | Name of function containing the logging call. |
       
  2090 +-------------------------+-----------------------------------------------+
       
  2091 | ``%(lineno)d``          | Source line number where the logging call was |
       
  2092 |                         | issued (if available).                        |
       
  2093 +-------------------------+-----------------------------------------------+
       
  2094 | ``%(created)f``         | Time when the :class:`LogRecord` was created  |
       
  2095 |                         | (as returned by :func:`time.time`).           |
       
  2096 +-------------------------+-----------------------------------------------+
       
  2097 | ``%(relativeCreated)d`` | Time in milliseconds when the LogRecord was   |
       
  2098 |                         | created, relative to the time the logging     |
       
  2099 |                         | module was loaded.                            |
       
  2100 +-------------------------+-----------------------------------------------+
       
  2101 | ``%(asctime)s``         | Human-readable time when the                  |
       
  2102 |                         | :class:`LogRecord` was created.  By default   |
       
  2103 |                         | this is of the form "2003-07-08 16:49:45,896" |
       
  2104 |                         | (the numbers after the comma are millisecond  |
       
  2105 |                         | portion of the time).                         |
       
  2106 +-------------------------+-----------------------------------------------+
       
  2107 | ``%(msecs)d``           | Millisecond portion of the time when the      |
       
  2108 |                         | :class:`LogRecord` was created.               |
       
  2109 +-------------------------+-----------------------------------------------+
       
  2110 | ``%(thread)d``          | Thread ID (if available).                     |
       
  2111 +-------------------------+-----------------------------------------------+
       
  2112 | ``%(threadName)s``      | Thread name (if available).                   |
       
  2113 +-------------------------+-----------------------------------------------+
       
  2114 | ``%(process)d``         | Process ID (if available).                    |
       
  2115 +-------------------------+-----------------------------------------------+
       
  2116 | ``%(message)s``         | The logged message, computed as ``msg %       |
       
  2117 |                         | args``.                                       |
       
  2118 +-------------------------+-----------------------------------------------+
       
  2119 
       
  2120 .. versionchanged:: 2.5
       
  2121    *funcName* was added.
       
  2122 
       
  2123 
       
  2124 .. class:: Formatter([fmt[, datefmt]])
       
  2125 
       
  2126    Returns a new instance of the :class:`Formatter` class. The instance is
       
  2127    initialized with a format string for the message as a whole, as well as a format
       
  2128    string for the date/time portion of a message. If no *fmt* is specified,
       
  2129    ``'%(message)s'`` is used. If no *datefmt* is specified, the ISO8601 date format
       
  2130    is used.
       
  2131 
       
  2132 
       
  2133    .. method:: format(record)
       
  2134 
       
  2135       The record's attribute dictionary is used as the operand to a string
       
  2136       formatting operation. Returns the resulting string. Before formatting the
       
  2137       dictionary, a couple of preparatory steps are carried out. The *message*
       
  2138       attribute of the record is computed using *msg* % *args*. If the
       
  2139       formatting string contains ``'(asctime)'``, :meth:`formatTime` is called
       
  2140       to format the event time. If there is exception information, it is
       
  2141       formatted using :meth:`formatException` and appended to the message. Note
       
  2142       that the formatted exception information is cached in attribute
       
  2143       *exc_text*. This is useful because the exception information can be
       
  2144       pickled and sent across the wire, but you should be careful if you have
       
  2145       more than one :class:`Formatter` subclass which customizes the formatting
       
  2146       of exception information. In this case, you will have to clear the cached
       
  2147       value after a formatter has done its formatting, so that the next
       
  2148       formatter to handle the event doesn't use the cached value but
       
  2149       recalculates it afresh.
       
  2150 
       
  2151 
       
  2152    .. method:: formatTime(record[, datefmt])
       
  2153 
       
  2154       This method should be called from :meth:`format` by a formatter which
       
  2155       wants to make use of a formatted time. This method can be overridden in
       
  2156       formatters to provide for any specific requirement, but the basic behavior
       
  2157       is as follows: if *datefmt* (a string) is specified, it is used with
       
  2158       :func:`time.strftime` to format the creation time of the
       
  2159       record. Otherwise, the ISO8601 format is used.  The resulting string is
       
  2160       returned.
       
  2161 
       
  2162 
       
  2163    .. method:: formatException(exc_info)
       
  2164 
       
  2165       Formats the specified exception information (a standard exception tuple as
       
  2166       returned by :func:`sys.exc_info`) as a string. This default implementation
       
  2167       just uses :func:`traceback.print_exception`. The resulting string is
       
  2168       returned.
       
  2169 
       
  2170 
       
  2171 Filter Objects
       
  2172 --------------
       
  2173 
       
  2174 :class:`Filter`\ s can be used by :class:`Handler`\ s and :class:`Logger`\ s for
       
  2175 more sophisticated filtering than is provided by levels. The base filter class
       
  2176 only allows events which are below a certain point in the logger hierarchy. For
       
  2177 example, a filter initialized with "A.B" will allow events logged by loggers
       
  2178 "A.B", "A.B.C", "A.B.C.D", "A.B.D" etc. but not "A.BB", "B.A.B" etc. If
       
  2179 initialized with the empty string, all events are passed.
       
  2180 
       
  2181 
       
  2182 .. class:: Filter([name])
       
  2183 
       
  2184    Returns an instance of the :class:`Filter` class. If *name* is specified, it
       
  2185    names a logger which, together with its children, will have its events allowed
       
  2186    through the filter. If no name is specified, allows every event.
       
  2187 
       
  2188 
       
  2189    .. method:: filter(record)
       
  2190 
       
  2191       Is the specified record to be logged? Returns zero for no, nonzero for
       
  2192       yes. If deemed appropriate, the record may be modified in-place by this
       
  2193       method.
       
  2194 
       
  2195 
       
  2196 LogRecord Objects
       
  2197 -----------------
       
  2198 
       
  2199 :class:`LogRecord` instances are created every time something is logged. They
       
  2200 contain all the information pertinent to the event being logged. The main
       
  2201 information passed in is in msg and args, which are combined using msg % args to
       
  2202 create the message field of the record. The record also includes information
       
  2203 such as when the record was created, the source line where the logging call was
       
  2204 made, and any exception information to be logged.
       
  2205 
       
  2206 
       
  2207 .. class:: LogRecord(name, lvl, pathname, lineno, msg, args, exc_info [, func])
       
  2208 
       
  2209    Returns an instance of :class:`LogRecord` initialized with interesting
       
  2210    information. The *name* is the logger name; *lvl* is the numeric level;
       
  2211    *pathname* is the absolute pathname of the source file in which the logging
       
  2212    call was made; *lineno* is the line number in that file where the logging
       
  2213    call is found; *msg* is the user-supplied message (a format string); *args*
       
  2214    is the tuple which, together with *msg*, makes up the user message; and
       
  2215    *exc_info* is the exception tuple obtained by calling :func:`sys.exc_info`
       
  2216    (or :const:`None`, if no exception information is available). The *func* is
       
  2217    the name of the function from which the logging call was made. If not
       
  2218    specified, it defaults to ``None``.
       
  2219 
       
  2220    .. versionchanged:: 2.5
       
  2221       *func* was added.
       
  2222 
       
  2223 
       
  2224    .. method:: getMessage()
       
  2225 
       
  2226       Returns the message for this :class:`LogRecord` instance after merging any
       
  2227       user-supplied arguments with the message.
       
  2228 
       
  2229 
       
  2230 LoggerAdapter Objects
       
  2231 ---------------------
       
  2232 
       
  2233 .. versionadded:: 2.6
       
  2234 
       
  2235 :class:`LoggerAdapter` instances are used to conveniently pass contextual
       
  2236 information into logging calls. For a usage example , see the section on
       
  2237 `adding contextual information to your logging output`__.
       
  2238 
       
  2239 __ context-info_
       
  2240 
       
  2241 .. class:: LoggerAdapter(logger, extra)
       
  2242 
       
  2243   Returns an instance of :class:`LoggerAdapter` initialized with an
       
  2244   underlying :class:`Logger` instance and a dict-like object.
       
  2245 
       
  2246   .. method:: process(msg, kwargs)
       
  2247 
       
  2248     Modifies the message and/or keyword arguments passed to a logging call in
       
  2249     order to insert contextual information. This implementation takes the object
       
  2250     passed as *extra* to the constructor and adds it to *kwargs* using key
       
  2251     'extra'. The return value is a (*msg*, *kwargs*) tuple which has the
       
  2252     (possibly modified) versions of the arguments passed in.
       
  2253 
       
  2254 In addition to the above, :class:`LoggerAdapter` supports all the logging
       
  2255 methods of :class:`Logger`, i.e. :meth:`debug`, :meth:`info`, :meth:`warning`,
       
  2256 :meth:`error`, :meth:`exception`, :meth:`critical` and :meth:`log`. These
       
  2257 methods have the same signatures as their counterparts in :class:`Logger`, so
       
  2258 you can use the two types of instances interchangeably.
       
  2259 
       
  2260 
       
  2261 Thread Safety
       
  2262 -------------
       
  2263 
       
  2264 The logging module is intended to be thread-safe without any special work
       
  2265 needing to be done by its clients. It achieves this though using threading
       
  2266 locks; there is one lock to serialize access to the module's shared data, and
       
  2267 each handler also creates a lock to serialize access to its underlying I/O.
       
  2268 
       
  2269 
       
  2270 Configuration
       
  2271 -------------
       
  2272 
       
  2273 
       
  2274 .. _logging-config-api:
       
  2275 
       
  2276 Configuration functions
       
  2277 ^^^^^^^^^^^^^^^^^^^^^^^
       
  2278 
       
  2279 The following functions configure the logging module. They are located in the
       
  2280 :mod:`logging.config` module.  Their use is optional --- you can configure the
       
  2281 logging module using these functions or by making calls to the main API (defined
       
  2282 in :mod:`logging` itself) and defining handlers which are declared either in
       
  2283 :mod:`logging` or :mod:`logging.handlers`.
       
  2284 
       
  2285 
       
  2286 .. function:: fileConfig(fname[, defaults])
       
  2287 
       
  2288    Reads the logging configuration from a ConfigParser-format file named *fname*.
       
  2289    This function can be called several times from an application, allowing an end
       
  2290    user the ability to select from various pre-canned configurations (if the
       
  2291    developer provides a mechanism to present the choices and load the chosen
       
  2292    configuration). Defaults to be passed to ConfigParser can be specified in the
       
  2293    *defaults* argument.
       
  2294 
       
  2295 
       
  2296 .. function:: listen([port])
       
  2297 
       
  2298    Starts up a socket server on the specified port, and listens for new
       
  2299    configurations. If no port is specified, the module's default
       
  2300    :const:`DEFAULT_LOGGING_CONFIG_PORT` is used. Logging configurations will be
       
  2301    sent as a file suitable for processing by :func:`fileConfig`. Returns a
       
  2302    :class:`Thread` instance on which you can call :meth:`start` to start the
       
  2303    server, and which you can :meth:`join` when appropriate. To stop the server,
       
  2304    call :func:`stopListening`.
       
  2305 
       
  2306    To send a configuration to the socket, read in the configuration file and
       
  2307    send it to the socket as a string of bytes preceded by a four-byte length
       
  2308    string packed in binary using ``struct.pack('>L', n)``.
       
  2309 
       
  2310 
       
  2311 .. function:: stopListening()
       
  2312 
       
  2313    Stops the listening server which was created with a call to :func:`listen`.
       
  2314    This is typically called before calling :meth:`join` on the return value from
       
  2315    :func:`listen`.
       
  2316 
       
  2317 
       
  2318 .. _logging-config-fileformat:
       
  2319 
       
  2320 Configuration file format
       
  2321 ^^^^^^^^^^^^^^^^^^^^^^^^^
       
  2322 
       
  2323 The configuration file format understood by :func:`fileConfig` is based on
       
  2324 ConfigParser functionality. The file must contain sections called ``[loggers]``,
       
  2325 ``[handlers]`` and ``[formatters]`` which identify by name the entities of each
       
  2326 type which are defined in the file. For each such entity, there is a separate
       
  2327 section which identified how that entity is configured. Thus, for a logger named
       
  2328 ``log01`` in the ``[loggers]`` section, the relevant configuration details are
       
  2329 held in a section ``[logger_log01]``. Similarly, a handler called ``hand01`` in
       
  2330 the ``[handlers]`` section will have its configuration held in a section called
       
  2331 ``[handler_hand01]``, while a formatter called ``form01`` in the
       
  2332 ``[formatters]`` section will have its configuration specified in a section
       
  2333 called ``[formatter_form01]``. The root logger configuration must be specified
       
  2334 in a section called ``[logger_root]``.
       
  2335 
       
  2336 Examples of these sections in the file are given below. ::
       
  2337 
       
  2338    [loggers]
       
  2339    keys=root,log02,log03,log04,log05,log06,log07
       
  2340 
       
  2341    [handlers]
       
  2342    keys=hand01,hand02,hand03,hand04,hand05,hand06,hand07,hand08,hand09
       
  2343 
       
  2344    [formatters]
       
  2345    keys=form01,form02,form03,form04,form05,form06,form07,form08,form09
       
  2346 
       
  2347 The root logger must specify a level and a list of handlers. An example of a
       
  2348 root logger section is given below. ::
       
  2349 
       
  2350    [logger_root]
       
  2351    level=NOTSET
       
  2352    handlers=hand01
       
  2353 
       
  2354 The ``level`` entry can be one of ``DEBUG, INFO, WARNING, ERROR, CRITICAL`` or
       
  2355 ``NOTSET``. For the root logger only, ``NOTSET`` means that all messages will be
       
  2356 logged. Level values are :func:`eval`\ uated in the context of the ``logging``
       
  2357 package's namespace.
       
  2358 
       
  2359 The ``handlers`` entry is a comma-separated list of handler names, which must
       
  2360 appear in the ``[handlers]`` section. These names must appear in the
       
  2361 ``[handlers]`` section and have corresponding sections in the configuration
       
  2362 file.
       
  2363 
       
  2364 For loggers other than the root logger, some additional information is required.
       
  2365 This is illustrated by the following example. ::
       
  2366 
       
  2367    [logger_parser]
       
  2368    level=DEBUG
       
  2369    handlers=hand01
       
  2370    propagate=1
       
  2371    qualname=compiler.parser
       
  2372 
       
  2373 The ``level`` and ``handlers`` entries are interpreted as for the root logger,
       
  2374 except that if a non-root logger's level is specified as ``NOTSET``, the system
       
  2375 consults loggers higher up the hierarchy to determine the effective level of the
       
  2376 logger. The ``propagate`` entry is set to 1 to indicate that messages must
       
  2377 propagate to handlers higher up the logger hierarchy from this logger, or 0 to
       
  2378 indicate that messages are **not** propagated to handlers up the hierarchy. The
       
  2379 ``qualname`` entry is the hierarchical channel name of the logger, that is to
       
  2380 say the name used by the application to get the logger.
       
  2381 
       
  2382 Sections which specify handler configuration are exemplified by the following.
       
  2383 ::
       
  2384 
       
  2385    [handler_hand01]
       
  2386    class=StreamHandler
       
  2387    level=NOTSET
       
  2388    formatter=form01
       
  2389    args=(sys.stdout,)
       
  2390 
       
  2391 The ``class`` entry indicates the handler's class (as determined by :func:`eval`
       
  2392 in the ``logging`` package's namespace). The ``level`` is interpreted as for
       
  2393 loggers, and ``NOTSET`` is taken to mean "log everything".
       
  2394 
       
  2395 .. versionchanged:: 2.6
       
  2396   Added support for resolving the handler's class as a dotted module and class
       
  2397   name.
       
  2398 
       
  2399 The ``formatter`` entry indicates the key name of the formatter for this
       
  2400 handler. If blank, a default formatter (``logging._defaultFormatter``) is used.
       
  2401 If a name is specified, it must appear in the ``[formatters]`` section and have
       
  2402 a corresponding section in the configuration file.
       
  2403 
       
  2404 The ``args`` entry, when :func:`eval`\ uated in the context of the ``logging``
       
  2405 package's namespace, is the list of arguments to the constructor for the handler
       
  2406 class. Refer to the constructors for the relevant handlers, or to the examples
       
  2407 below, to see how typical entries are constructed. ::
       
  2408 
       
  2409    [handler_hand02]
       
  2410    class=FileHandler
       
  2411    level=DEBUG
       
  2412    formatter=form02
       
  2413    args=('python.log', 'w')
       
  2414 
       
  2415    [handler_hand03]
       
  2416    class=handlers.SocketHandler
       
  2417    level=INFO
       
  2418    formatter=form03
       
  2419    args=('localhost', handlers.DEFAULT_TCP_LOGGING_PORT)
       
  2420 
       
  2421    [handler_hand04]
       
  2422    class=handlers.DatagramHandler
       
  2423    level=WARN
       
  2424    formatter=form04
       
  2425    args=('localhost', handlers.DEFAULT_UDP_LOGGING_PORT)
       
  2426 
       
  2427    [handler_hand05]
       
  2428    class=handlers.SysLogHandler
       
  2429    level=ERROR
       
  2430    formatter=form05
       
  2431    args=(('localhost', handlers.SYSLOG_UDP_PORT), handlers.SysLogHandler.LOG_USER)
       
  2432 
       
  2433    [handler_hand06]
       
  2434    class=handlers.NTEventLogHandler
       
  2435    level=CRITICAL
       
  2436    formatter=form06
       
  2437    args=('Python Application', '', 'Application')
       
  2438 
       
  2439    [handler_hand07]
       
  2440    class=handlers.SMTPHandler
       
  2441    level=WARN
       
  2442    formatter=form07
       
  2443    args=('localhost', 'from@abc', ['user1@abc', 'user2@xyz'], 'Logger Subject')
       
  2444 
       
  2445    [handler_hand08]
       
  2446    class=handlers.MemoryHandler
       
  2447    level=NOTSET
       
  2448    formatter=form08
       
  2449    target=
       
  2450    args=(10, ERROR)
       
  2451 
       
  2452    [handler_hand09]
       
  2453    class=handlers.HTTPHandler
       
  2454    level=NOTSET
       
  2455    formatter=form09
       
  2456    args=('localhost:9022', '/log', 'GET')
       
  2457 
       
  2458 Sections which specify formatter configuration are typified by the following. ::
       
  2459 
       
  2460    [formatter_form01]
       
  2461    format=F1 %(asctime)s %(levelname)s %(message)s
       
  2462    datefmt=
       
  2463    class=logging.Formatter
       
  2464 
       
  2465 The ``format`` entry is the overall format string, and the ``datefmt`` entry is
       
  2466 the :func:`strftime`\ -compatible date/time format string.  If empty, the
       
  2467 package substitutes ISO8601 format date/times, which is almost equivalent to
       
  2468 specifying the date format string ``"%Y-%m-%d %H:%M:%S"``.  The ISO8601 format
       
  2469 also specifies milliseconds, which are appended to the result of using the above
       
  2470 format string, with a comma separator.  An example time in ISO8601 format is
       
  2471 ``2003-01-23 00:29:50,411``.
       
  2472 
       
  2473 The ``class`` entry is optional.  It indicates the name of the formatter's class
       
  2474 (as a dotted module and class name.)  This option is useful for instantiating a
       
  2475 :class:`Formatter` subclass.  Subclasses of :class:`Formatter` can present
       
  2476 exception tracebacks in an expanded or condensed format.
       
  2477 
       
  2478 
       
  2479 Configuration server example
       
  2480 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
       
  2481 
       
  2482 Here is an example of a module using the logging configuration server::
       
  2483 
       
  2484     import logging
       
  2485     import logging.config
       
  2486     import time
       
  2487     import os
       
  2488 
       
  2489     # read initial config file
       
  2490     logging.config.fileConfig("logging.conf")
       
  2491 
       
  2492     # create and start listener on port 9999
       
  2493     t = logging.config.listen(9999)
       
  2494     t.start()
       
  2495 
       
  2496     logger = logging.getLogger("simpleExample")
       
  2497 
       
  2498     try:
       
  2499         # loop through logging calls to see the difference
       
  2500         # new configurations make, until Ctrl+C is pressed
       
  2501         while True:
       
  2502             logger.debug("debug message")
       
  2503             logger.info("info message")
       
  2504             logger.warn("warn message")
       
  2505             logger.error("error message")
       
  2506             logger.critical("critical message")
       
  2507             time.sleep(5)
       
  2508     except KeyboardInterrupt:
       
  2509         # cleanup
       
  2510         logging.config.stopListening()
       
  2511         t.join()
       
  2512 
       
  2513 And here is a script that takes a filename and sends that file to the server,
       
  2514 properly preceded with the binary-encoded length, as the new logging
       
  2515 configuration::
       
  2516 
       
  2517     #!/usr/bin/env python
       
  2518     import socket, sys, struct
       
  2519 
       
  2520     data_to_send = open(sys.argv[1], "r").read()
       
  2521 
       
  2522     HOST = 'localhost'
       
  2523     PORT = 9999
       
  2524     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
       
  2525     print "connecting..."
       
  2526     s.connect((HOST, PORT))
       
  2527     print "sending config..."
       
  2528     s.send(struct.pack(">L", len(data_to_send)))
       
  2529     s.send(data_to_send)
       
  2530     s.close()
       
  2531     print "complete"
       
  2532 
       
  2533 
       
  2534 More examples
       
  2535 -------------
       
  2536 
       
  2537 Multiple handlers and formatters
       
  2538 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
       
  2539 
       
  2540 Loggers are plain Python objects.  The :func:`addHandler` method has no minimum
       
  2541 or maximum quota for the number of handlers you may add.  Sometimes it will be
       
  2542 beneficial for an application to log all messages of all severities to a text
       
  2543 file while simultaneously logging errors or above to the console.  To set this
       
  2544 up, simply configure the appropriate handlers.  The logging calls in the
       
  2545 application code will remain unchanged.  Here is a slight modification to the
       
  2546 previous simple module-based configuration example::
       
  2547 
       
  2548     import logging
       
  2549 
       
  2550     logger = logging.getLogger("simple_example")
       
  2551     logger.setLevel(logging.DEBUG)
       
  2552     # create file handler which logs even debug messages
       
  2553     fh = logging.FileHandler("spam.log")
       
  2554     fh.setLevel(logging.DEBUG)
       
  2555     # create console handler with a higher log level
       
  2556     ch = logging.StreamHandler()
       
  2557     ch.setLevel(logging.ERROR)
       
  2558     # create formatter and add it to the handlers
       
  2559     formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
       
  2560     ch.setFormatter(formatter)
       
  2561     fh.setFormatter(formatter)
       
  2562     # add the handlers to logger
       
  2563     logger.addHandler(ch)
       
  2564     logger.addHandler(fh)
       
  2565 
       
  2566     # "application" code
       
  2567     logger.debug("debug message")
       
  2568     logger.info("info message")
       
  2569     logger.warn("warn message")
       
  2570     logger.error("error message")
       
  2571     logger.critical("critical message")
       
  2572 
       
  2573 Notice that the "application" code does not care about multiple handlers.  All
       
  2574 that changed was the addition and configuration of a new handler named *fh*.
       
  2575 
       
  2576 The ability to create new handlers with higher- or lower-severity filters can be
       
  2577 very helpful when writing and testing an application.  Instead of using many
       
  2578 ``print`` statements for debugging, use ``logger.debug``: Unlike the print
       
  2579 statements, which you will have to delete or comment out later, the logger.debug
       
  2580 statements can remain intact in the source code and remain dormant until you
       
  2581 need them again.  At that time, the only change that needs to happen is to
       
  2582 modify the severity level of the logger and/or handler to debug.
       
  2583 
       
  2584 
       
  2585 Using logging in multiple modules
       
  2586 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
       
  2587 
       
  2588 It was mentioned above that multiple calls to
       
  2589 ``logging.getLogger('someLogger')`` return a reference to the same logger
       
  2590 object.  This is true not only within the same module, but also across modules
       
  2591 as long as it is in the same Python interpreter process.  It is true for
       
  2592 references to the same object; additionally, application code can define and
       
  2593 configure a parent logger in one module and create (but not configure) a child
       
  2594 logger in a separate module, and all logger calls to the child will pass up to
       
  2595 the parent.  Here is a main module::
       
  2596 
       
  2597     import logging
       
  2598     import auxiliary_module
       
  2599 
       
  2600     # create logger with "spam_application"
       
  2601     logger = logging.getLogger("spam_application")
       
  2602     logger.setLevel(logging.DEBUG)
       
  2603     # create file handler which logs even debug messages
       
  2604     fh = logging.FileHandler("spam.log")
       
  2605     fh.setLevel(logging.DEBUG)
       
  2606     # create console handler with a higher log level
       
  2607     ch = logging.StreamHandler()
       
  2608     ch.setLevel(logging.ERROR)
       
  2609     # create formatter and add it to the handlers
       
  2610     formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
       
  2611     fh.setFormatter(formatter)
       
  2612     ch.setFormatter(formatter)
       
  2613     # add the handlers to the logger
       
  2614     logger.addHandler(fh)
       
  2615     logger.addHandler(ch)
       
  2616 
       
  2617     logger.info("creating an instance of auxiliary_module.Auxiliary")
       
  2618     a = auxiliary_module.Auxiliary()
       
  2619     logger.info("created an instance of auxiliary_module.Auxiliary")
       
  2620     logger.info("calling auxiliary_module.Auxiliary.do_something")
       
  2621     a.do_something()
       
  2622     logger.info("finished auxiliary_module.Auxiliary.do_something")
       
  2623     logger.info("calling auxiliary_module.some_function()")
       
  2624     auxiliary_module.some_function()
       
  2625     logger.info("done with auxiliary_module.some_function()")
       
  2626 
       
  2627 Here is the auxiliary module::
       
  2628 
       
  2629     import logging
       
  2630 
       
  2631     # create logger
       
  2632     module_logger = logging.getLogger("spam_application.auxiliary")
       
  2633 
       
  2634     class Auxiliary:
       
  2635         def __init__(self):
       
  2636             self.logger = logging.getLogger("spam_application.auxiliary.Auxiliary")
       
  2637             self.logger.info("creating an instance of Auxiliary")
       
  2638         def do_something(self):
       
  2639             self.logger.info("doing something")
       
  2640             a = 1 + 1
       
  2641             self.logger.info("done doing something")
       
  2642 
       
  2643     def some_function():
       
  2644         module_logger.info("received a call to \"some_function\"")
       
  2645 
       
  2646 The output looks like this::
       
  2647 
       
  2648     2005-03-23 23:47:11,663 - spam_application - INFO -
       
  2649        creating an instance of auxiliary_module.Auxiliary
       
  2650     2005-03-23 23:47:11,665 - spam_application.auxiliary.Auxiliary - INFO -
       
  2651        creating an instance of Auxiliary
       
  2652     2005-03-23 23:47:11,665 - spam_application - INFO -
       
  2653        created an instance of auxiliary_module.Auxiliary
       
  2654     2005-03-23 23:47:11,668 - spam_application - INFO -
       
  2655        calling auxiliary_module.Auxiliary.do_something
       
  2656     2005-03-23 23:47:11,668 - spam_application.auxiliary.Auxiliary - INFO -
       
  2657        doing something
       
  2658     2005-03-23 23:47:11,669 - spam_application.auxiliary.Auxiliary - INFO -
       
  2659        done doing something
       
  2660     2005-03-23 23:47:11,670 - spam_application - INFO -
       
  2661        finished auxiliary_module.Auxiliary.do_something
       
  2662     2005-03-23 23:47:11,671 - spam_application - INFO -
       
  2663        calling auxiliary_module.some_function()
       
  2664     2005-03-23 23:47:11,672 - spam_application.auxiliary - INFO -
       
  2665        received a call to "some_function"
       
  2666     2005-03-23 23:47:11,673 - spam_application - INFO -
       
  2667        done with auxiliary_module.some_function()
       
  2668