blob: ee1bc844155ae7443a253567e856d69fce9e4ab5 [file] [log] [blame]
Georg Brandl8ec7f652007-08-15 14:28:01 +00001: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
Georg Brandl8ec7f652007-08-15 14:28:01 +000012.. index:: pair: Errors; logging
13
14.. versionadded:: 2.3
15
16This module defines functions and classes which implement a flexible error
17logging system for applications.
18
19Logging is performed by calling methods on instances of the :class:`Logger`
20class (hereafter called :dfn:`loggers`). Each instance has a name, and they are
Georg Brandla7395032007-10-21 12:15:05 +000021conceptually arranged in a namespace hierarchy using dots (periods) as
Georg Brandl8ec7f652007-08-15 14:28:01 +000022separators. 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,
24and indicate the area of an application in which a logged message originates.
25
26Logged messages also have levels of importance associated with them. The default
27levels provided are :const:`DEBUG`, :const:`INFO`, :const:`WARNING`,
28:const:`ERROR` and :const:`CRITICAL`. As a convenience, you indicate the
29importance 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
32constrained 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
Georg Brandlc37f2882007-12-04 17:46:27 +000035
36Logging tutorial
37----------------
38
39The key benefit of having the logging API provided by a standard library module
40is that all Python modules can participate in logging, so your application log
41can include messages from third-party modules.
42
43It is, of course, possible to log messages with different verbosity levels or to
44different destinations. Support for writing log messages to files, HTTP
45GET/POST locations, email via SMTP, generic sockets, or OS-specific logging
Georg Brandl907a7202008-02-22 12:31:45 +000046mechanisms are all supported by the standard module. You can also create your
Georg Brandlc37f2882007-12-04 17:46:27 +000047own log destination class if you have special requirements not met by any of the
48built-in classes.
49
50Simple examples
51^^^^^^^^^^^^^^^
52
53.. sectionauthor:: Doug Hellmann
54.. (see <http://blog.doughellmann.com/2007/05/pymotw-logging.html>)
55
56Most applications are probably going to want to log to a file, so let's start
57with that case. Using the :func:`basicConfig` function, we can set up the
Vinay Sajip9a26aab2010-06-03 22:34:42 +000058default handler so that debug messages are written to a file (in the example,
59we assume that you have the appropriate permissions to create a file called
Vinay Sajip998cc242010-06-04 13:41:02 +000060*example.log* in the current directory)::
Georg Brandlc37f2882007-12-04 17:46:27 +000061
62 import logging
Vinay Sajip9a26aab2010-06-03 22:34:42 +000063 LOG_FILENAME = 'example.log'
Vinay Sajipf778bec2009-09-22 17:23:41 +000064 logging.basicConfig(filename=LOG_FILENAME,level=logging.DEBUG)
Georg Brandlc37f2882007-12-04 17:46:27 +000065
66 logging.debug('This message should go to the log file')
67
68And now if we open the file and look at what we have, we should find the log
69message::
70
71 DEBUG:root:This message should go to the log file
72
73If you run the script repeatedly, the additional log messages are appended to
Eric Smithe7dbebb2009-06-04 17:58:15 +000074the file. To create a new file each time, you can pass a *filemode* argument to
Georg Brandlc37f2882007-12-04 17:46:27 +000075:func:`basicConfig` with a value of ``'w'``. Rather than managing the file size
76yourself, though, it is simpler to use a :class:`RotatingFileHandler`::
77
78 import glob
79 import logging
80 import logging.handlers
81
Vinay Sajip998cc242010-06-04 13:41:02 +000082 LOG_FILENAME = 'logging_rotatingfile_example.out'
Georg Brandlc37f2882007-12-04 17:46:27 +000083
84 # Set up a specific logger with our desired output level
85 my_logger = logging.getLogger('MyLogger')
86 my_logger.setLevel(logging.DEBUG)
87
88 # Add the log message handler to the logger
89 handler = logging.handlers.RotatingFileHandler(
90 LOG_FILENAME, maxBytes=20, backupCount=5)
91
92 my_logger.addHandler(handler)
93
94 # Log some messages
95 for i in range(20):
96 my_logger.debug('i = %d' % i)
97
98 # See what files are created
99 logfiles = glob.glob('%s*' % LOG_FILENAME)
100
101 for filename in logfiles:
102 print filename
103
104The result should be 6 separate files, each with part of the log history for the
105application::
106
Vinay Sajip998cc242010-06-04 13:41:02 +0000107 logging_rotatingfile_example.out
108 logging_rotatingfile_example.out.1
109 logging_rotatingfile_example.out.2
110 logging_rotatingfile_example.out.3
111 logging_rotatingfile_example.out.4
112 logging_rotatingfile_example.out.5
Georg Brandlc37f2882007-12-04 17:46:27 +0000113
Vinay Sajip998cc242010-06-04 13:41:02 +0000114The most current file is always :file:`logging_rotatingfile_example.out`,
Georg Brandlc37f2882007-12-04 17:46:27 +0000115and each time it reaches the size limit it is renamed with the suffix
116``.1``. Each of the existing backup files is renamed to increment the suffix
Eric Smithe7dbebb2009-06-04 17:58:15 +0000117(``.1`` becomes ``.2``, etc.) and the ``.6`` file is erased.
Georg Brandlc37f2882007-12-04 17:46:27 +0000118
119Obviously this example sets the log length much much too small as an extreme
120example. You would want to set *maxBytes* to an appropriate value.
121
122Another useful feature of the logging API is the ability to produce different
123messages at different log levels. This allows you to instrument your code with
124debug messages, for example, but turning the log level down so that those debug
125messages are not written for your production system. The default levels are
Vinay Sajipa7d44002009-10-28 23:28:16 +0000126``NOTSET``, ``DEBUG``, ``INFO``, ``WARNING``, ``ERROR`` and ``CRITICAL``.
Georg Brandlc37f2882007-12-04 17:46:27 +0000127
128The logger, handler, and log message call each specify a level. The log message
129is only emitted if the handler and logger are configured to emit messages of
130that level or lower. For example, if a message is ``CRITICAL``, and the logger
131is set to ``ERROR``, the message is emitted. If a message is a ``WARNING``, and
132the logger is set to produce only ``ERROR``\s, the message is not emitted::
133
134 import logging
135 import sys
136
137 LEVELS = {'debug': logging.DEBUG,
138 'info': logging.INFO,
139 'warning': logging.WARNING,
140 'error': logging.ERROR,
141 'critical': logging.CRITICAL}
142
143 if len(sys.argv) > 1:
144 level_name = sys.argv[1]
145 level = LEVELS.get(level_name, logging.NOTSET)
146 logging.basicConfig(level=level)
147
148 logging.debug('This is a debug message')
149 logging.info('This is an info message')
150 logging.warning('This is a warning message')
151 logging.error('This is an error message')
152 logging.critical('This is a critical error message')
153
154Run the script with an argument like 'debug' or 'warning' to see which messages
155show up at different levels::
156
157 $ python logging_level_example.py debug
158 DEBUG:root:This is a debug message
159 INFO:root:This is an info message
160 WARNING:root:This is a warning message
161 ERROR:root:This is an error message
162 CRITICAL:root:This is a critical error message
163
164 $ python logging_level_example.py info
165 INFO:root:This is an info message
166 WARNING:root:This is a warning message
167 ERROR:root:This is an error message
168 CRITICAL:root:This is a critical error message
169
170You will notice that these log messages all have ``root`` embedded in them. The
171logging module supports a hierarchy of loggers with different names. An easy
172way to tell where a specific log message comes from is to use a separate logger
173object for each of your modules. Each new logger "inherits" the configuration
174of its parent, and log messages sent to a logger include the name of that
175logger. Optionally, each logger can be configured differently, so that messages
176from different modules are handled in different ways. Let's look at a simple
177example of how to log from different modules so it is easy to trace the source
178of the message::
179
180 import logging
181
182 logging.basicConfig(level=logging.WARNING)
183
184 logger1 = logging.getLogger('package1.module1')
185 logger2 = logging.getLogger('package2.module2')
186
187 logger1.warning('This message comes from one module')
188 logger2.warning('And this message comes from another module')
189
190And the output::
191
192 $ python logging_modules_example.py
193 WARNING:package1.module1:This message comes from one module
194 WARNING:package2.module2:And this message comes from another module
195
196There are many more options for configuring logging, including different log
197message formatting options, having messages delivered to multiple destinations,
198and changing the configuration of a long-running application on the fly using a
199socket interface. All of these options are covered in depth in the library
200module documentation.
201
202Loggers
203^^^^^^^
204
205The logging library takes a modular approach and offers the several categories
206of components: loggers, handlers, filters, and formatters. Loggers expose the
207interface that application code directly uses. Handlers send the log records to
208the appropriate destination. Filters provide a finer grained facility for
209determining which log records to send on to a handler. Formatters specify the
210layout of the resultant log record.
211
212:class:`Logger` objects have a threefold job. First, they expose several
213methods to application code so that applications can log messages at runtime.
214Second, logger objects determine which log messages to act upon based upon
215severity (the default filtering facility) or filter objects. Third, logger
216objects pass along relevant log messages to all interested log handlers.
217
218The most widely used methods on logger objects fall into two categories:
219configuration and message sending.
220
221* :meth:`Logger.setLevel` specifies the lowest-severity log message a logger
222 will handle, where debug is the lowest built-in severity level and critical is
223 the highest built-in severity. For example, if the severity level is info,
224 the logger will handle only info, warning, error, and critical messages and
225 will ignore debug messages.
226
227* :meth:`Logger.addFilter` and :meth:`Logger.removeFilter` add and remove filter
228 objects from the logger object. This tutorial does not address filters.
229
230With the logger object configured, the following methods create log messages:
231
232* :meth:`Logger.debug`, :meth:`Logger.info`, :meth:`Logger.warning`,
233 :meth:`Logger.error`, and :meth:`Logger.critical` all create log records with
234 a message and a level that corresponds to their respective method names. The
235 message is actually a format string, which may contain the standard string
236 substitution syntax of :const:`%s`, :const:`%d`, :const:`%f`, and so on. The
237 rest of their arguments is a list of objects that correspond with the
238 substitution fields in the message. With regard to :const:`**kwargs`, the
239 logging methods care only about a keyword of :const:`exc_info` and use it to
240 determine whether to log exception information.
241
242* :meth:`Logger.exception` creates a log message similar to
243 :meth:`Logger.error`. The difference is that :meth:`Logger.exception` dumps a
244 stack trace along with it. Call this method only from an exception handler.
245
246* :meth:`Logger.log` takes a log level as an explicit argument. This is a
247 little more verbose for logging messages than using the log level convenience
248 methods listed above, but this is how to log at custom log levels.
249
Brett Cannon499969a2008-02-25 05:33:07 +0000250:func:`getLogger` returns a reference to a logger instance with the specified
Vinay Sajip80eed3e2010-07-06 15:08:55 +0000251name if it is provided, or ``root`` if not. The names are period-separated
Georg Brandlc37f2882007-12-04 17:46:27 +0000252hierarchical structures. Multiple calls to :func:`getLogger` with the same name
253will return a reference to the same logger object. Loggers that are further
254down in the hierarchical list are children of loggers higher up in the list.
255For example, given a logger with a name of ``foo``, loggers with names of
Vinay Sajipccd8bc82010-04-06 22:32:37 +0000256``foo.bar``, ``foo.bar.baz``, and ``foo.bam`` are all descendants of ``foo``.
257Child loggers propagate messages up to the handlers associated with their
258ancestor loggers. Because of this, it is unnecessary to define and configure
259handlers for all the loggers an application uses. It is sufficient to
260configure handlers for a top-level logger and create child loggers as needed.
Georg Brandlc37f2882007-12-04 17:46:27 +0000261
262
263Handlers
264^^^^^^^^
265
266:class:`Handler` objects are responsible for dispatching the appropriate log
267messages (based on the log messages' severity) to the handler's specified
268destination. Logger objects can add zero or more handler objects to themselves
269with an :func:`addHandler` method. As an example scenario, an application may
270want to send all log messages to a log file, all log messages of error or higher
271to stdout, and all messages of critical to an email address. This scenario
Georg Brandl907a7202008-02-22 12:31:45 +0000272requires three individual handlers where each handler is responsible for sending
Georg Brandlc37f2882007-12-04 17:46:27 +0000273messages of a specific severity to a specific location.
274
275The standard library includes quite a few handler types; this tutorial uses only
276:class:`StreamHandler` and :class:`FileHandler` in its examples.
277
278There are very few methods in a handler for application developers to concern
279themselves with. The only handler methods that seem relevant for application
280developers who are using the built-in handler objects (that is, not creating
281custom handlers) are the following configuration methods:
282
283* The :meth:`Handler.setLevel` method, just as in logger objects, specifies the
284 lowest severity that will be dispatched to the appropriate destination. Why
285 are there two :func:`setLevel` methods? The level set in the logger
286 determines which severity of messages it will pass to its handlers. The level
287 set in each handler determines which messages that handler will send on.
Vinay Sajipccd8bc82010-04-06 22:32:37 +0000288
289* :func:`setFormatter` selects a Formatter object for this handler to use.
Georg Brandlc37f2882007-12-04 17:46:27 +0000290
291* :func:`addFilter` and :func:`removeFilter` respectively configure and
292 deconfigure filter objects on handlers.
293
Vinay Sajipccd8bc82010-04-06 22:32:37 +0000294Application code should not directly instantiate and use instances of
295:class:`Handler`. Instead, the :class:`Handler` class is a base class that
Vinay Sajip497256b2010-04-07 09:40:52 +0000296defines the interface that all handlers should have and establishes some
Vinay Sajipccd8bc82010-04-06 22:32:37 +0000297default behavior that child classes can use (or override).
Georg Brandlc37f2882007-12-04 17:46:27 +0000298
299
300Formatters
301^^^^^^^^^^
302
303Formatter objects configure the final order, structure, and contents of the log
Brett Cannon499969a2008-02-25 05:33:07 +0000304message. Unlike the base :class:`logging.Handler` class, application code may
Georg Brandlc37f2882007-12-04 17:46:27 +0000305instantiate formatter classes, although you could likely subclass the formatter
306if your application needs special behavior. The constructor takes two optional
307arguments: a message format string and a date format string. If there is no
308message format string, the default is to use the raw message. If there is no
309date format string, the default date format is::
310
311 %Y-%m-%d %H:%M:%S
312
313with the milliseconds tacked on at the end.
314
315The message format string uses ``%(<dictionary key>)s`` styled string
Vinay Sajip4b782332009-01-19 06:49:19 +0000316substitution; the possible keys are documented in :ref:`formatter`.
Georg Brandlc37f2882007-12-04 17:46:27 +0000317
318The following message format string will log the time in a human-readable
319format, the severity of the message, and the contents of the message, in that
320order::
321
322 "%(asctime)s - %(levelname)s - %(message)s"
323
Vinay Sajip8d8e6152010-08-30 18:10:03 +0000324Formatters use a user-configurable function to convert the creation time of a
325record to a tuple. By default, :func:`time.localtime` is used; to change this
326for a particular formatter instance, set the ``converter`` attribute of the
327instance to a function with the same signature as :func:`time.localtime` or
328:func:`time.gmtime`. To change it for all formatters, for example if you want
329all logging times to be shown in GMT, set the ``converter`` attribute in the
330Formatter class (to ``time.gmtime`` for GMT display).
331
Georg Brandlc37f2882007-12-04 17:46:27 +0000332
333Configuring Logging
334^^^^^^^^^^^^^^^^^^^
335
Andrew M. Kuchlingf09bc662010-05-12 18:56:48 +0000336Programmers can configure logging in three ways:
337
3381. Creating loggers, handlers, and formatters explicitly using Python
339 code that calls the configuration methods listed above.
3402. Creating a logging config file and reading it using the :func:`fileConfig`
341 function.
3423. Creating a dictionary of configuration information and passing it
343 to the :func:`dictConfig` function.
344
345The following example configures a very simple logger, a console
Vinay Sajipa38cd522010-05-18 08:16:27 +0000346handler, and a simple formatter using Python code::
Georg Brandlc37f2882007-12-04 17:46:27 +0000347
348 import logging
349
350 # create logger
351 logger = logging.getLogger("simple_example")
352 logger.setLevel(logging.DEBUG)
Andrew M. Kuchlingf09bc662010-05-12 18:56:48 +0000353
Georg Brandlc37f2882007-12-04 17:46:27 +0000354 # create console handler and set level to debug
355 ch = logging.StreamHandler()
356 ch.setLevel(logging.DEBUG)
Andrew M. Kuchlingf09bc662010-05-12 18:56:48 +0000357
Georg Brandlc37f2882007-12-04 17:46:27 +0000358 # create formatter
359 formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
Andrew M. Kuchlingf09bc662010-05-12 18:56:48 +0000360
Georg Brandlc37f2882007-12-04 17:46:27 +0000361 # add formatter to ch
362 ch.setFormatter(formatter)
Andrew M. Kuchlingf09bc662010-05-12 18:56:48 +0000363
Georg Brandlc37f2882007-12-04 17:46:27 +0000364 # add ch to logger
365 logger.addHandler(ch)
366
367 # "application" code
368 logger.debug("debug message")
369 logger.info("info message")
370 logger.warn("warn message")
371 logger.error("error message")
372 logger.critical("critical message")
373
374Running this module from the command line produces the following output::
375
376 $ python simple_logging_module.py
377 2005-03-19 15:10:26,618 - simple_example - DEBUG - debug message
378 2005-03-19 15:10:26,620 - simple_example - INFO - info message
379 2005-03-19 15:10:26,695 - simple_example - WARNING - warn message
380 2005-03-19 15:10:26,697 - simple_example - ERROR - error message
381 2005-03-19 15:10:26,773 - simple_example - CRITICAL - critical message
382
383The following Python module creates a logger, handler, and formatter nearly
384identical to those in the example listed above, with the only difference being
385the names of the objects::
386
387 import logging
388 import logging.config
389
390 logging.config.fileConfig("logging.conf")
391
392 # create logger
393 logger = logging.getLogger("simpleExample")
394
395 # "application" code
396 logger.debug("debug message")
397 logger.info("info message")
398 logger.warn("warn message")
399 logger.error("error message")
400 logger.critical("critical message")
401
402Here is the logging.conf file::
403
404 [loggers]
405 keys=root,simpleExample
406
407 [handlers]
408 keys=consoleHandler
409
410 [formatters]
411 keys=simpleFormatter
412
413 [logger_root]
414 level=DEBUG
415 handlers=consoleHandler
416
417 [logger_simpleExample]
418 level=DEBUG
419 handlers=consoleHandler
420 qualname=simpleExample
421 propagate=0
422
423 [handler_consoleHandler]
424 class=StreamHandler
425 level=DEBUG
426 formatter=simpleFormatter
427 args=(sys.stdout,)
428
429 [formatter_simpleFormatter]
430 format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
431 datefmt=
432
433The output is nearly identical to that of the non-config-file-based example::
434
435 $ python simple_logging_config.py
436 2005-03-19 15:38:55,977 - simpleExample - DEBUG - debug message
437 2005-03-19 15:38:55,979 - simpleExample - INFO - info message
438 2005-03-19 15:38:56,054 - simpleExample - WARNING - warn message
439 2005-03-19 15:38:56,055 - simpleExample - ERROR - error message
440 2005-03-19 15:38:56,130 - simpleExample - CRITICAL - critical message
441
442You can see that the config file approach has a few advantages over the Python
443code approach, mainly separation of configuration and code and the ability of
444noncoders to easily modify the logging properties.
445
Vinay Sajip0e6e97d2010-02-04 20:23:45 +0000446Note that the class names referenced in config files need to be either relative
447to the logging module, or absolute values which can be resolved using normal
Georg Brandlf6d367452010-03-12 10:02:03 +0000448import mechanisms. Thus, you could use either :class:`handlers.WatchedFileHandler`
449(relative to the logging module) or :class:`mypackage.mymodule.MyHandler` (for a
450class defined in package :mod:`mypackage` and module :mod:`mymodule`, where
451:mod:`mypackage` is available on the Python import path).
Vinay Sajip0e6e97d2010-02-04 20:23:45 +0000452
Vinay Sajipc76defc2010-05-21 17:41:34 +0000453.. versionchanged:: 2.7
454
455In Python 2.7, a new means of configuring logging has been introduced, using
456dictionaries to hold configuration information. This provides a superset of the
457functionality of the config-file-based approach outlined above, and is the
458recommended configuration method for new applications and deployments. Because
459a Python dictionary is used to hold configuration information, and since you
460can populate that dictionary using different means, you have more options for
461configuration. For example, you can use a configuration file in JSON format,
462or, if you have access to YAML processing functionality, a file in YAML
463format, to populate the configuration dictionary. Or, of course, you can
464construct the dictionary in Python code, receive it in pickled form over a
465socket, or use whatever approach makes sense for your application.
466
467Here's an example of the same configuration as above, in YAML format for
468the new dictionary-based approach::
469
470 version: 1
471 formatters:
472 simple:
473 format: format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
474 handlers:
475 console:
476 class: logging.StreamHandler
477 level: DEBUG
478 formatter: simple
479 stream: ext://sys.stdout
480 loggers:
481 simpleExample:
482 level: DEBUG
483 handlers: [console]
484 propagate: no
485 root:
486 level: DEBUG
487 handlers: [console]
488
489For more information about logging using a dictionary, see
490:ref:`logging-config-api`.
491
Vinay Sajip99505c82009-01-10 13:38:04 +0000492.. _library-config:
493
Vinay Sajip34bfda52008-09-01 15:08:07 +0000494Configuring Logging for a Library
495^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
496
497When developing a library which uses logging, some consideration needs to be
498given to its configuration. If the using application does not use logging, and
499library code makes logging calls, then a one-off message "No handlers could be
500found for logger X.Y.Z" is printed to the console. This message is intended
501to catch mistakes in logging configuration, but will confuse an application
502developer who is not aware of logging by the library.
503
504In addition to documenting how a library uses logging, a good way to configure
505library logging so that it does not cause a spurious message is to add a
506handler which does nothing. This avoids the message being printed, since a
507handler will be found: it just doesn't produce any output. If the library user
508configures logging for application use, presumably that configuration will add
509some handlers, and if levels are suitably configured then logging calls made
510in library code will send output to those handlers, as normal.
511
512A do-nothing handler can be simply defined as follows::
513
514 import logging
515
516 class NullHandler(logging.Handler):
517 def emit(self, record):
518 pass
519
520An instance of this handler should be added to the top-level logger of the
521logging namespace used by the library. If all logging by a library *foo* is
522done using loggers with names matching "foo.x.y", then the code::
523
524 import logging
525
526 h = NullHandler()
527 logging.getLogger("foo").addHandler(h)
528
529should have the desired effect. If an organisation produces a number of
530libraries, then the logger name specified can be "orgname.foo" rather than
531just "foo".
532
Vinay Sajip213faca2008-12-03 23:22:58 +0000533.. versionadded:: 2.7
534
535The :class:`NullHandler` class was not present in previous versions, but is now
536included, so that it need not be defined in library code.
537
538
Georg Brandlc37f2882007-12-04 17:46:27 +0000539
540Logging Levels
541--------------
542
Georg Brandl8ec7f652007-08-15 14:28:01 +0000543The numeric values of logging levels are given in the following table. These are
544primarily of interest if you want to define your own levels, and need them to
545have specific values relative to the predefined levels. If you define a level
546with the same numeric value, it overwrites the predefined value; the predefined
547name is lost.
548
549+--------------+---------------+
550| Level | Numeric value |
551+==============+===============+
552| ``CRITICAL`` | 50 |
553+--------------+---------------+
554| ``ERROR`` | 40 |
555+--------------+---------------+
556| ``WARNING`` | 30 |
557+--------------+---------------+
558| ``INFO`` | 20 |
559+--------------+---------------+
560| ``DEBUG`` | 10 |
561+--------------+---------------+
562| ``NOTSET`` | 0 |
563+--------------+---------------+
564
565Levels can also be associated with loggers, being set either by the developer or
566through loading a saved logging configuration. When a logging method is called
567on a logger, the logger compares its own level with the level associated with
568the method call. If the logger's level is higher than the method call's, no
569logging message is actually generated. This is the basic mechanism controlling
570the verbosity of logging output.
571
572Logging messages are encoded as instances of the :class:`LogRecord` class. When
573a logger decides to actually log an event, a :class:`LogRecord` instance is
574created from the logging message.
575
576Logging messages are subjected to a dispatch mechanism through the use of
577:dfn:`handlers`, which are instances of subclasses of the :class:`Handler`
578class. Handlers are responsible for ensuring that a logged message (in the form
579of a :class:`LogRecord`) ends up in a particular location (or set of locations)
580which is useful for the target audience for that message (such as end users,
581support desk staff, system administrators, developers). Handlers are passed
582:class:`LogRecord` instances intended for particular destinations. Each logger
583can have zero, one or more handlers associated with it (via the
584:meth:`addHandler` method of :class:`Logger`). In addition to any handlers
585directly associated with a logger, *all handlers associated with all ancestors
Vinay Sajipccd8bc82010-04-06 22:32:37 +0000586of the logger* are called to dispatch the message (unless the *propagate* flag
587for a logger is set to a false value, at which point the passing to ancestor
588handlers stops).
Georg Brandl8ec7f652007-08-15 14:28:01 +0000589
590Just as for loggers, handlers can have levels associated with them. A handler's
591level acts as a filter in the same way as a logger's level does. If a handler
592decides to actually dispatch an event, the :meth:`emit` method is used to send
593the message to its destination. Most user-defined subclasses of :class:`Handler`
594will need to override this :meth:`emit`.
595
Vinay Sajip89e1ae22010-09-17 10:09:04 +0000596.. _custom-levels:
597
598Custom Levels
599^^^^^^^^^^^^^
600
601Defining your own levels is possible, but should not be necessary, as the
602existing levels have been chosen on the basis of practical experience.
603However, if you are convinced that you need custom levels, great care should
604be exercised when doing this, and it is possibly *a very bad idea to define
605custom levels if you are developing a library*. That's because if multiple
606library authors all define their own custom levels, there is a chance that
607the logging output from such multiple libraries used together will be
608difficult for the using developer to control and/or interpret, because a
609given numeric value might mean different things for different libraries.
610
611
Vinay Sajipb5902e62009-01-15 22:48:13 +0000612Useful Handlers
613---------------
614
Georg Brandl8ec7f652007-08-15 14:28:01 +0000615In addition to the base :class:`Handler` class, many useful subclasses are
616provided:
617
Vinay Sajip4b782332009-01-19 06:49:19 +0000618#. :ref:`stream-handler` instances send error messages to streams (file-like
Georg Brandl8ec7f652007-08-15 14:28:01 +0000619 objects).
620
Vinay Sajip4b782332009-01-19 06:49:19 +0000621#. :ref:`file-handler` instances send error messages to disk files.
Vinay Sajipb1a15e42009-01-15 23:04:47 +0000622
Vinay Sajipb5902e62009-01-15 22:48:13 +0000623#. :class:`BaseRotatingHandler` is the base class for handlers that
Vinay Sajip99234c52009-01-12 20:36:18 +0000624 rotate log files at a certain point. It is not meant to be instantiated
Vinay Sajip4b782332009-01-19 06:49:19 +0000625 directly. Instead, use :ref:`rotating-file-handler` or
626 :ref:`timed-rotating-file-handler`.
Vinay Sajipc2211ad2009-01-10 19:22:57 +0000627
Vinay Sajip4b782332009-01-19 06:49:19 +0000628#. :ref:`rotating-file-handler` instances send error messages to disk
Vinay Sajipb5902e62009-01-15 22:48:13 +0000629 files, with support for maximum log file sizes and log file rotation.
Georg Brandl8ec7f652007-08-15 14:28:01 +0000630
Vinay Sajip4b782332009-01-19 06:49:19 +0000631#. :ref:`timed-rotating-file-handler` instances send error messages to
Vinay Sajipb5902e62009-01-15 22:48:13 +0000632 disk files, rotating the log file at certain timed intervals.
Georg Brandl8ec7f652007-08-15 14:28:01 +0000633
Vinay Sajip4b782332009-01-19 06:49:19 +0000634#. :ref:`socket-handler` instances send error messages to TCP/IP
Vinay Sajipb5902e62009-01-15 22:48:13 +0000635 sockets.
Georg Brandl8ec7f652007-08-15 14:28:01 +0000636
Vinay Sajip4b782332009-01-19 06:49:19 +0000637#. :ref:`datagram-handler` instances send error messages to UDP
Vinay Sajipb5902e62009-01-15 22:48:13 +0000638 sockets.
Georg Brandl8ec7f652007-08-15 14:28:01 +0000639
Vinay Sajip4b782332009-01-19 06:49:19 +0000640#. :ref:`smtp-handler` instances send error messages to a designated
Vinay Sajipb5902e62009-01-15 22:48:13 +0000641 email address.
Georg Brandl8ec7f652007-08-15 14:28:01 +0000642
Vinay Sajip4b782332009-01-19 06:49:19 +0000643#. :ref:`syslog-handler` instances send error messages to a Unix
Vinay Sajipb5902e62009-01-15 22:48:13 +0000644 syslog daemon, possibly on a remote machine.
Georg Brandl8ec7f652007-08-15 14:28:01 +0000645
Vinay Sajip4b782332009-01-19 06:49:19 +0000646#. :ref:`nt-eventlog-handler` instances send error messages to a
Vinay Sajipb5902e62009-01-15 22:48:13 +0000647 Windows NT/2000/XP event log.
Georg Brandl8ec7f652007-08-15 14:28:01 +0000648
Vinay Sajip4b782332009-01-19 06:49:19 +0000649#. :ref:`memory-handler` instances send error messages to a buffer
Vinay Sajipb5902e62009-01-15 22:48:13 +0000650 in memory, which is flushed whenever specific criteria are met.
Georg Brandl8ec7f652007-08-15 14:28:01 +0000651
Vinay Sajip4b782332009-01-19 06:49:19 +0000652#. :ref:`http-handler` instances send error messages to an HTTP
Vinay Sajipb5902e62009-01-15 22:48:13 +0000653 server using either ``GET`` or ``POST`` semantics.
Georg Brandl8ec7f652007-08-15 14:28:01 +0000654
Vinay Sajip4b782332009-01-19 06:49:19 +0000655#. :ref:`watched-file-handler` instances watch the file they are
Vinay Sajipb5902e62009-01-15 22:48:13 +0000656 logging to. If the file changes, it is closed and reopened using the file
657 name. This handler is only useful on Unix-like systems; Windows does not
658 support the underlying mechanism used.
Vinay Sajipc2211ad2009-01-10 19:22:57 +0000659
Vinay Sajip4b782332009-01-19 06:49:19 +0000660#. :ref:`null-handler` instances do nothing with error messages. They are used
Vinay Sajip213faca2008-12-03 23:22:58 +0000661 by library developers who want to use logging, but want to avoid the "No
662 handlers could be found for logger XXX" message which can be displayed if
Vinay Sajip99505c82009-01-10 13:38:04 +0000663 the library user has not configured logging. See :ref:`library-config` for
664 more information.
Vinay Sajip213faca2008-12-03 23:22:58 +0000665
666.. versionadded:: 2.7
667
668The :class:`NullHandler` class was not present in previous versions.
669
Vinay Sajip7cc97552008-12-30 07:01:25 +0000670The :class:`NullHandler`, :class:`StreamHandler` and :class:`FileHandler`
671classes are defined in the core logging package. The other handlers are
672defined in a sub- module, :mod:`logging.handlers`. (There is also another
673sub-module, :mod:`logging.config`, for configuration functionality.)
Georg Brandl8ec7f652007-08-15 14:28:01 +0000674
675Logged messages are formatted for presentation through instances of the
676:class:`Formatter` class. They are initialized with a format string suitable for
677use with the % operator and a dictionary.
678
679For formatting multiple messages in a batch, instances of
680:class:`BufferingFormatter` can be used. In addition to the format string (which
681is applied to each message in the batch), there is provision for header and
682trailer format strings.
683
684When filtering based on logger level and/or handler level is not enough,
685instances of :class:`Filter` can be added to both :class:`Logger` and
686:class:`Handler` instances (through their :meth:`addFilter` method). Before
687deciding to process a message further, both loggers and handlers consult all
688their filters for permission. If any filter returns a false value, the message
689is not processed further.
690
691The basic :class:`Filter` functionality allows filtering by specific logger
692name. If this feature is used, messages sent to the named logger and its
693children are allowed through the filter, and all others dropped.
694
Vinay Sajipb5902e62009-01-15 22:48:13 +0000695Module-Level Functions
696----------------------
697
Georg Brandl8ec7f652007-08-15 14:28:01 +0000698In addition to the classes described above, there are a number of module- level
699functions.
700
701
702.. function:: getLogger([name])
703
704 Return a logger with the specified name or, if no name is specified, return a
705 logger which is the root logger of the hierarchy. If specified, the name is
706 typically a dot-separated hierarchical name like *"a"*, *"a.b"* or *"a.b.c.d"*.
707 Choice of these names is entirely up to the developer who is using logging.
708
709 All calls to this function with a given name return the same logger instance.
710 This means that logger instances never need to be passed between different parts
711 of an application.
712
713
714.. function:: getLoggerClass()
715
716 Return either the standard :class:`Logger` class, or the last class passed to
717 :func:`setLoggerClass`. This function may be called from within a new class
718 definition, to ensure that installing a customised :class:`Logger` class will
719 not undo customisations already applied by other code. For example::
720
721 class MyLogger(logging.getLoggerClass()):
722 # ... override behaviour here
723
724
725.. function:: debug(msg[, *args[, **kwargs]])
726
727 Logs a message with level :const:`DEBUG` on the root logger. The *msg* is the
728 message format string, and the *args* are the arguments which are merged into
729 *msg* using the string formatting operator. (Note that this means that you can
730 use keywords in the format string, together with a single dictionary argument.)
731
732 There are two keyword arguments in *kwargs* which are inspected: *exc_info*
733 which, if it does not evaluate as false, causes exception information to be
734 added to the logging message. If an exception tuple (in the format returned by
735 :func:`sys.exc_info`) is provided, it is used; otherwise, :func:`sys.exc_info`
736 is called to get the exception information.
737
738 The other optional keyword argument is *extra* which can be used to pass a
739 dictionary which is used to populate the __dict__ of the LogRecord created for
740 the logging event with user-defined attributes. These custom attributes can then
741 be used as you like. For example, they could be incorporated into logged
742 messages. For example::
743
744 FORMAT = "%(asctime)-15s %(clientip)s %(user)-8s %(message)s"
745 logging.basicConfig(format=FORMAT)
746 d = {'clientip': '192.168.0.1', 'user': 'fbloggs'}
747 logging.warning("Protocol problem: %s", "connection reset", extra=d)
748
Vinay Sajipfe08e6f2010-09-11 10:25:28 +0000749 would print something like::
Georg Brandl8ec7f652007-08-15 14:28:01 +0000750
751 2006-02-08 22:20:02,165 192.168.0.1 fbloggs Protocol problem: connection reset
752
753 The keys in the dictionary passed in *extra* should not clash with the keys used
754 by the logging system. (See the :class:`Formatter` documentation for more
755 information on which keys are used by the logging system.)
756
757 If you choose to use these attributes in logged messages, you need to exercise
758 some care. In the above example, for instance, the :class:`Formatter` has been
759 set up with a format string which expects 'clientip' and 'user' in the attribute
760 dictionary of the LogRecord. If these are missing, the message will not be
761 logged because a string formatting exception will occur. So in this case, you
762 always need to pass the *extra* dictionary with these keys.
763
764 While this might be annoying, this feature is intended for use in specialized
765 circumstances, such as multi-threaded servers where the same code executes in
766 many contexts, and interesting conditions which arise are dependent on this
767 context (such as remote client IP address and authenticated user name, in the
768 above example). In such circumstances, it is likely that specialized
769 :class:`Formatter`\ s would be used with particular :class:`Handler`\ s.
770
771 .. versionchanged:: 2.5
772 *extra* was added.
773
774
775.. function:: info(msg[, *args[, **kwargs]])
776
777 Logs a message with level :const:`INFO` on the root logger. The arguments are
778 interpreted as for :func:`debug`.
779
780
781.. function:: warning(msg[, *args[, **kwargs]])
782
783 Logs a message with level :const:`WARNING` on the root logger. The arguments are
784 interpreted as for :func:`debug`.
785
786
787.. function:: error(msg[, *args[, **kwargs]])
788
789 Logs a message with level :const:`ERROR` on the root logger. The arguments are
790 interpreted as for :func:`debug`.
791
792
793.. function:: critical(msg[, *args[, **kwargs]])
794
795 Logs a message with level :const:`CRITICAL` on the root logger. The arguments
796 are interpreted as for :func:`debug`.
797
798
799.. function:: exception(msg[, *args])
800
801 Logs a message with level :const:`ERROR` on the root logger. The arguments are
802 interpreted as for :func:`debug`. Exception info is added to the logging
803 message. This function should only be called from an exception handler.
804
805
806.. function:: log(level, msg[, *args[, **kwargs]])
807
808 Logs a message with level *level* on the root logger. The other arguments are
809 interpreted as for :func:`debug`.
810
Vinay Sajip89e1ae22010-09-17 10:09:04 +0000811 PLEASE NOTE: The above module-level functions which delegate to the root
812 logger should *not* be used in threads, in versions of Python earlier than
813 2.7.1 and 3.2, unless at least one handler has been added to the root
814 logger *before* the threads are started. These convenience functions call
815 :func:`basicConfig` to ensure that at least one handler is available; in
816 earlier versions of Python, this can (under rare circumstances) lead to
817 handlers being added multiple times to the root logger, which can in turn
818 lead to multiple messages for the same event.
Georg Brandl8ec7f652007-08-15 14:28:01 +0000819
820.. function:: disable(lvl)
821
822 Provides an overriding level *lvl* for all loggers which takes precedence over
823 the logger's own level. When the need arises to temporarily throttle logging
Vinay Sajip2060e422010-03-17 15:05:57 +0000824 output down across the whole application, this function can be useful. Its
825 effect is to disable all logging calls of severity *lvl* and below, so that
826 if you call it with a value of INFO, then all INFO and DEBUG events would be
827 discarded, whereas those of severity WARNING and above would be processed
828 according to the logger's effective level.
Georg Brandl8ec7f652007-08-15 14:28:01 +0000829
830
831.. function:: addLevelName(lvl, levelName)
832
833 Associates level *lvl* with text *levelName* in an internal dictionary, which is
834 used to map numeric levels to a textual representation, for example when a
835 :class:`Formatter` formats a message. This function can also be used to define
836 your own levels. The only constraints are that all levels used must be
837 registered using this function, levels should be positive integers and they
838 should increase in increasing order of severity.
839
Vinay Sajip89e1ae22010-09-17 10:09:04 +0000840 NOTE: If you are thinking of defining your own levels, please see the section
841 on :ref:`custom-levels`.
Georg Brandl8ec7f652007-08-15 14:28:01 +0000842
843.. function:: getLevelName(lvl)
844
845 Returns the textual representation of logging level *lvl*. If the level is one
846 of the predefined levels :const:`CRITICAL`, :const:`ERROR`, :const:`WARNING`,
847 :const:`INFO` or :const:`DEBUG` then you get the corresponding string. If you
848 have associated levels with names using :func:`addLevelName` then the name you
849 have associated with *lvl* is returned. If a numeric value corresponding to one
850 of the defined levels is passed in, the corresponding string representation is
851 returned. Otherwise, the string "Level %s" % lvl is returned.
852
853
854.. function:: makeLogRecord(attrdict)
855
856 Creates and returns a new :class:`LogRecord` instance whose attributes are
857 defined by *attrdict*. This function is useful for taking a pickled
858 :class:`LogRecord` attribute dictionary, sent over a socket, and reconstituting
859 it as a :class:`LogRecord` instance at the receiving end.
860
861
862.. function:: basicConfig([**kwargs])
863
864 Does basic configuration for the logging system by creating a
865 :class:`StreamHandler` with a default :class:`Formatter` and adding it to the
Vinay Sajip1c77b7f2009-10-10 20:32:36 +0000866 root logger. The functions :func:`debug`, :func:`info`, :func:`warning`,
Georg Brandl8ec7f652007-08-15 14:28:01 +0000867 :func:`error` and :func:`critical` will call :func:`basicConfig` automatically
868 if no handlers are defined for the root logger.
869
Vinay Sajip1c77b7f2009-10-10 20:32:36 +0000870 This function does nothing if the root logger already has handlers
871 configured for it.
Georg Brandldfb5bbd2008-05-09 06:18:27 +0000872
Georg Brandl8ec7f652007-08-15 14:28:01 +0000873 .. versionchanged:: 2.4
874 Formerly, :func:`basicConfig` did not take any keyword arguments.
875
Vinay Sajip89e1ae22010-09-17 10:09:04 +0000876 PLEASE NOTE: This function should be called from the main thread
877 before other threads are started. In versions of Python prior to
878 2.7.1 and 3.2, if this function is called from multiple threads,
879 it is possible (in rare circumstances) that a handler will be added
880 to the root logger more than once, leading to unexpected results
881 such as messages being duplicated in the log.
882
Georg Brandl8ec7f652007-08-15 14:28:01 +0000883 The following keyword arguments are supported.
884
885 +--------------+---------------------------------------------+
886 | Format | Description |
887 +==============+=============================================+
888 | ``filename`` | Specifies that a FileHandler be created, |
889 | | using the specified filename, rather than a |
890 | | StreamHandler. |
891 +--------------+---------------------------------------------+
892 | ``filemode`` | Specifies the mode to open the file, if |
893 | | filename is specified (if filemode is |
894 | | unspecified, it defaults to 'a'). |
895 +--------------+---------------------------------------------+
896 | ``format`` | Use the specified format string for the |
897 | | handler. |
898 +--------------+---------------------------------------------+
899 | ``datefmt`` | Use the specified date/time format. |
900 +--------------+---------------------------------------------+
901 | ``level`` | Set the root logger level to the specified |
902 | | level. |
903 +--------------+---------------------------------------------+
904 | ``stream`` | Use the specified stream to initialize the |
905 | | StreamHandler. Note that this argument is |
906 | | incompatible with 'filename' - if both are |
907 | | present, 'stream' is ignored. |
908 +--------------+---------------------------------------------+
909
910
911.. function:: shutdown()
912
913 Informs the logging system to perform an orderly shutdown by flushing and
Vinay Sajip91f0ee42008-03-16 21:35:58 +0000914 closing all handlers. This should be called at application exit and no
915 further use of the logging system should be made after this call.
Georg Brandl8ec7f652007-08-15 14:28:01 +0000916
917
918.. function:: setLoggerClass(klass)
919
920 Tells the logging system to use the class *klass* when instantiating a logger.
921 The class should define :meth:`__init__` such that only a name argument is
922 required, and the :meth:`__init__` should call :meth:`Logger.__init__`. This
923 function is typically called before any loggers are instantiated by applications
924 which need to use custom logger behavior.
925
926
927.. seealso::
928
929 :pep:`282` - A Logging System
930 The proposal which described this feature for inclusion in the Python standard
931 library.
932
Georg Brandl2b92f6b2007-12-06 01:52:24 +0000933 `Original Python logging package <http://www.red-dove.com/python_logging.html>`_
Georg Brandl8ec7f652007-08-15 14:28:01 +0000934 This is the original source for the :mod:`logging` package. The version of the
935 package available from this site is suitable for use with Python 1.5.2, 2.1.x
936 and 2.2.x, which do not include the :mod:`logging` package in the standard
937 library.
938
Vinay Sajip4b782332009-01-19 06:49:19 +0000939.. _logger:
Georg Brandl8ec7f652007-08-15 14:28:01 +0000940
941Logger Objects
942--------------
943
944Loggers have the following attributes and methods. Note that Loggers are never
945instantiated directly, but always through the module-level function
946``logging.getLogger(name)``.
947
948
949.. attribute:: Logger.propagate
950
951 If this evaluates to false, logging messages are not passed by this logger or by
Vinay Sajipccd8bc82010-04-06 22:32:37 +0000952 its child loggers to the handlers of higher level (ancestor) loggers. The
953 constructor sets this attribute to 1.
Georg Brandl8ec7f652007-08-15 14:28:01 +0000954
955
956.. method:: Logger.setLevel(lvl)
957
958 Sets the threshold for this logger to *lvl*. Logging messages which are less
959 severe than *lvl* will be ignored. When a logger is created, the level is set to
960 :const:`NOTSET` (which causes all messages to be processed when the logger is
961 the root logger, or delegation to the parent when the logger is a non-root
962 logger). Note that the root logger is created with level :const:`WARNING`.
963
964 The term "delegation to the parent" means that if a logger has a level of
965 NOTSET, its chain of ancestor loggers is traversed until either an ancestor with
966 a level other than NOTSET is found, or the root is reached.
967
968 If an ancestor is found with a level other than NOTSET, then that ancestor's
969 level is treated as the effective level of the logger where the ancestor search
970 began, and is used to determine how a logging event is handled.
971
972 If the root is reached, and it has a level of NOTSET, then all messages will be
973 processed. Otherwise, the root's level will be used as the effective level.
974
975
976.. method:: Logger.isEnabledFor(lvl)
977
978 Indicates if a message of severity *lvl* would be processed by this logger.
979 This method checks first the module-level level set by
980 ``logging.disable(lvl)`` and then the logger's effective level as determined
981 by :meth:`getEffectiveLevel`.
982
983
984.. method:: Logger.getEffectiveLevel()
985
986 Indicates the effective level for this logger. If a value other than
987 :const:`NOTSET` has been set using :meth:`setLevel`, it is returned. Otherwise,
988 the hierarchy is traversed towards the root until a value other than
989 :const:`NOTSET` is found, and that value is returned.
990
991
Vinay Sajip804899b2010-03-22 15:29:01 +0000992.. method:: Logger.getChild(suffix)
993
994 Returns a logger which is a descendant to this logger, as determined by the suffix.
995 Thus, ``logging.getLogger('abc').getChild('def.ghi')`` would return the same
996 logger as would be returned by ``logging.getLogger('abc.def.ghi')``. This is a
997 convenience method, useful when the parent logger is named using e.g. ``__name__``
998 rather than a literal string.
999
1000 .. versionadded:: 2.7
1001
Georg Brandl8ec7f652007-08-15 14:28:01 +00001002.. method:: Logger.debug(msg[, *args[, **kwargs]])
1003
1004 Logs a message with level :const:`DEBUG` on this logger. The *msg* is the
1005 message format string, and the *args* are the arguments which are merged into
1006 *msg* using the string formatting operator. (Note that this means that you can
1007 use keywords in the format string, together with a single dictionary argument.)
1008
1009 There are two keyword arguments in *kwargs* which are inspected: *exc_info*
1010 which, if it does not evaluate as false, causes exception information to be
1011 added to the logging message. If an exception tuple (in the format returned by
1012 :func:`sys.exc_info`) is provided, it is used; otherwise, :func:`sys.exc_info`
1013 is called to get the exception information.
1014
1015 The other optional keyword argument is *extra* which can be used to pass a
1016 dictionary which is used to populate the __dict__ of the LogRecord created for
1017 the logging event with user-defined attributes. These custom attributes can then
1018 be used as you like. For example, they could be incorporated into logged
1019 messages. For example::
1020
1021 FORMAT = "%(asctime)-15s %(clientip)s %(user)-8s %(message)s"
1022 logging.basicConfig(format=FORMAT)
Neal Norwitz53004282007-10-23 05:44:27 +00001023 d = { 'clientip' : '192.168.0.1', 'user' : 'fbloggs' }
Georg Brandl8ec7f652007-08-15 14:28:01 +00001024 logger = logging.getLogger("tcpserver")
1025 logger.warning("Protocol problem: %s", "connection reset", extra=d)
1026
1027 would print something like ::
1028
1029 2006-02-08 22:20:02,165 192.168.0.1 fbloggs Protocol problem: connection reset
1030
1031 The keys in the dictionary passed in *extra* should not clash with the keys used
1032 by the logging system. (See the :class:`Formatter` documentation for more
1033 information on which keys are used by the logging system.)
1034
1035 If you choose to use these attributes in logged messages, you need to exercise
1036 some care. In the above example, for instance, the :class:`Formatter` has been
1037 set up with a format string which expects 'clientip' and 'user' in the attribute
1038 dictionary of the LogRecord. If these are missing, the message will not be
1039 logged because a string formatting exception will occur. So in this case, you
1040 always need to pass the *extra* dictionary with these keys.
1041
1042 While this might be annoying, this feature is intended for use in specialized
1043 circumstances, such as multi-threaded servers where the same code executes in
1044 many contexts, and interesting conditions which arise are dependent on this
1045 context (such as remote client IP address and authenticated user name, in the
1046 above example). In such circumstances, it is likely that specialized
1047 :class:`Formatter`\ s would be used with particular :class:`Handler`\ s.
1048
1049 .. versionchanged:: 2.5
1050 *extra* was added.
1051
1052
1053.. method:: Logger.info(msg[, *args[, **kwargs]])
1054
1055 Logs a message with level :const:`INFO` on this logger. The arguments are
1056 interpreted as for :meth:`debug`.
1057
1058
1059.. method:: Logger.warning(msg[, *args[, **kwargs]])
1060
1061 Logs a message with level :const:`WARNING` on this logger. The arguments are
1062 interpreted as for :meth:`debug`.
1063
1064
1065.. method:: Logger.error(msg[, *args[, **kwargs]])
1066
1067 Logs a message with level :const:`ERROR` on this logger. The arguments are
1068 interpreted as for :meth:`debug`.
1069
1070
1071.. method:: Logger.critical(msg[, *args[, **kwargs]])
1072
1073 Logs a message with level :const:`CRITICAL` on this logger. The arguments are
1074 interpreted as for :meth:`debug`.
1075
1076
1077.. method:: Logger.log(lvl, msg[, *args[, **kwargs]])
1078
1079 Logs a message with integer level *lvl* on this logger. The other arguments are
1080 interpreted as for :meth:`debug`.
1081
1082
1083.. method:: Logger.exception(msg[, *args])
1084
1085 Logs a message with level :const:`ERROR` on this logger. The arguments are
1086 interpreted as for :meth:`debug`. Exception info is added to the logging
1087 message. This method should only be called from an exception handler.
1088
1089
1090.. method:: Logger.addFilter(filt)
1091
1092 Adds the specified filter *filt* to this logger.
1093
1094
1095.. method:: Logger.removeFilter(filt)
1096
1097 Removes the specified filter *filt* from this logger.
1098
1099
1100.. method:: Logger.filter(record)
1101
1102 Applies this logger's filters to the record and returns a true value if the
1103 record is to be processed.
1104
1105
1106.. method:: Logger.addHandler(hdlr)
1107
1108 Adds the specified handler *hdlr* to this logger.
1109
1110
1111.. method:: Logger.removeHandler(hdlr)
1112
1113 Removes the specified handler *hdlr* from this logger.
1114
1115
1116.. method:: Logger.findCaller()
1117
1118 Finds the caller's source filename and line number. Returns the filename, line
1119 number and function name as a 3-element tuple.
1120
Matthias Klosef0e29182007-08-16 12:03:44 +00001121 .. versionchanged:: 2.4
Georg Brandl8ec7f652007-08-15 14:28:01 +00001122 The function name was added. In earlier versions, the filename and line number
1123 were returned as a 2-element tuple..
1124
1125
1126.. method:: Logger.handle(record)
1127
1128 Handles a record by passing it to all handlers associated with this logger and
1129 its ancestors (until a false value of *propagate* is found). This method is used
1130 for unpickled records received from a socket, as well as those created locally.
Georg Brandl9fa61bb2009-07-26 14:19:57 +00001131 Logger-level filtering is applied using :meth:`~Logger.filter`.
Georg Brandl8ec7f652007-08-15 14:28:01 +00001132
1133
1134.. method:: Logger.makeRecord(name, lvl, fn, lno, msg, args, exc_info [, func, extra])
1135
1136 This is a factory method which can be overridden in subclasses to create
1137 specialized :class:`LogRecord` instances.
1138
1139 .. versionchanged:: 2.5
1140 *func* and *extra* were added.
1141
1142
1143.. _minimal-example:
1144
1145Basic example
1146-------------
1147
1148.. versionchanged:: 2.4
1149 formerly :func:`basicConfig` did not take any keyword arguments.
1150
1151The :mod:`logging` package provides a lot of flexibility, and its configuration
1152can appear daunting. This section demonstrates that simple use of the logging
1153package is possible.
1154
1155The simplest example shows logging to the console::
1156
1157 import logging
1158
1159 logging.debug('A debug message')
1160 logging.info('Some information')
1161 logging.warning('A shot across the bows')
1162
1163If you run the above script, you'll see this::
1164
1165 WARNING:root:A shot across the bows
1166
1167Because no particular logger was specified, the system used the root logger. The
1168debug and info messages didn't appear because by default, the root logger is
1169configured to only handle messages with a severity of WARNING or above. The
1170message format is also a configuration default, as is the output destination of
1171the messages - ``sys.stderr``. The severity level, the message format and
1172destination can be easily changed, as shown in the example below::
1173
1174 import logging
1175
1176 logging.basicConfig(level=logging.DEBUG,
1177 format='%(asctime)s %(levelname)s %(message)s',
Vinay Sajip998cc242010-06-04 13:41:02 +00001178 filename='myapp.log',
Georg Brandl8ec7f652007-08-15 14:28:01 +00001179 filemode='w')
1180 logging.debug('A debug message')
1181 logging.info('Some information')
1182 logging.warning('A shot across the bows')
1183
1184The :meth:`basicConfig` method is used to change the configuration defaults,
Vinay Sajip998cc242010-06-04 13:41:02 +00001185which results in output (written to ``myapp.log``) which should look
Georg Brandl8ec7f652007-08-15 14:28:01 +00001186something like the following::
1187
1188 2004-07-02 13:00:08,743 DEBUG A debug message
1189 2004-07-02 13:00:08,743 INFO Some information
1190 2004-07-02 13:00:08,743 WARNING A shot across the bows
1191
1192This time, all messages with a severity of DEBUG or above were handled, and the
1193format of the messages was also changed, and output went to the specified file
1194rather than the console.
1195
1196Formatting uses standard Python string formatting - see section
1197:ref:`string-formatting`. The format string takes the following common
1198specifiers. For a complete list of specifiers, consult the :class:`Formatter`
1199documentation.
1200
1201+-------------------+-----------------------------------------------+
1202| Format | Description |
1203+===================+===============================================+
1204| ``%(name)s`` | Name of the logger (logging channel). |
1205+-------------------+-----------------------------------------------+
1206| ``%(levelname)s`` | Text logging level for the message |
1207| | (``'DEBUG'``, ``'INFO'``, ``'WARNING'``, |
1208| | ``'ERROR'``, ``'CRITICAL'``). |
1209+-------------------+-----------------------------------------------+
1210| ``%(asctime)s`` | Human-readable time when the |
1211| | :class:`LogRecord` was created. By default |
1212| | this is of the form "2003-07-08 16:49:45,896" |
1213| | (the numbers after the comma are millisecond |
1214| | portion of the time). |
1215+-------------------+-----------------------------------------------+
1216| ``%(message)s`` | The logged message. |
1217+-------------------+-----------------------------------------------+
1218
1219To change the date/time format, you can pass an additional keyword parameter,
1220*datefmt*, as in the following::
1221
1222 import logging
1223
1224 logging.basicConfig(level=logging.DEBUG,
1225 format='%(asctime)s %(levelname)-8s %(message)s',
1226 datefmt='%a, %d %b %Y %H:%M:%S',
1227 filename='/temp/myapp.log',
1228 filemode='w')
1229 logging.debug('A debug message')
1230 logging.info('Some information')
1231 logging.warning('A shot across the bows')
1232
1233which would result in output like ::
1234
1235 Fri, 02 Jul 2004 13:06:18 DEBUG A debug message
1236 Fri, 02 Jul 2004 13:06:18 INFO Some information
1237 Fri, 02 Jul 2004 13:06:18 WARNING A shot across the bows
1238
1239The date format string follows the requirements of :func:`strftime` - see the
1240documentation for the :mod:`time` module.
1241
1242If, instead of sending logging output to the console or a file, you'd rather use
1243a file-like object which you have created separately, you can pass it to
1244:func:`basicConfig` using the *stream* keyword argument. Note that if both
1245*stream* and *filename* keyword arguments are passed, the *stream* argument is
1246ignored.
1247
1248Of course, you can put variable information in your output. To do this, simply
1249have the message be a format string and pass in additional arguments containing
1250the variable information, as in the following example::
1251
1252 import logging
1253
1254 logging.basicConfig(level=logging.DEBUG,
1255 format='%(asctime)s %(levelname)-8s %(message)s',
1256 datefmt='%a, %d %b %Y %H:%M:%S',
1257 filename='/temp/myapp.log',
1258 filemode='w')
1259 logging.error('Pack my box with %d dozen %s', 5, 'liquor jugs')
1260
1261which would result in ::
1262
1263 Wed, 21 Jul 2004 15:35:16 ERROR Pack my box with 5 dozen liquor jugs
1264
1265
1266.. _multiple-destinations:
1267
1268Logging to multiple destinations
1269--------------------------------
1270
1271Let's say you want to log to console and file with different message formats and
1272in differing circumstances. Say you want to log messages with levels of DEBUG
1273and higher to file, and those messages at level INFO and higher to the console.
1274Let's also assume that the file should contain timestamps, but the console
1275messages should not. Here's how you can achieve this::
1276
1277 import logging
1278
1279 # set up logging to file - see previous section for more details
1280 logging.basicConfig(level=logging.DEBUG,
1281 format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
1282 datefmt='%m-%d %H:%M',
1283 filename='/temp/myapp.log',
1284 filemode='w')
1285 # define a Handler which writes INFO messages or higher to the sys.stderr
1286 console = logging.StreamHandler()
1287 console.setLevel(logging.INFO)
1288 # set a format which is simpler for console use
1289 formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
1290 # tell the handler to use this format
1291 console.setFormatter(formatter)
1292 # add the handler to the root logger
1293 logging.getLogger('').addHandler(console)
1294
1295 # Now, we can log to the root logger, or any other logger. First the root...
1296 logging.info('Jackdaws love my big sphinx of quartz.')
1297
1298 # Now, define a couple of other loggers which might represent areas in your
1299 # application:
1300
1301 logger1 = logging.getLogger('myapp.area1')
1302 logger2 = logging.getLogger('myapp.area2')
1303
1304 logger1.debug('Quick zephyrs blow, vexing daft Jim.')
1305 logger1.info('How quickly daft jumping zebras vex.')
1306 logger2.warning('Jail zesty vixen who grabbed pay from quack.')
1307 logger2.error('The five boxing wizards jump quickly.')
1308
1309When you run this, on the console you will see ::
1310
1311 root : INFO Jackdaws love my big sphinx of quartz.
1312 myapp.area1 : INFO How quickly daft jumping zebras vex.
1313 myapp.area2 : WARNING Jail zesty vixen who grabbed pay from quack.
1314 myapp.area2 : ERROR The five boxing wizards jump quickly.
1315
1316and in the file you will see something like ::
1317
1318 10-22 22:19 root INFO Jackdaws love my big sphinx of quartz.
1319 10-22 22:19 myapp.area1 DEBUG Quick zephyrs blow, vexing daft Jim.
1320 10-22 22:19 myapp.area1 INFO How quickly daft jumping zebras vex.
1321 10-22 22:19 myapp.area2 WARNING Jail zesty vixen who grabbed pay from quack.
1322 10-22 22:19 myapp.area2 ERROR The five boxing wizards jump quickly.
1323
1324As you can see, the DEBUG message only shows up in the file. The other messages
1325are sent to both destinations.
1326
1327This example uses console and file handlers, but you can use any number and
1328combination of handlers you choose.
1329
Vinay Sajip333c6e72009-08-20 22:04:32 +00001330.. _logging-exceptions:
1331
1332Exceptions raised during logging
1333--------------------------------
1334
1335The logging package is designed to swallow exceptions which occur while logging
1336in production. This is so that errors which occur while handling logging events
1337- such as logging misconfiguration, network or other similar errors - do not
1338cause the application using logging to terminate prematurely.
1339
1340:class:`SystemExit` and :class:`KeyboardInterrupt` exceptions are never
1341swallowed. Other exceptions which occur during the :meth:`emit` method of a
1342:class:`Handler` subclass are passed to its :meth:`handleError` method.
1343
1344The default implementation of :meth:`handleError` in :class:`Handler` checks
Georg Brandlf6d367452010-03-12 10:02:03 +00001345to see if a module-level variable, :data:`raiseExceptions`, is set. If set, a
1346traceback is printed to :data:`sys.stderr`. If not set, the exception is swallowed.
Vinay Sajip333c6e72009-08-20 22:04:32 +00001347
Georg Brandlf6d367452010-03-12 10:02:03 +00001348**Note:** The default value of :data:`raiseExceptions` is ``True``. This is because
Vinay Sajip333c6e72009-08-20 22:04:32 +00001349during development, you typically want to be notified of any exceptions that
Georg Brandlf6d367452010-03-12 10:02:03 +00001350occur. It's advised that you set :data:`raiseExceptions` to ``False`` for production
Vinay Sajip333c6e72009-08-20 22:04:32 +00001351usage.
Georg Brandl8ec7f652007-08-15 14:28:01 +00001352
Vinay Sajipaa0665b2008-01-07 19:40:10 +00001353.. _context-info:
1354
1355Adding contextual information to your logging output
1356----------------------------------------------------
1357
1358Sometimes you want logging output to contain contextual information in
1359addition to the parameters passed to the logging call. For example, in a
1360networked application, it may be desirable to log client-specific information
1361in the log (e.g. remote client's username, or IP address). Although you could
1362use the *extra* parameter to achieve this, it's not always convenient to pass
1363the information in this way. While it might be tempting to create
1364:class:`Logger` instances on a per-connection basis, this is not a good idea
1365because these instances are not garbage collected. While this is not a problem
1366in practice, when the number of :class:`Logger` instances is dependent on the
1367level of granularity you want to use in logging an application, it could
1368be hard to manage if the number of :class:`Logger` instances becomes
1369effectively unbounded.
1370
Vinay Sajip957a47c2010-09-06 22:18:20 +00001371
1372Using LoggerAdapters to impart contextual information
1373^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1374
Vinay Sajipc7403352008-01-18 15:54:14 +00001375An easy way in which you can pass contextual information to be output along
1376with logging event information is to use the :class:`LoggerAdapter` class.
1377This class is designed to look like a :class:`Logger`, so that you can call
1378:meth:`debug`, :meth:`info`, :meth:`warning`, :meth:`error`,
1379:meth:`exception`, :meth:`critical` and :meth:`log`. These methods have the
1380same signatures as their counterparts in :class:`Logger`, so you can use the
1381two types of instances interchangeably.
Vinay Sajipaa0665b2008-01-07 19:40:10 +00001382
Vinay Sajipc7403352008-01-18 15:54:14 +00001383When you create an instance of :class:`LoggerAdapter`, you pass it a
1384:class:`Logger` instance and a dict-like object which contains your contextual
1385information. When you call one of the logging methods on an instance of
1386:class:`LoggerAdapter`, it delegates the call to the underlying instance of
1387:class:`Logger` passed to its constructor, and arranges to pass the contextual
1388information in the delegated call. Here's a snippet from the code of
1389:class:`LoggerAdapter`::
Vinay Sajipaa0665b2008-01-07 19:40:10 +00001390
Vinay Sajipc7403352008-01-18 15:54:14 +00001391 def debug(self, msg, *args, **kwargs):
1392 """
1393 Delegate a debug call to the underlying logger, after adding
1394 contextual information from this adapter instance.
1395 """
1396 msg, kwargs = self.process(msg, kwargs)
1397 self.logger.debug(msg, *args, **kwargs)
Vinay Sajipaa0665b2008-01-07 19:40:10 +00001398
Vinay Sajipc7403352008-01-18 15:54:14 +00001399The :meth:`process` method of :class:`LoggerAdapter` is where the contextual
1400information is added to the logging output. It's passed the message and
1401keyword arguments of the logging call, and it passes back (potentially)
1402modified versions of these to use in the call to the underlying logger. The
1403default implementation of this method leaves the message alone, but inserts
1404an "extra" key in the keyword argument whose value is the dict-like object
1405passed to the constructor. Of course, if you had passed an "extra" keyword
1406argument in the call to the adapter, it will be silently overwritten.
Vinay Sajipaa0665b2008-01-07 19:40:10 +00001407
Vinay Sajipc7403352008-01-18 15:54:14 +00001408The advantage of using "extra" is that the values in the dict-like object are
1409merged into the :class:`LogRecord` instance's __dict__, allowing you to use
1410customized strings with your :class:`Formatter` instances which know about
1411the keys of the dict-like object. If you need a different method, e.g. if you
1412want to prepend or append the contextual information to the message string,
1413you just need to subclass :class:`LoggerAdapter` and override :meth:`process`
1414to do what you need. Here's an example script which uses this class, which
1415also illustrates what dict-like behaviour is needed from an arbitrary
1416"dict-like" object for use in the constructor::
1417
Georg Brandlf8e6afb2008-01-19 10:11:27 +00001418 import logging
Vinay Sajip733024a2008-01-21 17:39:22 +00001419
Georg Brandlf8e6afb2008-01-19 10:11:27 +00001420 class ConnInfo:
1421 """
1422 An example class which shows how an arbitrary class can be used as
1423 the 'extra' context information repository passed to a LoggerAdapter.
1424 """
Vinay Sajip733024a2008-01-21 17:39:22 +00001425
Georg Brandlf8e6afb2008-01-19 10:11:27 +00001426 def __getitem__(self, name):
1427 """
1428 To allow this instance to look like a dict.
1429 """
1430 from random import choice
1431 if name == "ip":
1432 result = choice(["127.0.0.1", "192.168.0.1"])
1433 elif name == "user":
1434 result = choice(["jim", "fred", "sheila"])
1435 else:
1436 result = self.__dict__.get(name, "?")
1437 return result
Vinay Sajip733024a2008-01-21 17:39:22 +00001438
Georg Brandlf8e6afb2008-01-19 10:11:27 +00001439 def __iter__(self):
1440 """
1441 To allow iteration over keys, which will be merged into
1442 the LogRecord dict before formatting and output.
1443 """
1444 keys = ["ip", "user"]
1445 keys.extend(self.__dict__.keys())
1446 return keys.__iter__()
Vinay Sajip733024a2008-01-21 17:39:22 +00001447
Georg Brandlf8e6afb2008-01-19 10:11:27 +00001448 if __name__ == "__main__":
1449 from random import choice
1450 levels = (logging.DEBUG, logging.INFO, logging.WARNING, logging.ERROR, logging.CRITICAL)
1451 a1 = logging.LoggerAdapter(logging.getLogger("a.b.c"),
1452 { "ip" : "123.231.231.123", "user" : "sheila" })
1453 logging.basicConfig(level=logging.DEBUG,
1454 format="%(asctime)-15s %(name)-5s %(levelname)-8s IP: %(ip)-15s User: %(user)-8s %(message)s")
1455 a1.debug("A debug message")
1456 a1.info("An info message with %s", "some parameters")
1457 a2 = logging.LoggerAdapter(logging.getLogger("d.e.f"), ConnInfo())
1458 for x in range(10):
1459 lvl = choice(levels)
1460 lvlname = logging.getLevelName(lvl)
1461 a2.log(lvl, "A message at %s level with %d %s", lvlname, 2, "parameters")
Vinay Sajipc7403352008-01-18 15:54:14 +00001462
1463When this script is run, the output should look something like this::
1464
Georg Brandlf8e6afb2008-01-19 10:11:27 +00001465 2008-01-18 14:49:54,023 a.b.c DEBUG IP: 123.231.231.123 User: sheila A debug message
1466 2008-01-18 14:49:54,023 a.b.c INFO IP: 123.231.231.123 User: sheila An info message with some parameters
1467 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
1468 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
1469 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
1470 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
1471 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
1472 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
1473 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
1474 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
1475 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
1476 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
Vinay Sajipc7403352008-01-18 15:54:14 +00001477
1478.. versionadded:: 2.6
1479
1480The :class:`LoggerAdapter` class was not present in previous versions.
1481
Vinay Sajip957a47c2010-09-06 22:18:20 +00001482Using Filters to impart contextual information
1483^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1484
1485You can also add contextual information to log output using a user-defined
1486:class:`Filter`. ``Filter`` instances are allowed to modify the ``LogRecords``
1487passed to them, including adding additional attributes which can then be output
1488using a suitable format string, or if needed a custom :class:`Formatter`.
1489
1490For example in a web application, the request being processed (or at least,
1491the interesting parts of it) can be stored in a threadlocal
1492(:class:`threading.local`) variable, and then accessed from a ``Filter`` to
1493add, say, information from the request - say, the remote IP address and remote
1494user's username - to the ``LogRecord``, using the attribute names 'ip' and
1495'user' as in the ``LoggerAdapter`` example above. In that case, the same format
1496string can be used to get similar output to that shown above. Here's an example
1497script::
1498
1499 import logging
1500 from random import choice
1501
1502 class ContextFilter(logging.Filter):
1503 """
1504 This is a filter which injects contextual information into the log.
1505
1506 Rather than use actual contextual information, we just use random
1507 data in this demo.
1508 """
1509
1510 USERS = ['jim', 'fred', 'sheila']
1511 IPS = ['123.231.231.123', '127.0.0.1', '192.168.0.1']
1512
1513 def filter(self, record):
1514
1515 record.ip = choice(ContextFilter.IPS)
1516 record.user = choice(ContextFilter.USERS)
1517 return True
1518
1519 if __name__ == "__main__":
1520 levels = (logging.DEBUG, logging.INFO, logging.WARNING, logging.ERROR, logging.CRITICAL)
1521 a1 = logging.LoggerAdapter(logging.getLogger("a.b.c"),
1522 { "ip" : "123.231.231.123", "user" : "sheila" })
1523 logging.basicConfig(level=logging.DEBUG,
1524 format="%(asctime)-15s %(name)-5s %(levelname)-8s IP: %(ip)-15s User: %(user)-8s %(message)s")
1525 a1 = logging.getLogger("a.b.c")
1526 a2 = logging.getLogger("d.e.f")
1527
1528 f = ContextFilter()
1529 a1.addFilter(f)
1530 a2.addFilter(f)
1531 a1.debug("A debug message")
1532 a1.info("An info message with %s", "some parameters")
1533 for x in range(10):
1534 lvl = choice(levels)
1535 lvlname = logging.getLevelName(lvl)
1536 a2.log(lvl, "A message at %s level with %d %s", lvlname, 2, "parameters")
1537
1538which, when run, produces something like::
1539
1540 2010-09-06 22:38:15,292 a.b.c DEBUG IP: 123.231.231.123 User: fred A debug message
1541 2010-09-06 22:38:15,300 a.b.c INFO IP: 192.168.0.1 User: sheila An info message with some parameters
1542 2010-09-06 22:38:15,300 d.e.f CRITICAL IP: 127.0.0.1 User: sheila A message at CRITICAL level with 2 parameters
1543 2010-09-06 22:38:15,300 d.e.f ERROR IP: 127.0.0.1 User: jim A message at ERROR level with 2 parameters
1544 2010-09-06 22:38:15,300 d.e.f DEBUG IP: 127.0.0.1 User: sheila A message at DEBUG level with 2 parameters
1545 2010-09-06 22:38:15,300 d.e.f ERROR IP: 123.231.231.123 User: fred A message at ERROR level with 2 parameters
1546 2010-09-06 22:38:15,300 d.e.f CRITICAL IP: 192.168.0.1 User: jim A message at CRITICAL level with 2 parameters
1547 2010-09-06 22:38:15,300 d.e.f CRITICAL IP: 127.0.0.1 User: sheila A message at CRITICAL level with 2 parameters
1548 2010-09-06 22:38:15,300 d.e.f DEBUG IP: 192.168.0.1 User: jim A message at DEBUG level with 2 parameters
1549 2010-09-06 22:38:15,301 d.e.f ERROR IP: 127.0.0.1 User: sheila A message at ERROR level with 2 parameters
1550 2010-09-06 22:38:15,301 d.e.f DEBUG IP: 123.231.231.123 User: fred A message at DEBUG level with 2 parameters
1551 2010-09-06 22:38:15,301 d.e.f INFO IP: 123.231.231.123 User: fred A message at INFO level with 2 parameters
1552
1553
Vinay Sajip3a0dc302009-08-15 23:23:12 +00001554.. _multiple-processes:
1555
1556Logging to a single file from multiple processes
1557------------------------------------------------
1558
1559Although logging is thread-safe, and logging to a single file from multiple
1560threads in a single process *is* supported, logging to a single file from
1561*multiple processes* is *not* supported, because there is no standard way to
1562serialize access to a single file across multiple processes in Python. If you
1563need to log to a single file from multiple processes, the best way of doing
1564this is to have all the processes log to a :class:`SocketHandler`, and have a
1565separate process which implements a socket server which reads from the socket
1566and logs to file. (If you prefer, you can dedicate one thread in one of the
1567existing processes to perform this function.) The following section documents
1568this approach in more detail and includes a working socket receiver which can
1569be used as a starting point for you to adapt in your own applications.
Vinay Sajipaa0665b2008-01-07 19:40:10 +00001570
Vinay Sajip1c0b24f2009-08-15 23:34:47 +00001571If you are using a recent version of Python which includes the
1572:mod:`multiprocessing` module, you can write your own handler which uses the
1573:class:`Lock` class from this module to serialize access to the file from
1574your processes. The existing :class:`FileHandler` and subclasses do not make
1575use of :mod:`multiprocessing` at present, though they may do so in the future.
Vinay Sajip5e7f6452009-08-17 13:14:37 +00001576Note that at present, the :mod:`multiprocessing` module does not provide
1577working lock functionality on all platforms (see
1578http://bugs.python.org/issue3770).
Vinay Sajip1c0b24f2009-08-15 23:34:47 +00001579
Georg Brandl8ec7f652007-08-15 14:28:01 +00001580.. _network-logging:
1581
1582Sending and receiving logging events across a network
1583-----------------------------------------------------
1584
1585Let's say you want to send logging events across a network, and handle them at
1586the receiving end. A simple way of doing this is attaching a
1587:class:`SocketHandler` instance to the root logger at the sending end::
1588
Benjamin Petersona7b55a32009-02-20 03:31:23 +00001589 import logging, logging.handlers
Georg Brandl8ec7f652007-08-15 14:28:01 +00001590
1591 rootLogger = logging.getLogger('')
1592 rootLogger.setLevel(logging.DEBUG)
1593 socketHandler = logging.handlers.SocketHandler('localhost',
1594 logging.handlers.DEFAULT_TCP_LOGGING_PORT)
1595 # don't bother with a formatter, since a socket handler sends the event as
1596 # an unformatted pickle
1597 rootLogger.addHandler(socketHandler)
1598
1599 # Now, we can log to the root logger, or any other logger. First the root...
1600 logging.info('Jackdaws love my big sphinx of quartz.')
1601
1602 # Now, define a couple of other loggers which might represent areas in your
1603 # application:
1604
1605 logger1 = logging.getLogger('myapp.area1')
1606 logger2 = logging.getLogger('myapp.area2')
1607
1608 logger1.debug('Quick zephyrs blow, vexing daft Jim.')
1609 logger1.info('How quickly daft jumping zebras vex.')
1610 logger2.warning('Jail zesty vixen who grabbed pay from quack.')
1611 logger2.error('The five boxing wizards jump quickly.')
1612
Georg Brandle152a772008-05-24 18:31:28 +00001613At the receiving end, you can set up a receiver using the :mod:`SocketServer`
Georg Brandl8ec7f652007-08-15 14:28:01 +00001614module. Here is a basic working example::
1615
1616 import cPickle
1617 import logging
1618 import logging.handlers
Georg Brandle152a772008-05-24 18:31:28 +00001619 import SocketServer
Georg Brandl8ec7f652007-08-15 14:28:01 +00001620 import struct
1621
1622
Georg Brandle152a772008-05-24 18:31:28 +00001623 class LogRecordStreamHandler(SocketServer.StreamRequestHandler):
Georg Brandl8ec7f652007-08-15 14:28:01 +00001624 """Handler for a streaming logging request.
1625
1626 This basically logs the record using whatever logging policy is
1627 configured locally.
1628 """
1629
1630 def handle(self):
1631 """
1632 Handle multiple requests - each expected to be a 4-byte length,
1633 followed by the LogRecord in pickle format. Logs the record
1634 according to whatever policy is configured locally.
1635 """
1636 while 1:
1637 chunk = self.connection.recv(4)
1638 if len(chunk) < 4:
1639 break
1640 slen = struct.unpack(">L", chunk)[0]
1641 chunk = self.connection.recv(slen)
1642 while len(chunk) < slen:
1643 chunk = chunk + self.connection.recv(slen - len(chunk))
1644 obj = self.unPickle(chunk)
1645 record = logging.makeLogRecord(obj)
1646 self.handleLogRecord(record)
1647
1648 def unPickle(self, data):
1649 return cPickle.loads(data)
1650
1651 def handleLogRecord(self, record):
1652 # if a name is specified, we use the named logger rather than the one
1653 # implied by the record.
1654 if self.server.logname is not None:
1655 name = self.server.logname
1656 else:
1657 name = record.name
1658 logger = logging.getLogger(name)
1659 # N.B. EVERY record gets logged. This is because Logger.handle
1660 # is normally called AFTER logger-level filtering. If you want
1661 # to do filtering, do it at the client end to save wasting
1662 # cycles and network bandwidth!
1663 logger.handle(record)
1664
Georg Brandle152a772008-05-24 18:31:28 +00001665 class LogRecordSocketReceiver(SocketServer.ThreadingTCPServer):
Georg Brandl8ec7f652007-08-15 14:28:01 +00001666 """simple TCP socket-based logging receiver suitable for testing.
1667 """
1668
1669 allow_reuse_address = 1
1670
1671 def __init__(self, host='localhost',
1672 port=logging.handlers.DEFAULT_TCP_LOGGING_PORT,
1673 handler=LogRecordStreamHandler):
Georg Brandle152a772008-05-24 18:31:28 +00001674 SocketServer.ThreadingTCPServer.__init__(self, (host, port), handler)
Georg Brandl8ec7f652007-08-15 14:28:01 +00001675 self.abort = 0
1676 self.timeout = 1
1677 self.logname = None
1678
1679 def serve_until_stopped(self):
1680 import select
1681 abort = 0
1682 while not abort:
1683 rd, wr, ex = select.select([self.socket.fileno()],
1684 [], [],
1685 self.timeout)
1686 if rd:
1687 self.handle_request()
1688 abort = self.abort
1689
1690 def main():
1691 logging.basicConfig(
1692 format="%(relativeCreated)5d %(name)-15s %(levelname)-8s %(message)s")
1693 tcpserver = LogRecordSocketReceiver()
1694 print "About to start TCP server..."
1695 tcpserver.serve_until_stopped()
1696
1697 if __name__ == "__main__":
1698 main()
1699
1700First run the server, and then the client. On the client side, nothing is
1701printed on the console; on the server side, you should see something like::
1702
1703 About to start TCP server...
1704 59 root INFO Jackdaws love my big sphinx of quartz.
1705 59 myapp.area1 DEBUG Quick zephyrs blow, vexing daft Jim.
1706 69 myapp.area1 INFO How quickly daft jumping zebras vex.
1707 69 myapp.area2 WARNING Jail zesty vixen who grabbed pay from quack.
1708 69 myapp.area2 ERROR The five boxing wizards jump quickly.
1709
Vinay Sajip80eed3e2010-07-06 15:08:55 +00001710Note that there are some security issues with pickle in some scenarios. If
1711these affect you, you can use an alternative serialization scheme by overriding
1712the :meth:`makePickle` method and implementing your alternative there, as
1713well as adapting the above script to use your alternative serialization.
1714
Vinay Sajipfe08e6f2010-09-11 10:25:28 +00001715.. _arbitrary-object-messages:
1716
Vinay Sajipf778bec2009-09-22 17:23:41 +00001717Using arbitrary objects as messages
1718-----------------------------------
1719
1720In the preceding sections and examples, it has been assumed that the message
1721passed when logging the event is a string. However, this is not the only
1722possibility. You can pass an arbitrary object as a message, and its
1723:meth:`__str__` method will be called when the logging system needs to convert
1724it to a string representation. In fact, if you want to, you can avoid
1725computing a string representation altogether - for example, the
1726:class:`SocketHandler` emits an event by pickling it and sending it over the
1727wire.
1728
1729Optimization
1730------------
1731
1732Formatting of message arguments is deferred until it cannot be avoided.
1733However, computing the arguments passed to the logging method can also be
1734expensive, and you may want to avoid doing it if the logger will just throw
1735away your event. To decide what to do, you can call the :meth:`isEnabledFor`
1736method which takes a level argument and returns true if the event would be
1737created by the Logger for that level of call. You can write code like this::
1738
1739 if logger.isEnabledFor(logging.DEBUG):
1740 logger.debug("Message with %s, %s", expensive_func1(),
1741 expensive_func2())
1742
1743so that if the logger's threshold is set above ``DEBUG``, the calls to
1744:func:`expensive_func1` and :func:`expensive_func2` are never made.
1745
1746There are other optimizations which can be made for specific applications which
1747need more precise control over what logging information is collected. Here's a
1748list of things you can do to avoid processing during logging which you don't
1749need:
1750
1751+-----------------------------------------------+----------------------------------------+
1752| What you don't want to collect | How to avoid collecting it |
1753+===============================================+========================================+
1754| Information about where calls were made from. | Set ``logging._srcfile`` to ``None``. |
1755+-----------------------------------------------+----------------------------------------+
1756| Threading information. | Set ``logging.logThreads`` to ``0``. |
1757+-----------------------------------------------+----------------------------------------+
1758| Process information. | Set ``logging.logProcesses`` to ``0``. |
1759+-----------------------------------------------+----------------------------------------+
1760
1761Also note that the core logging module only includes the basic handlers. If
1762you don't import :mod:`logging.handlers` and :mod:`logging.config`, they won't
1763take up any memory.
Georg Brandl8ec7f652007-08-15 14:28:01 +00001764
Vinay Sajip4b782332009-01-19 06:49:19 +00001765.. _handler:
1766
Georg Brandl8ec7f652007-08-15 14:28:01 +00001767Handler Objects
1768---------------
1769
1770Handlers have the following attributes and methods. Note that :class:`Handler`
1771is never instantiated directly; this class acts as a base for more useful
1772subclasses. However, the :meth:`__init__` method in subclasses needs to call
1773:meth:`Handler.__init__`.
1774
1775
1776.. method:: Handler.__init__(level=NOTSET)
1777
1778 Initializes the :class:`Handler` instance by setting its level, setting the list
1779 of filters to the empty list and creating a lock (using :meth:`createLock`) for
1780 serializing access to an I/O mechanism.
1781
1782
1783.. method:: Handler.createLock()
1784
1785 Initializes a thread lock which can be used to serialize access to underlying
1786 I/O functionality which may not be threadsafe.
1787
1788
1789.. method:: Handler.acquire()
1790
1791 Acquires the thread lock created with :meth:`createLock`.
1792
1793
1794.. method:: Handler.release()
1795
1796 Releases the thread lock acquired with :meth:`acquire`.
1797
1798
1799.. method:: Handler.setLevel(lvl)
1800
1801 Sets the threshold for this handler to *lvl*. Logging messages which are less
1802 severe than *lvl* will be ignored. When a handler is created, the level is set
1803 to :const:`NOTSET` (which causes all messages to be processed).
1804
1805
1806.. method:: Handler.setFormatter(form)
1807
1808 Sets the :class:`Formatter` for this handler to *form*.
1809
1810
1811.. method:: Handler.addFilter(filt)
1812
1813 Adds the specified filter *filt* to this handler.
1814
1815
1816.. method:: Handler.removeFilter(filt)
1817
1818 Removes the specified filter *filt* from this handler.
1819
1820
1821.. method:: Handler.filter(record)
1822
1823 Applies this handler's filters to the record and returns a true value if the
1824 record is to be processed.
1825
1826
1827.. method:: Handler.flush()
1828
1829 Ensure all logging output has been flushed. This version does nothing and is
1830 intended to be implemented by subclasses.
1831
1832
1833.. method:: Handler.close()
1834
Vinay Sajipaa5f8732008-09-01 17:44:14 +00001835 Tidy up any resources used by the handler. This version does no output but
1836 removes the handler from an internal list of handlers which is closed when
1837 :func:`shutdown` is called. Subclasses should ensure that this gets called
1838 from overridden :meth:`close` methods.
Georg Brandl8ec7f652007-08-15 14:28:01 +00001839
1840
1841.. method:: Handler.handle(record)
1842
1843 Conditionally emits the specified logging record, depending on filters which may
1844 have been added to the handler. Wraps the actual emission of the record with
1845 acquisition/release of the I/O thread lock.
1846
1847
1848.. method:: Handler.handleError(record)
1849
1850 This method should be called from handlers when an exception is encountered
1851 during an :meth:`emit` call. By default it does nothing, which means that
1852 exceptions get silently ignored. This is what is mostly wanted for a logging
1853 system - most users will not care about errors in the logging system, they are
1854 more interested in application errors. You could, however, replace this with a
1855 custom handler if you wish. The specified record is the one which was being
1856 processed when the exception occurred.
1857
1858
1859.. method:: Handler.format(record)
1860
1861 Do formatting for a record - if a formatter is set, use it. Otherwise, use the
1862 default formatter for the module.
1863
1864
1865.. method:: Handler.emit(record)
1866
1867 Do whatever it takes to actually log the specified logging record. This version
1868 is intended to be implemented by subclasses and so raises a
1869 :exc:`NotImplementedError`.
1870
1871
Vinay Sajip4b782332009-01-19 06:49:19 +00001872.. _stream-handler:
1873
Georg Brandl8ec7f652007-08-15 14:28:01 +00001874StreamHandler
1875^^^^^^^^^^^^^
1876
1877The :class:`StreamHandler` class, located in the core :mod:`logging` package,
1878sends logging output to streams such as *sys.stdout*, *sys.stderr* or any
1879file-like object (or, more precisely, any object which supports :meth:`write`
1880and :meth:`flush` methods).
1881
1882
Vinay Sajip0c6a0e32009-12-17 14:52:00 +00001883.. currentmodule:: logging
1884
Vinay Sajip4780c9a2009-09-26 14:53:32 +00001885.. class:: StreamHandler([stream])
Georg Brandl8ec7f652007-08-15 14:28:01 +00001886
Vinay Sajip4780c9a2009-09-26 14:53:32 +00001887 Returns a new instance of the :class:`StreamHandler` class. If *stream* is
Georg Brandl8ec7f652007-08-15 14:28:01 +00001888 specified, the instance will use it for logging output; otherwise, *sys.stderr*
1889 will be used.
1890
1891
Benjamin Petersonc7b05922008-04-25 01:29:10 +00001892 .. method:: emit(record)
Georg Brandl8ec7f652007-08-15 14:28:01 +00001893
Benjamin Petersonc7b05922008-04-25 01:29:10 +00001894 If a formatter is specified, it is used to format the record. The record
1895 is then written to the stream with a trailing newline. If exception
1896 information is present, it is formatted using
1897 :func:`traceback.print_exception` and appended to the stream.
Georg Brandl8ec7f652007-08-15 14:28:01 +00001898
1899
Benjamin Petersonc7b05922008-04-25 01:29:10 +00001900 .. method:: flush()
Georg Brandl8ec7f652007-08-15 14:28:01 +00001901
Benjamin Petersonc7b05922008-04-25 01:29:10 +00001902 Flushes the stream by calling its :meth:`flush` method. Note that the
1903 :meth:`close` method is inherited from :class:`Handler` and so does
Vinay Sajipaa5f8732008-09-01 17:44:14 +00001904 no output, so an explicit :meth:`flush` call may be needed at times.
Georg Brandl8ec7f652007-08-15 14:28:01 +00001905
1906
Vinay Sajip4b782332009-01-19 06:49:19 +00001907.. _file-handler:
1908
Georg Brandl8ec7f652007-08-15 14:28:01 +00001909FileHandler
1910^^^^^^^^^^^
1911
1912The :class:`FileHandler` class, located in the core :mod:`logging` package,
1913sends logging output to a disk file. It inherits the output functionality from
1914:class:`StreamHandler`.
1915
1916
Vinay Sajipf38ba782008-01-24 12:38:30 +00001917.. class:: FileHandler(filename[, mode[, encoding[, delay]]])
Georg Brandl8ec7f652007-08-15 14:28:01 +00001918
1919 Returns a new instance of the :class:`FileHandler` class. The specified file is
1920 opened and used as the stream for logging. If *mode* is not specified,
1921 :const:`'a'` is used. If *encoding* is not *None*, it is used to open the file
Vinay Sajipf38ba782008-01-24 12:38:30 +00001922 with that encoding. If *delay* is true, then file opening is deferred until the
1923 first call to :meth:`emit`. By default, the file grows indefinitely.
Georg Brandl8ec7f652007-08-15 14:28:01 +00001924
Vinay Sajip59584c42009-08-14 11:33:54 +00001925 .. versionchanged:: 2.6
1926 *delay* was added.
Georg Brandl8ec7f652007-08-15 14:28:01 +00001927
Benjamin Petersonc7b05922008-04-25 01:29:10 +00001928 .. method:: close()
Georg Brandl8ec7f652007-08-15 14:28:01 +00001929
Benjamin Petersonc7b05922008-04-25 01:29:10 +00001930 Closes the file.
Georg Brandl8ec7f652007-08-15 14:28:01 +00001931
1932
Benjamin Petersonc7b05922008-04-25 01:29:10 +00001933 .. method:: emit(record)
Georg Brandl8ec7f652007-08-15 14:28:01 +00001934
Benjamin Petersonc7b05922008-04-25 01:29:10 +00001935 Outputs the record to the file.
Georg Brandl8ec7f652007-08-15 14:28:01 +00001936
Vinay Sajip4b782332009-01-19 06:49:19 +00001937.. _null-handler:
Georg Brandl8ec7f652007-08-15 14:28:01 +00001938
Vinay Sajip51104862009-01-02 18:53:04 +00001939NullHandler
1940^^^^^^^^^^^
1941
1942.. versionadded:: 2.7
1943
1944The :class:`NullHandler` class, located in the core :mod:`logging` package,
1945does not do any formatting or output. It is essentially a "no-op" handler
1946for use by library developers.
1947
1948
1949.. class:: NullHandler()
1950
1951 Returns a new instance of the :class:`NullHandler` class.
1952
1953
1954 .. method:: emit(record)
1955
1956 This method does nothing.
1957
Vinay Sajip99505c82009-01-10 13:38:04 +00001958See :ref:`library-config` for more information on how to use
1959:class:`NullHandler`.
1960
Vinay Sajip4b782332009-01-19 06:49:19 +00001961.. _watched-file-handler:
1962
Georg Brandl8ec7f652007-08-15 14:28:01 +00001963WatchedFileHandler
1964^^^^^^^^^^^^^^^^^^
1965
1966.. versionadded:: 2.6
1967
Vinay Sajipb1a15e42009-01-15 23:04:47 +00001968.. currentmodule:: logging.handlers
Vinay Sajip51104862009-01-02 18:53:04 +00001969
Georg Brandl8ec7f652007-08-15 14:28:01 +00001970The :class:`WatchedFileHandler` class, located in the :mod:`logging.handlers`
1971module, is a :class:`FileHandler` which watches the file it is logging to. If
1972the file changes, it is closed and reopened using the file name.
1973
1974A file change can happen because of usage of programs such as *newsyslog* and
1975*logrotate* which perform log file rotation. This handler, intended for use
1976under Unix/Linux, watches the file to see if it has changed since the last emit.
1977(A file is deemed to have changed if its device or inode have changed.) If the
1978file has changed, the old file stream is closed, and the file opened to get a
1979new stream.
1980
1981This handler is not appropriate for use under Windows, because under Windows
1982open log files cannot be moved or renamed - logging opens the files with
1983exclusive locks - and so there is no need for such a handler. Furthermore,
1984*ST_INO* is not supported under Windows; :func:`stat` always returns zero for
1985this value.
1986
1987
Vinay Sajipf38ba782008-01-24 12:38:30 +00001988.. class:: WatchedFileHandler(filename[,mode[, encoding[, delay]]])
Georg Brandl8ec7f652007-08-15 14:28:01 +00001989
1990 Returns a new instance of the :class:`WatchedFileHandler` class. The specified
1991 file is opened and used as the stream for logging. If *mode* is not specified,
1992 :const:`'a'` is used. If *encoding* is not *None*, it is used to open the file
Vinay Sajipf38ba782008-01-24 12:38:30 +00001993 with that encoding. If *delay* is true, then file opening is deferred until the
1994 first call to :meth:`emit`. By default, the file grows indefinitely.
Georg Brandl8ec7f652007-08-15 14:28:01 +00001995
Vinay Sajip59584c42009-08-14 11:33:54 +00001996 .. versionchanged:: 2.6
1997 *delay* was added.
1998
Georg Brandl8ec7f652007-08-15 14:28:01 +00001999
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002000 .. method:: emit(record)
Georg Brandl8ec7f652007-08-15 14:28:01 +00002001
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002002 Outputs the record to the file, but first checks to see if the file has
2003 changed. If it has, the existing stream is flushed and closed and the
2004 file opened again, before outputting the record to the file.
Georg Brandl8ec7f652007-08-15 14:28:01 +00002005
Vinay Sajip4b782332009-01-19 06:49:19 +00002006.. _rotating-file-handler:
Georg Brandl8ec7f652007-08-15 14:28:01 +00002007
2008RotatingFileHandler
2009^^^^^^^^^^^^^^^^^^^
2010
2011The :class:`RotatingFileHandler` class, located in the :mod:`logging.handlers`
2012module, supports rotation of disk log files.
2013
2014
Vinay Sajipf38ba782008-01-24 12:38:30 +00002015.. class:: RotatingFileHandler(filename[, mode[, maxBytes[, backupCount[, encoding[, delay]]]]])
Georg Brandl8ec7f652007-08-15 14:28:01 +00002016
2017 Returns a new instance of the :class:`RotatingFileHandler` class. The specified
2018 file is opened and used as the stream for logging. If *mode* is not specified,
Vinay Sajipf38ba782008-01-24 12:38:30 +00002019 ``'a'`` is used. If *encoding* is not *None*, it is used to open the file
2020 with that encoding. If *delay* is true, then file opening is deferred until the
2021 first call to :meth:`emit`. By default, the file grows indefinitely.
Georg Brandl8ec7f652007-08-15 14:28:01 +00002022
2023 You can use the *maxBytes* and *backupCount* values to allow the file to
2024 :dfn:`rollover` at a predetermined size. When the size is about to be exceeded,
2025 the file is closed and a new file is silently opened for output. Rollover occurs
2026 whenever the current log file is nearly *maxBytes* in length; if *maxBytes* is
2027 zero, rollover never occurs. If *backupCount* is non-zero, the system will save
2028 old log files by appending the extensions ".1", ".2" etc., to the filename. For
2029 example, with a *backupCount* of 5 and a base file name of :file:`app.log`, you
2030 would get :file:`app.log`, :file:`app.log.1`, :file:`app.log.2`, up to
2031 :file:`app.log.5`. The file being written to is always :file:`app.log`. When
2032 this file is filled, it is closed and renamed to :file:`app.log.1`, and if files
2033 :file:`app.log.1`, :file:`app.log.2`, etc. exist, then they are renamed to
2034 :file:`app.log.2`, :file:`app.log.3` etc. respectively.
2035
Vinay Sajip59584c42009-08-14 11:33:54 +00002036 .. versionchanged:: 2.6
2037 *delay* was added.
Georg Brandl8ec7f652007-08-15 14:28:01 +00002038
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002039 .. method:: doRollover()
Georg Brandl8ec7f652007-08-15 14:28:01 +00002040
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002041 Does a rollover, as described above.
Georg Brandl8ec7f652007-08-15 14:28:01 +00002042
2043
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002044 .. method:: emit(record)
Georg Brandl8ec7f652007-08-15 14:28:01 +00002045
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002046 Outputs the record to the file, catering for rollover as described
2047 previously.
Georg Brandl8ec7f652007-08-15 14:28:01 +00002048
Vinay Sajip4b782332009-01-19 06:49:19 +00002049.. _timed-rotating-file-handler:
Georg Brandl8ec7f652007-08-15 14:28:01 +00002050
2051TimedRotatingFileHandler
2052^^^^^^^^^^^^^^^^^^^^^^^^
2053
2054The :class:`TimedRotatingFileHandler` class, located in the
2055:mod:`logging.handlers` module, supports rotation of disk log files at certain
2056timed intervals.
2057
2058
Andrew M. Kuchling6dd8cca2008-06-05 23:33:54 +00002059.. class:: TimedRotatingFileHandler(filename [,when [,interval [,backupCount[, encoding[, delay[, utc]]]]]])
Georg Brandl8ec7f652007-08-15 14:28:01 +00002060
2061 Returns a new instance of the :class:`TimedRotatingFileHandler` class. The
2062 specified file is opened and used as the stream for logging. On rotating it also
2063 sets the filename suffix. Rotating happens based on the product of *when* and
2064 *interval*.
2065
2066 You can use the *when* to specify the type of *interval*. The list of possible
Georg Brandld77554f2008-06-06 07:34:50 +00002067 values is below. Note that they are not case sensitive.
Georg Brandl8ec7f652007-08-15 14:28:01 +00002068
Georg Brandl72780a42008-03-02 13:41:39 +00002069 +----------------+-----------------------+
2070 | Value | Type of interval |
2071 +================+=======================+
2072 | ``'S'`` | Seconds |
2073 +----------------+-----------------------+
2074 | ``'M'`` | Minutes |
2075 +----------------+-----------------------+
2076 | ``'H'`` | Hours |
2077 +----------------+-----------------------+
2078 | ``'D'`` | Days |
2079 +----------------+-----------------------+
2080 | ``'W'`` | Week day (0=Monday) |
2081 +----------------+-----------------------+
2082 | ``'midnight'`` | Roll over at midnight |
2083 +----------------+-----------------------+
Georg Brandl8ec7f652007-08-15 14:28:01 +00002084
Georg Brandle6dab2a2008-03-02 14:15:04 +00002085 The system will save old log files by appending extensions to the filename.
2086 The extensions are date-and-time based, using the strftime format
Vinay Sajip89a01cd2008-04-02 21:17:25 +00002087 ``%Y-%m-%d_%H-%M-%S`` or a leading portion thereof, depending on the
Vinay Sajip2a649f92008-07-18 09:00:35 +00002088 rollover interval.
Vinay Sajipecfa08f2010-03-12 09:16:10 +00002089
2090 When computing the next rollover time for the first time (when the handler
2091 is created), the last modification time of an existing log file, or else
2092 the current time, is used to compute when the next rotation will occur.
2093
Georg Brandld77554f2008-06-06 07:34:50 +00002094 If the *utc* argument is true, times in UTC will be used; otherwise
Andrew M. Kuchling6dd8cca2008-06-05 23:33:54 +00002095 local time is used.
2096
2097 If *backupCount* is nonzero, at most *backupCount* files
Vinay Sajip89a01cd2008-04-02 21:17:25 +00002098 will be kept, and if more would be created when rollover occurs, the oldest
2099 one is deleted. The deletion logic uses the interval to determine which
2100 files to delete, so changing the interval may leave old files lying around.
Georg Brandl8ec7f652007-08-15 14:28:01 +00002101
Vinay Sajip59584c42009-08-14 11:33:54 +00002102 If *delay* is true, then file opening is deferred until the first call to
2103 :meth:`emit`.
2104
2105 .. versionchanged:: 2.6
2106 *delay* was added.
Georg Brandl8ec7f652007-08-15 14:28:01 +00002107
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002108 .. method:: doRollover()
Georg Brandl8ec7f652007-08-15 14:28:01 +00002109
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002110 Does a rollover, as described above.
Georg Brandl8ec7f652007-08-15 14:28:01 +00002111
2112
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002113 .. method:: emit(record)
Georg Brandl8ec7f652007-08-15 14:28:01 +00002114
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002115 Outputs the record to the file, catering for rollover as described above.
Georg Brandl8ec7f652007-08-15 14:28:01 +00002116
2117
Vinay Sajip4b782332009-01-19 06:49:19 +00002118.. _socket-handler:
2119
Georg Brandl8ec7f652007-08-15 14:28:01 +00002120SocketHandler
2121^^^^^^^^^^^^^
2122
2123The :class:`SocketHandler` class, located in the :mod:`logging.handlers` module,
2124sends logging output to a network socket. The base class uses a TCP socket.
2125
2126
2127.. class:: SocketHandler(host, port)
2128
2129 Returns a new instance of the :class:`SocketHandler` class intended to
2130 communicate with a remote machine whose address is given by *host* and *port*.
2131
2132
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002133 .. method:: close()
Georg Brandl8ec7f652007-08-15 14:28:01 +00002134
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002135 Closes the socket.
Georg Brandl8ec7f652007-08-15 14:28:01 +00002136
2137
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002138 .. method:: emit()
Georg Brandl8ec7f652007-08-15 14:28:01 +00002139
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002140 Pickles the record's attribute dictionary and writes it to the socket in
2141 binary format. If there is an error with the socket, silently drops the
2142 packet. If the connection was previously lost, re-establishes the
2143 connection. To unpickle the record at the receiving end into a
2144 :class:`LogRecord`, use the :func:`makeLogRecord` function.
Georg Brandl8ec7f652007-08-15 14:28:01 +00002145
2146
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002147 .. method:: handleError()
Georg Brandl8ec7f652007-08-15 14:28:01 +00002148
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002149 Handles an error which has occurred during :meth:`emit`. The most likely
2150 cause is a lost connection. Closes the socket so that we can retry on the
2151 next event.
Georg Brandl8ec7f652007-08-15 14:28:01 +00002152
2153
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002154 .. method:: makeSocket()
Georg Brandl8ec7f652007-08-15 14:28:01 +00002155
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002156 This is a factory method which allows subclasses to define the precise
2157 type of socket they want. The default implementation creates a TCP socket
2158 (:const:`socket.SOCK_STREAM`).
Georg Brandl8ec7f652007-08-15 14:28:01 +00002159
2160
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002161 .. method:: makePickle(record)
Georg Brandl8ec7f652007-08-15 14:28:01 +00002162
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002163 Pickles the record's attribute dictionary in binary format with a length
2164 prefix, and returns it ready for transmission across the socket.
Georg Brandl8ec7f652007-08-15 14:28:01 +00002165
Vinay Sajip86aa9052010-06-29 15:13:14 +00002166 Note that pickles aren't completely secure. If you are concerned about
2167 security, you may want to override this method to implement a more secure
2168 mechanism. For example, you can sign pickles using HMAC and then verify
2169 them on the receiving end, or alternatively you can disable unpickling of
2170 global objects on the receiving end.
Georg Brandl8ec7f652007-08-15 14:28:01 +00002171
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002172 .. method:: send(packet)
Georg Brandl8ec7f652007-08-15 14:28:01 +00002173
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002174 Send a pickled string *packet* to the socket. This function allows for
2175 partial sends which can happen when the network is busy.
Georg Brandl8ec7f652007-08-15 14:28:01 +00002176
2177
Vinay Sajip4b782332009-01-19 06:49:19 +00002178.. _datagram-handler:
2179
Georg Brandl8ec7f652007-08-15 14:28:01 +00002180DatagramHandler
2181^^^^^^^^^^^^^^^
2182
2183The :class:`DatagramHandler` class, located in the :mod:`logging.handlers`
2184module, inherits from :class:`SocketHandler` to support sending logging messages
2185over UDP sockets.
2186
2187
2188.. class:: DatagramHandler(host, port)
2189
2190 Returns a new instance of the :class:`DatagramHandler` class intended to
2191 communicate with a remote machine whose address is given by *host* and *port*.
2192
2193
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002194 .. method:: emit()
Georg Brandl8ec7f652007-08-15 14:28:01 +00002195
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002196 Pickles the record's attribute dictionary and writes it to the socket in
2197 binary format. If there is an error with the socket, silently drops the
2198 packet. To unpickle the record at the receiving end into a
2199 :class:`LogRecord`, use the :func:`makeLogRecord` function.
Georg Brandl8ec7f652007-08-15 14:28:01 +00002200
2201
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002202 .. method:: makeSocket()
Georg Brandl8ec7f652007-08-15 14:28:01 +00002203
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002204 The factory method of :class:`SocketHandler` is here overridden to create
2205 a UDP socket (:const:`socket.SOCK_DGRAM`).
Georg Brandl8ec7f652007-08-15 14:28:01 +00002206
2207
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002208 .. method:: send(s)
Georg Brandl8ec7f652007-08-15 14:28:01 +00002209
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002210 Send a pickled string to a socket.
Georg Brandl8ec7f652007-08-15 14:28:01 +00002211
2212
Vinay Sajip4b782332009-01-19 06:49:19 +00002213.. _syslog-handler:
2214
Georg Brandl8ec7f652007-08-15 14:28:01 +00002215SysLogHandler
2216^^^^^^^^^^^^^
2217
2218The :class:`SysLogHandler` class, located in the :mod:`logging.handlers` module,
2219supports sending logging messages to a remote or local Unix syslog.
2220
2221
Vinay Sajip1c77b7f2009-10-10 20:32:36 +00002222.. class:: SysLogHandler([address[, facility[, socktype]]])
Georg Brandl8ec7f652007-08-15 14:28:01 +00002223
2224 Returns a new instance of the :class:`SysLogHandler` class intended to
2225 communicate with a remote Unix machine whose address is given by *address* in
2226 the form of a ``(host, port)`` tuple. If *address* is not specified,
Vinay Sajip1c77b7f2009-10-10 20:32:36 +00002227 ``('localhost', 514)`` is used. The address is used to open a socket. An
Georg Brandl8ec7f652007-08-15 14:28:01 +00002228 alternative to providing a ``(host, port)`` tuple is providing an address as a
2229 string, for example "/dev/log". In this case, a Unix domain socket is used to
2230 send the message to the syslog. If *facility* is not specified,
Vinay Sajip1c77b7f2009-10-10 20:32:36 +00002231 :const:`LOG_USER` is used. The type of socket opened depends on the
2232 *socktype* argument, which defaults to :const:`socket.SOCK_DGRAM` and thus
2233 opens a UDP socket. To open a TCP socket (for use with the newer syslog
2234 daemons such as rsyslog), specify a value of :const:`socket.SOCK_STREAM`.
2235
2236 .. versionchanged:: 2.7
2237 *socktype* was added.
Georg Brandl8ec7f652007-08-15 14:28:01 +00002238
2239
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002240 .. method:: close()
Georg Brandl8ec7f652007-08-15 14:28:01 +00002241
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002242 Closes the socket to the remote host.
Georg Brandl8ec7f652007-08-15 14:28:01 +00002243
2244
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002245 .. method:: emit(record)
Georg Brandl8ec7f652007-08-15 14:28:01 +00002246
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002247 The record is formatted, and then sent to the syslog server. If exception
2248 information is present, it is *not* sent to the server.
Georg Brandl8ec7f652007-08-15 14:28:01 +00002249
2250
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002251 .. method:: encodePriority(facility, priority)
Georg Brandl8ec7f652007-08-15 14:28:01 +00002252
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002253 Encodes the facility and priority into an integer. You can pass in strings
2254 or integers - if strings are passed, internal mapping dictionaries are
2255 used to convert them to integers.
Georg Brandl8ec7f652007-08-15 14:28:01 +00002256
Vinay Sajipa3c39c02010-03-24 15:10:40 +00002257 The symbolic ``LOG_`` values are defined in :class:`SysLogHandler` and
2258 mirror the values defined in the ``sys/syslog.h`` header file.
Vinay Sajipb0623d62010-03-24 14:31:21 +00002259
Georg Brandld3bab6a2010-04-02 09:03:18 +00002260 **Priorities**
2261
Vinay Sajipb0623d62010-03-24 14:31:21 +00002262 +--------------------------+---------------+
2263 | Name (string) | Symbolic value|
2264 +==========================+===============+
2265 | ``alert`` | LOG_ALERT |
2266 +--------------------------+---------------+
2267 | ``crit`` or ``critical`` | LOG_CRIT |
2268 +--------------------------+---------------+
2269 | ``debug`` | LOG_DEBUG |
2270 +--------------------------+---------------+
2271 | ``emerg`` or ``panic`` | LOG_EMERG |
2272 +--------------------------+---------------+
2273 | ``err`` or ``error`` | LOG_ERR |
2274 +--------------------------+---------------+
2275 | ``info`` | LOG_INFO |
2276 +--------------------------+---------------+
2277 | ``notice`` | LOG_NOTICE |
2278 +--------------------------+---------------+
2279 | ``warn`` or ``warning`` | LOG_WARNING |
2280 +--------------------------+---------------+
2281
Georg Brandld3bab6a2010-04-02 09:03:18 +00002282 **Facilities**
2283
Vinay Sajipb0623d62010-03-24 14:31:21 +00002284 +---------------+---------------+
2285 | Name (string) | Symbolic value|
2286 +===============+===============+
2287 | ``auth`` | LOG_AUTH |
2288 +---------------+---------------+
2289 | ``authpriv`` | LOG_AUTHPRIV |
2290 +---------------+---------------+
2291 | ``cron`` | LOG_CRON |
2292 +---------------+---------------+
2293 | ``daemon`` | LOG_DAEMON |
2294 +---------------+---------------+
2295 | ``ftp`` | LOG_FTP |
2296 +---------------+---------------+
2297 | ``kern`` | LOG_KERN |
2298 +---------------+---------------+
2299 | ``lpr`` | LOG_LPR |
2300 +---------------+---------------+
2301 | ``mail`` | LOG_MAIL |
2302 +---------------+---------------+
2303 | ``news`` | LOG_NEWS |
2304 +---------------+---------------+
2305 | ``syslog`` | LOG_SYSLOG |
2306 +---------------+---------------+
2307 | ``user`` | LOG_USER |
2308 +---------------+---------------+
2309 | ``uucp`` | LOG_UUCP |
2310 +---------------+---------------+
2311 | ``local0`` | LOG_LOCAL0 |
2312 +---------------+---------------+
2313 | ``local1`` | LOG_LOCAL1 |
2314 +---------------+---------------+
2315 | ``local2`` | LOG_LOCAL2 |
2316 +---------------+---------------+
2317 | ``local3`` | LOG_LOCAL3 |
2318 +---------------+---------------+
2319 | ``local4`` | LOG_LOCAL4 |
2320 +---------------+---------------+
2321 | ``local5`` | LOG_LOCAL5 |
2322 +---------------+---------------+
2323 | ``local6`` | LOG_LOCAL6 |
2324 +---------------+---------------+
2325 | ``local7`` | LOG_LOCAL7 |
2326 +---------------+---------------+
2327
Vinay Sajip66d19e22010-03-24 17:36:35 +00002328 .. method:: mapPriority(levelname)
2329
2330 Maps a logging level name to a syslog priority name.
2331 You may need to override this if you are using custom levels, or
2332 if the default algorithm is not suitable for your needs. The
2333 default algorithm maps ``DEBUG``, ``INFO``, ``WARNING``, ``ERROR`` and
2334 ``CRITICAL`` to the equivalent syslog names, and all other level
2335 names to "warning".
Georg Brandl8ec7f652007-08-15 14:28:01 +00002336
Vinay Sajip4b782332009-01-19 06:49:19 +00002337.. _nt-eventlog-handler:
2338
Georg Brandl8ec7f652007-08-15 14:28:01 +00002339NTEventLogHandler
2340^^^^^^^^^^^^^^^^^
2341
2342The :class:`NTEventLogHandler` class, located in the :mod:`logging.handlers`
2343module, supports sending logging messages to a local Windows NT, Windows 2000 or
2344Windows XP event log. Before you can use it, you need Mark Hammond's Win32
2345extensions for Python installed.
2346
2347
2348.. class:: NTEventLogHandler(appname[, dllname[, logtype]])
2349
2350 Returns a new instance of the :class:`NTEventLogHandler` class. The *appname* is
2351 used to define the application name as it appears in the event log. An
2352 appropriate registry entry is created using this name. The *dllname* should give
2353 the fully qualified pathname of a .dll or .exe which contains message
2354 definitions to hold in the log (if not specified, ``'win32service.pyd'`` is used
2355 - this is installed with the Win32 extensions and contains some basic
2356 placeholder message definitions. Note that use of these placeholders will make
2357 your event logs big, as the entire message source is held in the log. If you
2358 want slimmer logs, you have to pass in the name of your own .dll or .exe which
2359 contains the message definitions you want to use in the event log). The
2360 *logtype* is one of ``'Application'``, ``'System'`` or ``'Security'``, and
2361 defaults to ``'Application'``.
2362
2363
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002364 .. method:: close()
Georg Brandl8ec7f652007-08-15 14:28:01 +00002365
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002366 At this point, you can remove the application name from the registry as a
2367 source of event log entries. However, if you do this, you will not be able
2368 to see the events as you intended in the Event Log Viewer - it needs to be
2369 able to access the registry to get the .dll name. The current version does
Vinay Sajipaa5f8732008-09-01 17:44:14 +00002370 not do this.
Georg Brandl8ec7f652007-08-15 14:28:01 +00002371
2372
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002373 .. method:: emit(record)
Georg Brandl8ec7f652007-08-15 14:28:01 +00002374
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002375 Determines the message ID, event category and event type, and then logs
2376 the message in the NT event log.
Georg Brandl8ec7f652007-08-15 14:28:01 +00002377
2378
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002379 .. method:: getEventCategory(record)
Georg Brandl8ec7f652007-08-15 14:28:01 +00002380
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002381 Returns the event category for the record. Override this if you want to
2382 specify your own categories. This version returns 0.
Georg Brandl8ec7f652007-08-15 14:28:01 +00002383
2384
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002385 .. method:: getEventType(record)
Georg Brandl8ec7f652007-08-15 14:28:01 +00002386
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002387 Returns the event type for the record. Override this if you want to
2388 specify your own types. This version does a mapping using the handler's
2389 typemap attribute, which is set up in :meth:`__init__` to a dictionary
2390 which contains mappings for :const:`DEBUG`, :const:`INFO`,
2391 :const:`WARNING`, :const:`ERROR` and :const:`CRITICAL`. If you are using
2392 your own levels, you will either need to override this method or place a
2393 suitable dictionary in the handler's *typemap* attribute.
Georg Brandl8ec7f652007-08-15 14:28:01 +00002394
2395
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002396 .. method:: getMessageID(record)
Georg Brandl8ec7f652007-08-15 14:28:01 +00002397
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002398 Returns the message ID for the record. If you are using your own messages,
2399 you could do this by having the *msg* passed to the logger being an ID
2400 rather than a format string. Then, in here, you could use a dictionary
2401 lookup to get the message ID. This version returns 1, which is the base
2402 message ID in :file:`win32service.pyd`.
Georg Brandl8ec7f652007-08-15 14:28:01 +00002403
Vinay Sajip4b782332009-01-19 06:49:19 +00002404.. _smtp-handler:
Georg Brandl8ec7f652007-08-15 14:28:01 +00002405
2406SMTPHandler
2407^^^^^^^^^^^
2408
2409The :class:`SMTPHandler` class, located in the :mod:`logging.handlers` module,
2410supports sending logging messages to an email address via SMTP.
2411
2412
2413.. class:: SMTPHandler(mailhost, fromaddr, toaddrs, subject[, credentials])
2414
2415 Returns a new instance of the :class:`SMTPHandler` class. The instance is
2416 initialized with the from and to addresses and subject line of the email. The
2417 *toaddrs* should be a list of strings. To specify a non-standard SMTP port, use
2418 the (host, port) tuple format for the *mailhost* argument. If you use a string,
2419 the standard SMTP port is used. If your SMTP server requires authentication, you
2420 can specify a (username, password) tuple for the *credentials* argument.
2421
2422 .. versionchanged:: 2.6
2423 *credentials* was added.
2424
2425
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002426 .. method:: emit(record)
Georg Brandl8ec7f652007-08-15 14:28:01 +00002427
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002428 Formats the record and sends it to the specified addressees.
Georg Brandl8ec7f652007-08-15 14:28:01 +00002429
2430
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002431 .. method:: getSubject(record)
Georg Brandl8ec7f652007-08-15 14:28:01 +00002432
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002433 If you want to specify a subject line which is record-dependent, override
2434 this method.
Georg Brandl8ec7f652007-08-15 14:28:01 +00002435
Vinay Sajip4b782332009-01-19 06:49:19 +00002436.. _memory-handler:
Georg Brandl8ec7f652007-08-15 14:28:01 +00002437
2438MemoryHandler
2439^^^^^^^^^^^^^
2440
2441The :class:`MemoryHandler` class, located in the :mod:`logging.handlers` module,
2442supports buffering of logging records in memory, periodically flushing them to a
2443:dfn:`target` handler. Flushing occurs whenever the buffer is full, or when an
2444event of a certain severity or greater is seen.
2445
2446:class:`MemoryHandler` is a subclass of the more general
2447:class:`BufferingHandler`, which is an abstract class. This buffers logging
2448records in memory. Whenever each record is added to the buffer, a check is made
2449by calling :meth:`shouldFlush` to see if the buffer should be flushed. If it
2450should, then :meth:`flush` is expected to do the needful.
2451
2452
2453.. class:: BufferingHandler(capacity)
2454
2455 Initializes the handler with a buffer of the specified capacity.
2456
2457
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002458 .. method:: emit(record)
Georg Brandl8ec7f652007-08-15 14:28:01 +00002459
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002460 Appends the record to the buffer. If :meth:`shouldFlush` returns true,
2461 calls :meth:`flush` to process the buffer.
Georg Brandl8ec7f652007-08-15 14:28:01 +00002462
2463
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002464 .. method:: flush()
Georg Brandl8ec7f652007-08-15 14:28:01 +00002465
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002466 You can override this to implement custom flushing behavior. This version
2467 just zaps the buffer to empty.
Georg Brandl8ec7f652007-08-15 14:28:01 +00002468
2469
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002470 .. method:: shouldFlush(record)
Georg Brandl8ec7f652007-08-15 14:28:01 +00002471
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002472 Returns true if the buffer is up to capacity. This method can be
2473 overridden to implement custom flushing strategies.
Georg Brandl8ec7f652007-08-15 14:28:01 +00002474
2475
2476.. class:: MemoryHandler(capacity[, flushLevel [, target]])
2477
2478 Returns a new instance of the :class:`MemoryHandler` class. The instance is
2479 initialized with a buffer size of *capacity*. If *flushLevel* is not specified,
2480 :const:`ERROR` is used. If no *target* is specified, the target will need to be
2481 set using :meth:`setTarget` before this handler does anything useful.
2482
2483
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002484 .. method:: close()
Georg Brandl8ec7f652007-08-15 14:28:01 +00002485
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002486 Calls :meth:`flush`, sets the target to :const:`None` and clears the
2487 buffer.
Georg Brandl8ec7f652007-08-15 14:28:01 +00002488
2489
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002490 .. method:: flush()
Georg Brandl8ec7f652007-08-15 14:28:01 +00002491
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002492 For a :class:`MemoryHandler`, flushing means just sending the buffered
2493 records to the target, if there is one. Override if you want different
2494 behavior.
Georg Brandl8ec7f652007-08-15 14:28:01 +00002495
2496
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002497 .. method:: setTarget(target)
Georg Brandl8ec7f652007-08-15 14:28:01 +00002498
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002499 Sets the target handler for this handler.
Georg Brandl8ec7f652007-08-15 14:28:01 +00002500
2501
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002502 .. method:: shouldFlush(record)
Georg Brandl8ec7f652007-08-15 14:28:01 +00002503
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002504 Checks for buffer full or a record at the *flushLevel* or higher.
Georg Brandl8ec7f652007-08-15 14:28:01 +00002505
2506
Vinay Sajip4b782332009-01-19 06:49:19 +00002507.. _http-handler:
2508
Georg Brandl8ec7f652007-08-15 14:28:01 +00002509HTTPHandler
2510^^^^^^^^^^^
2511
2512The :class:`HTTPHandler` class, located in the :mod:`logging.handlers` module,
2513supports sending logging messages to a Web server, using either ``GET`` or
2514``POST`` semantics.
2515
2516
2517.. class:: HTTPHandler(host, url[, method])
2518
2519 Returns a new instance of the :class:`HTTPHandler` class. The instance is
2520 initialized with a host address, url and HTTP method. The *host* can be of the
2521 form ``host:port``, should you need to use a specific port number. If no
2522 *method* is specified, ``GET`` is used.
2523
2524
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002525 .. method:: emit(record)
Georg Brandl8ec7f652007-08-15 14:28:01 +00002526
Senthil Kumaranbd13f452010-08-09 20:14:11 +00002527 Sends the record to the Web server as a percent-encoded dictionary.
Georg Brandl8ec7f652007-08-15 14:28:01 +00002528
2529
Vinay Sajip4b782332009-01-19 06:49:19 +00002530.. _formatter:
Georg Brandlc37f2882007-12-04 17:46:27 +00002531
Georg Brandl8ec7f652007-08-15 14:28:01 +00002532Formatter Objects
2533-----------------
2534
Georg Brandl430effb2009-01-01 13:05:13 +00002535.. currentmodule:: logging
2536
Georg Brandl8ec7f652007-08-15 14:28:01 +00002537:class:`Formatter`\ s have the following attributes and methods. They are
2538responsible for converting a :class:`LogRecord` to (usually) a string which can
2539be interpreted by either a human or an external system. The base
2540:class:`Formatter` allows a formatting string to be specified. If none is
2541supplied, the default value of ``'%(message)s'`` is used.
2542
2543A Formatter can be initialized with a format string which makes use of knowledge
2544of the :class:`LogRecord` attributes - such as the default value mentioned above
2545making use of the fact that the user's message and arguments are pre-formatted
2546into a :class:`LogRecord`'s *message* attribute. This format string contains
Ezio Melotti062d2b52009-12-19 22:41:49 +00002547standard Python %-style mapping keys. See section :ref:`string-formatting`
Georg Brandl8ec7f652007-08-15 14:28:01 +00002548for more information on string formatting.
2549
2550Currently, the useful mapping keys in a :class:`LogRecord` are:
2551
2552+-------------------------+-----------------------------------------------+
2553| Format | Description |
2554+=========================+===============================================+
2555| ``%(name)s`` | Name of the logger (logging channel). |
2556+-------------------------+-----------------------------------------------+
2557| ``%(levelno)s`` | Numeric logging level for the message |
2558| | (:const:`DEBUG`, :const:`INFO`, |
2559| | :const:`WARNING`, :const:`ERROR`, |
2560| | :const:`CRITICAL`). |
2561+-------------------------+-----------------------------------------------+
2562| ``%(levelname)s`` | Text logging level for the message |
2563| | (``'DEBUG'``, ``'INFO'``, ``'WARNING'``, |
2564| | ``'ERROR'``, ``'CRITICAL'``). |
2565+-------------------------+-----------------------------------------------+
2566| ``%(pathname)s`` | Full pathname of the source file where the |
2567| | logging call was issued (if available). |
2568+-------------------------+-----------------------------------------------+
2569| ``%(filename)s`` | Filename portion of pathname. |
2570+-------------------------+-----------------------------------------------+
2571| ``%(module)s`` | Module (name portion of filename). |
2572+-------------------------+-----------------------------------------------+
2573| ``%(funcName)s`` | Name of function containing the logging call. |
2574+-------------------------+-----------------------------------------------+
2575| ``%(lineno)d`` | Source line number where the logging call was |
2576| | issued (if available). |
2577+-------------------------+-----------------------------------------------+
2578| ``%(created)f`` | Time when the :class:`LogRecord` was created |
2579| | (as returned by :func:`time.time`). |
2580+-------------------------+-----------------------------------------------+
2581| ``%(relativeCreated)d`` | Time in milliseconds when the LogRecord was |
2582| | created, relative to the time the logging |
2583| | module was loaded. |
2584+-------------------------+-----------------------------------------------+
2585| ``%(asctime)s`` | Human-readable time when the |
2586| | :class:`LogRecord` was created. By default |
2587| | this is of the form "2003-07-08 16:49:45,896" |
2588| | (the numbers after the comma are millisecond |
2589| | portion of the time). |
2590+-------------------------+-----------------------------------------------+
2591| ``%(msecs)d`` | Millisecond portion of the time when the |
2592| | :class:`LogRecord` was created. |
2593+-------------------------+-----------------------------------------------+
2594| ``%(thread)d`` | Thread ID (if available). |
2595+-------------------------+-----------------------------------------------+
2596| ``%(threadName)s`` | Thread name (if available). |
2597+-------------------------+-----------------------------------------------+
2598| ``%(process)d`` | Process ID (if available). |
2599+-------------------------+-----------------------------------------------+
Vinay Sajipfe08e6f2010-09-11 10:25:28 +00002600| ``%(processName)s`` | Process name (if available). |
2601+-------------------------+-----------------------------------------------+
Georg Brandl8ec7f652007-08-15 14:28:01 +00002602| ``%(message)s`` | The logged message, computed as ``msg % |
2603| | args``. |
2604+-------------------------+-----------------------------------------------+
2605
2606.. versionchanged:: 2.5
2607 *funcName* was added.
2608
2609
2610.. class:: Formatter([fmt[, datefmt]])
2611
2612 Returns a new instance of the :class:`Formatter` class. The instance is
Vinay Sajipfe08e6f2010-09-11 10:25:28 +00002613 initialized with a format string for the message as a whole, as well as a
2614 format string for the date/time portion of a message. If no *fmt* is
2615 specified, ``'%(message)s'`` is used. If no *datefmt* is specified, the
2616 ISO8601 date format is used.
Georg Brandl8ec7f652007-08-15 14:28:01 +00002617
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002618 .. method:: format(record)
Georg Brandl8ec7f652007-08-15 14:28:01 +00002619
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002620 The record's attribute dictionary is used as the operand to a string
2621 formatting operation. Returns the resulting string. Before formatting the
2622 dictionary, a couple of preparatory steps are carried out. The *message*
2623 attribute of the record is computed using *msg* % *args*. If the
2624 formatting string contains ``'(asctime)'``, :meth:`formatTime` is called
2625 to format the event time. If there is exception information, it is
2626 formatted using :meth:`formatException` and appended to the message. Note
2627 that the formatted exception information is cached in attribute
2628 *exc_text*. This is useful because the exception information can be
2629 pickled and sent across the wire, but you should be careful if you have
2630 more than one :class:`Formatter` subclass which customizes the formatting
2631 of exception information. In this case, you will have to clear the cached
2632 value after a formatter has done its formatting, so that the next
2633 formatter to handle the event doesn't use the cached value but
2634 recalculates it afresh.
Georg Brandl8ec7f652007-08-15 14:28:01 +00002635
2636
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002637 .. method:: formatTime(record[, datefmt])
Georg Brandl8ec7f652007-08-15 14:28:01 +00002638
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002639 This method should be called from :meth:`format` by a formatter which
2640 wants to make use of a formatted time. This method can be overridden in
2641 formatters to provide for any specific requirement, but the basic behavior
2642 is as follows: if *datefmt* (a string) is specified, it is used with
2643 :func:`time.strftime` to format the creation time of the
2644 record. Otherwise, the ISO8601 format is used. The resulting string is
2645 returned.
Georg Brandl8ec7f652007-08-15 14:28:01 +00002646
2647
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002648 .. method:: formatException(exc_info)
Georg Brandl8ec7f652007-08-15 14:28:01 +00002649
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002650 Formats the specified exception information (a standard exception tuple as
2651 returned by :func:`sys.exc_info`) as a string. This default implementation
2652 just uses :func:`traceback.print_exception`. The resulting string is
2653 returned.
Georg Brandl8ec7f652007-08-15 14:28:01 +00002654
Vinay Sajip4b782332009-01-19 06:49:19 +00002655.. _filter:
Georg Brandl8ec7f652007-08-15 14:28:01 +00002656
2657Filter Objects
2658--------------
2659
Vinay Sajip4b782332009-01-19 06:49:19 +00002660Filters can be used by :class:`Handler`\ s and :class:`Logger`\ s for
Georg Brandl8ec7f652007-08-15 14:28:01 +00002661more sophisticated filtering than is provided by levels. The base filter class
2662only allows events which are below a certain point in the logger hierarchy. For
2663example, a filter initialized with "A.B" will allow events logged by loggers
2664"A.B", "A.B.C", "A.B.C.D", "A.B.D" etc. but not "A.BB", "B.A.B" etc. If
2665initialized with the empty string, all events are passed.
2666
2667
2668.. class:: Filter([name])
2669
2670 Returns an instance of the :class:`Filter` class. If *name* is specified, it
2671 names a logger which, together with its children, will have its events allowed
Vinay Sajipfe08e6f2010-09-11 10:25:28 +00002672 through the filter. If *name* is the empty string, allows every event.
Georg Brandl8ec7f652007-08-15 14:28:01 +00002673
2674
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002675 .. method:: filter(record)
Georg Brandl8ec7f652007-08-15 14:28:01 +00002676
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002677 Is the specified record to be logged? Returns zero for no, nonzero for
2678 yes. If deemed appropriate, the record may be modified in-place by this
2679 method.
Georg Brandl8ec7f652007-08-15 14:28:01 +00002680
Vinay Sajip3478ac02010-08-19 19:17:41 +00002681Note that filters attached to handlers are consulted whenever an event is
2682emitted by the handler, whereas filters attached to loggers are consulted
2683whenever an event is logged to the handler (using :meth:`debug`, :meth:`info`,
2684etc.) This means that events which have been generated by descendant loggers
2685will not be filtered by a logger's filter setting, unless the filter has also
2686been applied to those descendant loggers.
2687
Vinay Sajip4b782332009-01-19 06:49:19 +00002688.. _log-record:
Georg Brandl8ec7f652007-08-15 14:28:01 +00002689
2690LogRecord Objects
2691-----------------
2692
Vinay Sajipfe08e6f2010-09-11 10:25:28 +00002693:class:`LogRecord` instances are created automatically by the :class:`Logger`
2694every time something is logged, and can be created manually via
2695:func:`makeLogRecord` (for example, from a pickled event received over the
2696wire).
Georg Brandl8ec7f652007-08-15 14:28:01 +00002697
2698
Vinay Sajipfe08e6f2010-09-11 10:25:28 +00002699.. class::
2700 LogRecord(name, lvl, pathname, lineno, msg, args, exc_info [, func=None])
Georg Brandl8ec7f652007-08-15 14:28:01 +00002701
Vinay Sajipfe08e6f2010-09-11 10:25:28 +00002702 Contains all the information pertinent to the event being logged.
Georg Brandl8ec7f652007-08-15 14:28:01 +00002703
Vinay Sajipfe08e6f2010-09-11 10:25:28 +00002704 The primary information is passed in :attr:`msg` and :attr:`args`, which
2705 are combined using ``msg % args`` to create the :attr:`message` field of the
2706 record.
Georg Brandl8ec7f652007-08-15 14:28:01 +00002707
Vinay Sajipfe08e6f2010-09-11 10:25:28 +00002708 .. attribute:: args
2709
2710 Tuple of arguments to be used in formatting :attr:`msg`.
2711
2712 .. attribute:: exc_info
2713
2714 Exception tuple (à la `sys.exc_info`) or `None` if no exception
2715 information is availble.
2716
2717 .. attribute:: func
2718
2719 Name of the function of origin (i.e. in which the logging call was made).
2720
2721 .. attribute:: lineno
2722
2723 Line number in the source file of origin.
2724
2725 .. attribute:: lvl
2726
2727 Numeric logging level.
2728
2729 .. attribute:: message
2730
2731 Bound to the result of :meth:`getMessage` when
2732 :meth:`Formatter.format(record)<Formatter.format>` is invoked.
2733
2734 .. attribute:: msg
2735
2736 User-supplied :ref:`format string<string-formatting>` or arbitrary object
2737 (see :ref:`arbitrary-object-messages`) used in :meth:`getMessage`.
2738
2739 .. attribute:: name
2740
2741 Name of the logger that emitted the record.
2742
2743 .. attribute:: pathname
2744
2745 Absolute pathname of the source file of origin.
Georg Brandl8ec7f652007-08-15 14:28:01 +00002746
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002747 .. method:: getMessage()
Georg Brandl8ec7f652007-08-15 14:28:01 +00002748
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002749 Returns the message for this :class:`LogRecord` instance after merging any
Vinay Sajipfe08e6f2010-09-11 10:25:28 +00002750 user-supplied arguments with the message. If the user-supplied message
2751 argument to the logging call is not a string, :func:`str` is called on it to
2752 convert it to a string. This allows use of user-defined classes as
2753 messages, whose ``__str__`` method can return the actual format string to
2754 be used.
2755
2756 .. versionchanged:: 2.5
2757 *func* was added.
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002758
Vinay Sajip4b782332009-01-19 06:49:19 +00002759.. _logger-adapter:
Georg Brandl8ec7f652007-08-15 14:28:01 +00002760
Vinay Sajipc7403352008-01-18 15:54:14 +00002761LoggerAdapter Objects
2762---------------------
2763
2764.. versionadded:: 2.6
2765
2766:class:`LoggerAdapter` instances are used to conveniently pass contextual
Vinay Sajip733024a2008-01-21 17:39:22 +00002767information into logging calls. For a usage example , see the section on
2768`adding contextual information to your logging output`__.
2769
2770__ context-info_
Vinay Sajipc7403352008-01-18 15:54:14 +00002771
2772.. class:: LoggerAdapter(logger, extra)
2773
2774 Returns an instance of :class:`LoggerAdapter` initialized with an
2775 underlying :class:`Logger` instance and a dict-like object.
2776
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002777 .. method:: process(msg, kwargs)
Vinay Sajipc7403352008-01-18 15:54:14 +00002778
Benjamin Petersonc7b05922008-04-25 01:29:10 +00002779 Modifies the message and/or keyword arguments passed to a logging call in
2780 order to insert contextual information. This implementation takes the object
2781 passed as *extra* to the constructor and adds it to *kwargs* using key
2782 'extra'. The return value is a (*msg*, *kwargs*) tuple which has the
2783 (possibly modified) versions of the arguments passed in.
Vinay Sajipc7403352008-01-18 15:54:14 +00002784
2785In addition to the above, :class:`LoggerAdapter` supports all the logging
2786methods of :class:`Logger`, i.e. :meth:`debug`, :meth:`info`, :meth:`warning`,
2787:meth:`error`, :meth:`exception`, :meth:`critical` and :meth:`log`. These
2788methods have the same signatures as their counterparts in :class:`Logger`, so
2789you can use the two types of instances interchangeably.
2790
Vinay Sajip804899b2010-03-22 15:29:01 +00002791.. versionchanged:: 2.7
2792
2793The :meth:`isEnabledFor` method was added to :class:`LoggerAdapter`. This method
2794delegates to the underlying logger.
2795
Georg Brandl8ec7f652007-08-15 14:28:01 +00002796
2797Thread Safety
2798-------------
2799
2800The logging module is intended to be thread-safe without any special work
2801needing to be done by its clients. It achieves this though using threading
2802locks; there is one lock to serialize access to the module's shared data, and
2803each handler also creates a lock to serialize access to its underlying I/O.
2804
Vinay Sajip353a85f2009-04-03 21:58:16 +00002805If you are implementing asynchronous signal handlers using the :mod:`signal`
2806module, you may not be able to use logging from within such handlers. This is
2807because lock implementations in the :mod:`threading` module are not always
2808re-entrant, and so cannot be invoked from such signal handlers.
Georg Brandl8ec7f652007-08-15 14:28:01 +00002809
Vinay Sajip61afd262010-02-19 23:53:17 +00002810
2811Integration with the warnings module
2812------------------------------------
2813
2814The :func:`captureWarnings` function can be used to integrate :mod:`logging`
2815with the :mod:`warnings` module.
2816
2817.. function:: captureWarnings(capture)
2818
2819 This function is used to turn the capture of warnings by logging on and
2820 off.
2821
Georg Brandlf6d367452010-03-12 10:02:03 +00002822 If *capture* is ``True``, warnings issued by the :mod:`warnings` module
Vinay Sajip61afd262010-02-19 23:53:17 +00002823 will be redirected to the logging system. Specifically, a warning will be
2824 formatted using :func:`warnings.formatwarning` and the resulting string
Georg Brandlf6d367452010-03-12 10:02:03 +00002825 logged to a logger named "py.warnings" with a severity of ``WARNING``.
Vinay Sajip61afd262010-02-19 23:53:17 +00002826
Georg Brandlf6d367452010-03-12 10:02:03 +00002827 If *capture* is ``False``, the redirection of warnings to the logging system
Vinay Sajip61afd262010-02-19 23:53:17 +00002828 will stop, and warnings will be redirected to their original destinations
Georg Brandlf6d367452010-03-12 10:02:03 +00002829 (i.e. those in effect before ``captureWarnings(True)`` was called).
Vinay Sajip61afd262010-02-19 23:53:17 +00002830
2831
Georg Brandl8ec7f652007-08-15 14:28:01 +00002832Configuration
2833-------------
2834
2835
2836.. _logging-config-api:
2837
2838Configuration functions
2839^^^^^^^^^^^^^^^^^^^^^^^
2840
Georg Brandl8ec7f652007-08-15 14:28:01 +00002841The following functions configure the logging module. They are located in the
2842:mod:`logging.config` module. Their use is optional --- you can configure the
2843logging module using these functions or by making calls to the main API (defined
2844in :mod:`logging` itself) and defining handlers which are declared either in
2845:mod:`logging` or :mod:`logging.handlers`.
2846
Andrew M. Kuchlingf09bc662010-05-12 18:56:48 +00002847.. function:: dictConfig(config)
2848
2849 Takes the logging configuration from a dictionary. The contents of
2850 this dictionary are described in :ref:`logging-config-dictschema`
2851 below.
2852
2853 If an error is encountered during configuration, this function will
2854 raise a :exc:`ValueError`, :exc:`TypeError`, :exc:`AttributeError`
2855 or :exc:`ImportError` with a suitably descriptive message. The
2856 following is a (possibly incomplete) list of conditions which will
2857 raise an error:
2858
2859 * A ``level`` which is not a string or which is a string not
2860 corresponding to an actual logging level.
2861 * A ``propagate`` value which is not a boolean.
2862 * An id which does not have a corresponding destination.
2863 * A non-existent handler id found during an incremental call.
2864 * An invalid logger name.
2865 * Inability to resolve to an internal or external object.
2866
2867 Parsing is performed by the :class:`DictConfigurator` class, whose
2868 constructor is passed the dictionary used for configuration, and
2869 has a :meth:`configure` method. The :mod:`logging.config` module
2870 has a callable attribute :attr:`dictConfigClass`
2871 which is initially set to :class:`DictConfigurator`.
2872 You can replace the value of :attr:`dictConfigClass` with a
2873 suitable implementation of your own.
2874
2875 :func:`dictConfig` calls :attr:`dictConfigClass` passing
2876 the specified dictionary, and then calls the :meth:`configure` method on
2877 the returned object to put the configuration into effect::
2878
2879 def dictConfig(config):
2880 dictConfigClass(config).configure()
2881
2882 For example, a subclass of :class:`DictConfigurator` could call
2883 ``DictConfigurator.__init__()`` in its own :meth:`__init__()`, then
2884 set up custom prefixes which would be usable in the subsequent
2885 :meth:`configure` call. :attr:`dictConfigClass` would be bound to
2886 this new subclass, and then :func:`dictConfig` could be called exactly as
2887 in the default, uncustomized state.
Georg Brandl8ec7f652007-08-15 14:28:01 +00002888
2889.. function:: fileConfig(fname[, defaults])
2890
Vinay Sajip51104862009-01-02 18:53:04 +00002891 Reads the logging configuration from a :mod:`ConfigParser`\-format file named
2892 *fname*. This function can be called several times from an application,
Andrew M. Kuchlingf09bc662010-05-12 18:56:48 +00002893 allowing an end user to select from various pre-canned
Vinay Sajip51104862009-01-02 18:53:04 +00002894 configurations (if the developer provides a mechanism to present the choices
2895 and load the chosen configuration). Defaults to be passed to the ConfigParser
2896 can be specified in the *defaults* argument.
Georg Brandl8ec7f652007-08-15 14:28:01 +00002897
Georg Brandl8ec7f652007-08-15 14:28:01 +00002898.. function:: listen([port])
2899
2900 Starts up a socket server on the specified port, and listens for new
2901 configurations. If no port is specified, the module's default
2902 :const:`DEFAULT_LOGGING_CONFIG_PORT` is used. Logging configurations will be
2903 sent as a file suitable for processing by :func:`fileConfig`. Returns a
2904 :class:`Thread` instance on which you can call :meth:`start` to start the
2905 server, and which you can :meth:`join` when appropriate. To stop the server,
Georg Brandlc37f2882007-12-04 17:46:27 +00002906 call :func:`stopListening`.
2907
2908 To send a configuration to the socket, read in the configuration file and
2909 send it to the socket as a string of bytes preceded by a four-byte length
2910 string packed in binary using ``struct.pack('>L', n)``.
Georg Brandl8ec7f652007-08-15 14:28:01 +00002911
2912
2913.. function:: stopListening()
2914
Georg Brandlc37f2882007-12-04 17:46:27 +00002915 Stops the listening server which was created with a call to :func:`listen`.
2916 This is typically called before calling :meth:`join` on the return value from
Georg Brandl8ec7f652007-08-15 14:28:01 +00002917 :func:`listen`.
2918
2919
Andrew M. Kuchlingf09bc662010-05-12 18:56:48 +00002920.. _logging-config-dictschema:
2921
2922Configuration dictionary schema
2923^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2924
2925Describing a logging configuration requires listing the various
2926objects to create and the connections between them; for example, you
2927may create a handler named "console" and then say that the logger
2928named "startup" will send its messages to the "console" handler.
2929These objects aren't limited to those provided by the :mod:`logging`
2930module because you might write your own formatter or handler class.
2931The parameters to these classes may also need to include external
2932objects such as ``sys.stderr``. The syntax for describing these
2933objects and connections is defined in :ref:`logging-config-dict-connections`
2934below.
2935
2936Dictionary Schema Details
2937"""""""""""""""""""""""""
2938
2939The dictionary passed to :func:`dictConfig` must contain the following
2940keys:
2941
2942* `version` - to be set to an integer value representing the schema
2943 version. The only valid value at present is 1, but having this key
2944 allows the schema to evolve while still preserving backwards
2945 compatibility.
2946
2947All other keys are optional, but if present they will be interpreted
2948as described below. In all cases below where a 'configuring dict' is
2949mentioned, it will be checked for the special ``'()'`` key to see if a
Andrew M. Kuchling1b553472010-05-16 23:31:16 +00002950custom instantiation is required. If so, the mechanism described in
2951:ref:`logging-config-dict-userdef` below is used to create an instance;
2952otherwise, the context is used to determine what to instantiate.
Andrew M. Kuchlingf09bc662010-05-12 18:56:48 +00002953
2954* `formatters` - the corresponding value will be a dict in which each
2955 key is a formatter id and each value is a dict describing how to
2956 configure the corresponding Formatter instance.
2957
2958 The configuring dict is searched for keys ``format`` and ``datefmt``
2959 (with defaults of ``None``) and these are used to construct a
2960 :class:`logging.Formatter` instance.
2961
2962* `filters` - the corresponding value will be a dict in which each key
2963 is a filter id and each value is a dict describing how to configure
2964 the corresponding Filter instance.
2965
2966 The configuring dict is searched for the key ``name`` (defaulting to the
2967 empty string) and this is used to construct a :class:`logging.Filter`
2968 instance.
2969
2970* `handlers` - the corresponding value will be a dict in which each
2971 key is a handler id and each value is a dict describing how to
2972 configure the corresponding Handler instance.
2973
2974 The configuring dict is searched for the following keys:
2975
2976 * ``class`` (mandatory). This is the fully qualified name of the
2977 handler class.
2978
2979 * ``level`` (optional). The level of the handler.
2980
2981 * ``formatter`` (optional). The id of the formatter for this
2982 handler.
2983
2984 * ``filters`` (optional). A list of ids of the filters for this
2985 handler.
2986
2987 All *other* keys are passed through as keyword arguments to the
2988 handler's constructor. For example, given the snippet::
2989
2990 handlers:
2991 console:
2992 class : logging.StreamHandler
2993 formatter: brief
2994 level : INFO
2995 filters: [allow_foo]
2996 stream : ext://sys.stdout
2997 file:
2998 class : logging.handlers.RotatingFileHandler
2999 formatter: precise
3000 filename: logconfig.log
3001 maxBytes: 1024
3002 backupCount: 3
3003
3004 the handler with id ``console`` is instantiated as a
3005 :class:`logging.StreamHandler`, using ``sys.stdout`` as the underlying
3006 stream. The handler with id ``file`` is instantiated as a
3007 :class:`logging.handlers.RotatingFileHandler` with the keyword arguments
3008 ``filename='logconfig.log', maxBytes=1024, backupCount=3``.
3009
3010* `loggers` - the corresponding value will be a dict in which each key
3011 is a logger name and each value is a dict describing how to
3012 configure the corresponding Logger instance.
3013
3014 The configuring dict is searched for the following keys:
3015
3016 * ``level`` (optional). The level of the logger.
3017
3018 * ``propagate`` (optional). The propagation setting of the logger.
3019
3020 * ``filters`` (optional). A list of ids of the filters for this
3021 logger.
3022
3023 * ``handlers`` (optional). A list of ids of the handlers for this
3024 logger.
3025
3026 The specified loggers will be configured according to the level,
3027 propagation, filters and handlers specified.
3028
3029* `root` - this will be the configuration for the root logger.
3030 Processing of the configuration will be as for any logger, except
3031 that the ``propagate`` setting will not be applicable.
3032
3033* `incremental` - whether the configuration is to be interpreted as
3034 incremental to the existing configuration. This value defaults to
3035 ``False``, which means that the specified configuration replaces the
3036 existing configuration with the same semantics as used by the
3037 existing :func:`fileConfig` API.
3038
3039 If the specified value is ``True``, the configuration is processed
3040 as described in the section on :ref:`logging-config-dict-incremental`.
3041
3042* `disable_existing_loggers` - whether any existing loggers are to be
3043 disabled. This setting mirrors the parameter of the same name in
3044 :func:`fileConfig`. If absent, this parameter defaults to ``True``.
3045 This value is ignored if `incremental` is ``True``.
3046
3047.. _logging-config-dict-incremental:
3048
3049Incremental Configuration
3050"""""""""""""""""""""""""
3051
3052It is difficult to provide complete flexibility for incremental
3053configuration. For example, because objects such as filters
3054and formatters are anonymous, once a configuration is set up, it is
3055not possible to refer to such anonymous objects when augmenting a
3056configuration.
3057
3058Furthermore, there is not a compelling case for arbitrarily altering
3059the object graph of loggers, handlers, filters, formatters at
3060run-time, once a configuration is set up; the verbosity of loggers and
3061handlers can be controlled just by setting levels (and, in the case of
3062loggers, propagation flags). Changing the object graph arbitrarily in
3063a safe way is problematic in a multi-threaded environment; while not
3064impossible, the benefits are not worth the complexity it adds to the
3065implementation.
3066
3067Thus, when the ``incremental`` key of a configuration dict is present
3068and is ``True``, the system will completely ignore any ``formatters`` and
3069``filters`` entries, and process only the ``level``
3070settings in the ``handlers`` entries, and the ``level`` and
3071``propagate`` settings in the ``loggers`` and ``root`` entries.
3072
3073Using a value in the configuration dict lets configurations to be sent
3074over the wire as pickled dicts to a socket listener. Thus, the logging
3075verbosity of a long-running application can be altered over time with
3076no need to stop and restart the application.
3077
3078.. _logging-config-dict-connections:
3079
3080Object connections
3081""""""""""""""""""
3082
3083The schema describes a set of logging objects - loggers,
3084handlers, formatters, filters - which are connected to each other in
3085an object graph. Thus, the schema needs to represent connections
3086between the objects. For example, say that, once configured, a
3087particular logger has attached to it a particular handler. For the
3088purposes of this discussion, we can say that the logger represents the
3089source, and the handler the destination, of a connection between the
3090two. Of course in the configured objects this is represented by the
3091logger holding a reference to the handler. In the configuration dict,
3092this is done by giving each destination object an id which identifies
3093it unambiguously, and then using the id in the source object's
3094configuration to indicate that a connection exists between the source
3095and the destination object with that id.
3096
3097So, for example, consider the following YAML snippet::
3098
3099 formatters:
3100 brief:
3101 # configuration for formatter with id 'brief' goes here
3102 precise:
3103 # configuration for formatter with id 'precise' goes here
3104 handlers:
3105 h1: #This is an id
3106 # configuration of handler with id 'h1' goes here
3107 formatter: brief
3108 h2: #This is another id
3109 # configuration of handler with id 'h2' goes here
3110 formatter: precise
3111 loggers:
3112 foo.bar.baz:
3113 # other configuration for logger 'foo.bar.baz'
3114 handlers: [h1, h2]
3115
3116(Note: YAML used here because it's a little more readable than the
3117equivalent Python source form for the dictionary.)
3118
3119The ids for loggers are the logger names which would be used
3120programmatically to obtain a reference to those loggers, e.g.
3121``foo.bar.baz``. The ids for Formatters and Filters can be any string
3122value (such as ``brief``, ``precise`` above) and they are transient,
3123in that they are only meaningful for processing the configuration
3124dictionary and used to determine connections between objects, and are
3125not persisted anywhere when the configuration call is complete.
3126
3127The above snippet indicates that logger named ``foo.bar.baz`` should
3128have two handlers attached to it, which are described by the handler
3129ids ``h1`` and ``h2``. The formatter for ``h1`` is that described by id
3130``brief``, and the formatter for ``h2`` is that described by id
3131``precise``.
3132
3133
3134.. _logging-config-dict-userdef:
3135
3136User-defined objects
3137""""""""""""""""""""
3138
3139The schema supports user-defined objects for handlers, filters and
3140formatters. (Loggers do not need to have different types for
3141different instances, so there is no support in this configuration
3142schema for user-defined logger classes.)
3143
3144Objects to be configured are described by dictionaries
3145which detail their configuration. In some places, the logging system
3146will be able to infer from the context how an object is to be
3147instantiated, but when a user-defined object is to be instantiated,
3148the system will not know how to do this. In order to provide complete
3149flexibility for user-defined object instantiation, the user needs
3150to provide a 'factory' - a callable which is called with a
3151configuration dictionary and which returns the instantiated object.
3152This is signalled by an absolute import path to the factory being
3153made available under the special key ``'()'``. Here's a concrete
3154example::
3155
3156 formatters:
3157 brief:
3158 format: '%(message)s'
3159 default:
3160 format: '%(asctime)s %(levelname)-8s %(name)-15s %(message)s'
3161 datefmt: '%Y-%m-%d %H:%M:%S'
3162 custom:
3163 (): my.package.customFormatterFactory
3164 bar: baz
3165 spam: 99.9
3166 answer: 42
3167
3168The above YAML snippet defines three formatters. The first, with id
3169``brief``, is a standard :class:`logging.Formatter` instance with the
3170specified format string. The second, with id ``default``, has a
3171longer format and also defines the time format explicitly, and will
3172result in a :class:`logging.Formatter` initialized with those two format
3173strings. Shown in Python source form, the ``brief`` and ``default``
3174formatters have configuration sub-dictionaries::
3175
3176 {
3177 'format' : '%(message)s'
3178 }
3179
3180and::
3181
3182 {
3183 'format' : '%(asctime)s %(levelname)-8s %(name)-15s %(message)s',
3184 'datefmt' : '%Y-%m-%d %H:%M:%S'
3185 }
3186
3187respectively, and as these dictionaries do not contain the special key
3188``'()'``, the instantiation is inferred from the context: as a result,
3189standard :class:`logging.Formatter` instances are created. The
3190configuration sub-dictionary for the third formatter, with id
3191``custom``, is::
3192
3193 {
3194 '()' : 'my.package.customFormatterFactory',
3195 'bar' : 'baz',
3196 'spam' : 99.9,
3197 'answer' : 42
3198 }
3199
3200and this contains the special key ``'()'``, which means that
3201user-defined instantiation is wanted. In this case, the specified
3202factory callable will be used. If it is an actual callable it will be
3203used directly - otherwise, if you specify a string (as in the example)
3204the actual callable will be located using normal import mechanisms.
3205The callable will be called with the **remaining** items in the
3206configuration sub-dictionary as keyword arguments. In the above
3207example, the formatter with id ``custom`` will be assumed to be
3208returned by the call::
3209
3210 my.package.customFormatterFactory(bar='baz', spam=99.9, answer=42)
3211
3212The key ``'()'`` has been used as the special key because it is not a
3213valid keyword parameter name, and so will not clash with the names of
3214the keyword arguments used in the call. The ``'()'`` also serves as a
3215mnemonic that the corresponding value is a callable.
3216
3217
3218.. _logging-config-dict-externalobj:
3219
3220Access to external objects
3221""""""""""""""""""""""""""
3222
3223There are times where a configuration needs to refer to objects
3224external to the configuration, for example ``sys.stderr``. If the
3225configuration dict is constructed using Python code, this is
3226straightforward, but a problem arises when the configuration is
3227provided via a text file (e.g. JSON, YAML). In a text file, there is
3228no standard way to distinguish ``sys.stderr`` from the literal string
3229``'sys.stderr'``. To facilitate this distinction, the configuration
3230system looks for certain special prefixes in string values and
3231treat them specially. For example, if the literal string
3232``'ext://sys.stderr'`` is provided as a value in the configuration,
3233then the ``ext://`` will be stripped off and the remainder of the
3234value processed using normal import mechanisms.
3235
3236The handling of such prefixes is done in a way analogous to protocol
3237handling: there is a generic mechanism to look for prefixes which
3238match the regular expression ``^(?P<prefix>[a-z]+)://(?P<suffix>.*)$``
3239whereby, if the ``prefix`` is recognised, the ``suffix`` is processed
3240in a prefix-dependent manner and the result of the processing replaces
3241the string value. If the prefix is not recognised, then the string
3242value will be left as-is.
3243
3244
3245.. _logging-config-dict-internalobj:
3246
3247Access to internal objects
3248""""""""""""""""""""""""""
3249
3250As well as external objects, there is sometimes also a need to refer
3251to objects in the configuration. This will be done implicitly by the
3252configuration system for things that it knows about. For example, the
3253string value ``'DEBUG'`` for a ``level`` in a logger or handler will
3254automatically be converted to the value ``logging.DEBUG``, and the
3255``handlers``, ``filters`` and ``formatter`` entries will take an
3256object id and resolve to the appropriate destination object.
3257
3258However, a more generic mechanism is needed for user-defined
3259objects which are not known to the :mod:`logging` module. For
3260example, consider :class:`logging.handlers.MemoryHandler`, which takes
3261a ``target`` argument which is another handler to delegate to. Since
3262the system already knows about this class, then in the configuration,
3263the given ``target`` just needs to be the object id of the relevant
3264target handler, and the system will resolve to the handler from the
3265id. If, however, a user defines a ``my.package.MyHandler`` which has
3266an ``alternate`` handler, the configuration system would not know that
3267the ``alternate`` referred to a handler. To cater for this, a generic
3268resolution system allows the user to specify::
3269
3270 handlers:
3271 file:
3272 # configuration of file handler goes here
3273
3274 custom:
3275 (): my.package.MyHandler
3276 alternate: cfg://handlers.file
3277
3278The literal string ``'cfg://handlers.file'`` will be resolved in an
3279analogous way to strings with the ``ext://`` prefix, but looking
3280in the configuration itself rather than the import namespace. The
3281mechanism allows access by dot or by index, in a similar way to
3282that provided by ``str.format``. Thus, given the following snippet::
3283
3284 handlers:
3285 email:
3286 class: logging.handlers.SMTPHandler
3287 mailhost: localhost
3288 fromaddr: my_app@domain.tld
3289 toaddrs:
3290 - support_team@domain.tld
3291 - dev_team@domain.tld
3292 subject: Houston, we have a problem.
3293
3294in the configuration, the string ``'cfg://handlers'`` would resolve to
3295the dict with key ``handlers``, the string ``'cfg://handlers.email``
3296would resolve to the dict with key ``email`` in the ``handlers`` dict,
3297and so on. The string ``'cfg://handlers.email.toaddrs[1]`` would
3298resolve to ``'dev_team.domain.tld'`` and the string
3299``'cfg://handlers.email.toaddrs[0]'`` would resolve to the value
3300``'support_team@domain.tld'``. The ``subject`` value could be accessed
3301using either ``'cfg://handlers.email.subject'`` or, equivalently,
3302``'cfg://handlers.email[subject]'``. The latter form only needs to be
3303used if the key contains spaces or non-alphanumeric characters. If an
3304index value consists only of decimal digits, access will be attempted
3305using the corresponding integer value, falling back to the string
3306value if needed.
3307
3308Given a string ``cfg://handlers.myhandler.mykey.123``, this will
3309resolve to ``config_dict['handlers']['myhandler']['mykey']['123']``.
3310If the string is specified as ``cfg://handlers.myhandler.mykey[123]``,
3311the system will attempt to retrieve the value from
3312``config_dict['handlers']['myhandler']['mykey'][123]``, and fall back
3313to ``config_dict['handlers']['myhandler']['mykey']['123']`` if that
3314fails.
3315
Georg Brandl8ec7f652007-08-15 14:28:01 +00003316.. _logging-config-fileformat:
3317
3318Configuration file format
3319^^^^^^^^^^^^^^^^^^^^^^^^^
3320
Georg Brandl392c6fc2008-05-25 07:25:25 +00003321The configuration file format understood by :func:`fileConfig` is based on
Vinay Sajip51104862009-01-02 18:53:04 +00003322:mod:`ConfigParser` functionality. The file must contain sections called
3323``[loggers]``, ``[handlers]`` and ``[formatters]`` which identify by name the
3324entities of each type which are defined in the file. For each such entity,
3325there is a separate section which identifies how that entity is configured.
3326Thus, for a logger named ``log01`` in the ``[loggers]`` section, the relevant
3327configuration details are held in a section ``[logger_log01]``. Similarly, a
3328handler called ``hand01`` in the ``[handlers]`` section will have its
3329configuration held in a section called ``[handler_hand01]``, while a formatter
3330called ``form01`` in the ``[formatters]`` section will have its configuration
3331specified in a section called ``[formatter_form01]``. The root logger
3332configuration must be specified in a section called ``[logger_root]``.
Georg Brandl8ec7f652007-08-15 14:28:01 +00003333
3334Examples of these sections in the file are given below. ::
3335
3336 [loggers]
3337 keys=root,log02,log03,log04,log05,log06,log07
3338
3339 [handlers]
3340 keys=hand01,hand02,hand03,hand04,hand05,hand06,hand07,hand08,hand09
3341
3342 [formatters]
3343 keys=form01,form02,form03,form04,form05,form06,form07,form08,form09
3344
3345The root logger must specify a level and a list of handlers. An example of a
3346root logger section is given below. ::
3347
3348 [logger_root]
3349 level=NOTSET
3350 handlers=hand01
3351
3352The ``level`` entry can be one of ``DEBUG, INFO, WARNING, ERROR, CRITICAL`` or
3353``NOTSET``. For the root logger only, ``NOTSET`` means that all messages will be
3354logged. Level values are :func:`eval`\ uated in the context of the ``logging``
3355package's namespace.
3356
3357The ``handlers`` entry is a comma-separated list of handler names, which must
3358appear in the ``[handlers]`` section. These names must appear in the
3359``[handlers]`` section and have corresponding sections in the configuration
3360file.
3361
3362For loggers other than the root logger, some additional information is required.
3363This is illustrated by the following example. ::
3364
3365 [logger_parser]
3366 level=DEBUG
3367 handlers=hand01
3368 propagate=1
3369 qualname=compiler.parser
3370
3371The ``level`` and ``handlers`` entries are interpreted as for the root logger,
3372except that if a non-root logger's level is specified as ``NOTSET``, the system
3373consults loggers higher up the hierarchy to determine the effective level of the
3374logger. The ``propagate`` entry is set to 1 to indicate that messages must
3375propagate to handlers higher up the logger hierarchy from this logger, or 0 to
3376indicate that messages are **not** propagated to handlers up the hierarchy. The
3377``qualname`` entry is the hierarchical channel name of the logger, that is to
3378say the name used by the application to get the logger.
3379
3380Sections which specify handler configuration are exemplified by the following.
3381::
3382
3383 [handler_hand01]
3384 class=StreamHandler
3385 level=NOTSET
3386 formatter=form01
3387 args=(sys.stdout,)
3388
3389The ``class`` entry indicates the handler's class (as determined by :func:`eval`
3390in the ``logging`` package's namespace). The ``level`` is interpreted as for
3391loggers, and ``NOTSET`` is taken to mean "log everything".
3392
Vinay Sajip2a649f92008-07-18 09:00:35 +00003393.. versionchanged:: 2.6
3394 Added support for resolving the handler's class as a dotted module and class
3395 name.
3396
Georg Brandl8ec7f652007-08-15 14:28:01 +00003397The ``formatter`` entry indicates the key name of the formatter for this
3398handler. If blank, a default formatter (``logging._defaultFormatter``) is used.
3399If a name is specified, it must appear in the ``[formatters]`` section and have
3400a corresponding section in the configuration file.
3401
3402The ``args`` entry, when :func:`eval`\ uated in the context of the ``logging``
3403package's namespace, is the list of arguments to the constructor for the handler
3404class. Refer to the constructors for the relevant handlers, or to the examples
3405below, to see how typical entries are constructed. ::
3406
3407 [handler_hand02]
3408 class=FileHandler
3409 level=DEBUG
3410 formatter=form02
3411 args=('python.log', 'w')
3412
3413 [handler_hand03]
3414 class=handlers.SocketHandler
3415 level=INFO
3416 formatter=form03
3417 args=('localhost', handlers.DEFAULT_TCP_LOGGING_PORT)
3418
3419 [handler_hand04]
3420 class=handlers.DatagramHandler
3421 level=WARN
3422 formatter=form04
3423 args=('localhost', handlers.DEFAULT_UDP_LOGGING_PORT)
3424
3425 [handler_hand05]
3426 class=handlers.SysLogHandler
3427 level=ERROR
3428 formatter=form05
3429 args=(('localhost', handlers.SYSLOG_UDP_PORT), handlers.SysLogHandler.LOG_USER)
3430
3431 [handler_hand06]
3432 class=handlers.NTEventLogHandler
3433 level=CRITICAL
3434 formatter=form06
3435 args=('Python Application', '', 'Application')
3436
3437 [handler_hand07]
3438 class=handlers.SMTPHandler
3439 level=WARN
3440 formatter=form07
3441 args=('localhost', 'from@abc', ['user1@abc', 'user2@xyz'], 'Logger Subject')
3442
3443 [handler_hand08]
3444 class=handlers.MemoryHandler
3445 level=NOTSET
3446 formatter=form08
3447 target=
3448 args=(10, ERROR)
3449
3450 [handler_hand09]
3451 class=handlers.HTTPHandler
3452 level=NOTSET
3453 formatter=form09
3454 args=('localhost:9022', '/log', 'GET')
3455
3456Sections which specify formatter configuration are typified by the following. ::
3457
3458 [formatter_form01]
3459 format=F1 %(asctime)s %(levelname)s %(message)s
3460 datefmt=
3461 class=logging.Formatter
3462
3463The ``format`` entry is the overall format string, and the ``datefmt`` entry is
Georg Brandlb19be572007-12-29 10:57:00 +00003464the :func:`strftime`\ -compatible date/time format string. If empty, the
3465package substitutes ISO8601 format date/times, which is almost equivalent to
3466specifying the date format string ``"%Y-%m-%d %H:%M:%S"``. The ISO8601 format
3467also specifies milliseconds, which are appended to the result of using the above
3468format string, with a comma separator. An example time in ISO8601 format is
3469``2003-01-23 00:29:50,411``.
Georg Brandl8ec7f652007-08-15 14:28:01 +00003470
3471The ``class`` entry is optional. It indicates the name of the formatter's class
3472(as a dotted module and class name.) This option is useful for instantiating a
3473:class:`Formatter` subclass. Subclasses of :class:`Formatter` can present
3474exception tracebacks in an expanded or condensed format.
3475
Georg Brandlc37f2882007-12-04 17:46:27 +00003476
3477Configuration server example
3478^^^^^^^^^^^^^^^^^^^^^^^^^^^^
3479
3480Here is an example of a module using the logging configuration server::
3481
3482 import logging
3483 import logging.config
3484 import time
3485 import os
3486
3487 # read initial config file
3488 logging.config.fileConfig("logging.conf")
3489
3490 # create and start listener on port 9999
3491 t = logging.config.listen(9999)
3492 t.start()
3493
3494 logger = logging.getLogger("simpleExample")
3495
3496 try:
3497 # loop through logging calls to see the difference
3498 # new configurations make, until Ctrl+C is pressed
3499 while True:
3500 logger.debug("debug message")
3501 logger.info("info message")
3502 logger.warn("warn message")
3503 logger.error("error message")
3504 logger.critical("critical message")
3505 time.sleep(5)
3506 except KeyboardInterrupt:
3507 # cleanup
3508 logging.config.stopListening()
3509 t.join()
3510
3511And here is a script that takes a filename and sends that file to the server,
3512properly preceded with the binary-encoded length, as the new logging
3513configuration::
3514
3515 #!/usr/bin/env python
Benjamin Petersona7b55a32009-02-20 03:31:23 +00003516 import socket, sys, struct
Georg Brandlc37f2882007-12-04 17:46:27 +00003517
3518 data_to_send = open(sys.argv[1], "r").read()
3519
3520 HOST = 'localhost'
3521 PORT = 9999
3522 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
3523 print "connecting..."
3524 s.connect((HOST, PORT))
3525 print "sending config..."
3526 s.send(struct.pack(">L", len(data_to_send)))
3527 s.send(data_to_send)
3528 s.close()
3529 print "complete"
3530
3531
3532More examples
3533-------------
3534
3535Multiple handlers and formatters
3536^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
3537
3538Loggers are plain Python objects. The :func:`addHandler` method has no minimum
3539or maximum quota for the number of handlers you may add. Sometimes it will be
3540beneficial for an application to log all messages of all severities to a text
3541file while simultaneously logging errors or above to the console. To set this
3542up, simply configure the appropriate handlers. The logging calls in the
3543application code will remain unchanged. Here is a slight modification to the
3544previous simple module-based configuration example::
3545
3546 import logging
3547
3548 logger = logging.getLogger("simple_example")
3549 logger.setLevel(logging.DEBUG)
3550 # create file handler which logs even debug messages
3551 fh = logging.FileHandler("spam.log")
3552 fh.setLevel(logging.DEBUG)
3553 # create console handler with a higher log level
3554 ch = logging.StreamHandler()
3555 ch.setLevel(logging.ERROR)
3556 # create formatter and add it to the handlers
3557 formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
3558 ch.setFormatter(formatter)
3559 fh.setFormatter(formatter)
3560 # add the handlers to logger
3561 logger.addHandler(ch)
3562 logger.addHandler(fh)
3563
3564 # "application" code
3565 logger.debug("debug message")
3566 logger.info("info message")
3567 logger.warn("warn message")
3568 logger.error("error message")
3569 logger.critical("critical message")
3570
3571Notice that the "application" code does not care about multiple handlers. All
3572that changed was the addition and configuration of a new handler named *fh*.
3573
3574The ability to create new handlers with higher- or lower-severity filters can be
3575very helpful when writing and testing an application. Instead of using many
3576``print`` statements for debugging, use ``logger.debug``: Unlike the print
3577statements, which you will have to delete or comment out later, the logger.debug
3578statements can remain intact in the source code and remain dormant until you
3579need them again. At that time, the only change that needs to happen is to
3580modify the severity level of the logger and/or handler to debug.
3581
3582
3583Using logging in multiple modules
3584^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
3585
3586It was mentioned above that multiple calls to
3587``logging.getLogger('someLogger')`` return a reference to the same logger
3588object. This is true not only within the same module, but also across modules
3589as long as it is in the same Python interpreter process. It is true for
3590references to the same object; additionally, application code can define and
3591configure a parent logger in one module and create (but not configure) a child
3592logger in a separate module, and all logger calls to the child will pass up to
3593the parent. Here is a main module::
3594
3595 import logging
3596 import auxiliary_module
3597
3598 # create logger with "spam_application"
3599 logger = logging.getLogger("spam_application")
3600 logger.setLevel(logging.DEBUG)
3601 # create file handler which logs even debug messages
3602 fh = logging.FileHandler("spam.log")
3603 fh.setLevel(logging.DEBUG)
3604 # create console handler with a higher log level
3605 ch = logging.StreamHandler()
3606 ch.setLevel(logging.ERROR)
3607 # create formatter and add it to the handlers
3608 formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
3609 fh.setFormatter(formatter)
3610 ch.setFormatter(formatter)
3611 # add the handlers to the logger
3612 logger.addHandler(fh)
3613 logger.addHandler(ch)
3614
3615 logger.info("creating an instance of auxiliary_module.Auxiliary")
3616 a = auxiliary_module.Auxiliary()
3617 logger.info("created an instance of auxiliary_module.Auxiliary")
3618 logger.info("calling auxiliary_module.Auxiliary.do_something")
3619 a.do_something()
3620 logger.info("finished auxiliary_module.Auxiliary.do_something")
3621 logger.info("calling auxiliary_module.some_function()")
3622 auxiliary_module.some_function()
3623 logger.info("done with auxiliary_module.some_function()")
3624
3625Here is the auxiliary module::
3626
3627 import logging
3628
3629 # create logger
3630 module_logger = logging.getLogger("spam_application.auxiliary")
3631
3632 class Auxiliary:
3633 def __init__(self):
3634 self.logger = logging.getLogger("spam_application.auxiliary.Auxiliary")
3635 self.logger.info("creating an instance of Auxiliary")
3636 def do_something(self):
3637 self.logger.info("doing something")
3638 a = 1 + 1
3639 self.logger.info("done doing something")
3640
3641 def some_function():
3642 module_logger.info("received a call to \"some_function\"")
3643
3644The output looks like this::
3645
Vinay Sajipe28fa292008-01-07 15:30:36 +00003646 2005-03-23 23:47:11,663 - spam_application - INFO -
Georg Brandlc37f2882007-12-04 17:46:27 +00003647 creating an instance of auxiliary_module.Auxiliary
Vinay Sajipe28fa292008-01-07 15:30:36 +00003648 2005-03-23 23:47:11,665 - spam_application.auxiliary.Auxiliary - INFO -
Georg Brandlc37f2882007-12-04 17:46:27 +00003649 creating an instance of Auxiliary
Vinay Sajipe28fa292008-01-07 15:30:36 +00003650 2005-03-23 23:47:11,665 - spam_application - INFO -
Georg Brandlc37f2882007-12-04 17:46:27 +00003651 created an instance of auxiliary_module.Auxiliary
Vinay Sajipe28fa292008-01-07 15:30:36 +00003652 2005-03-23 23:47:11,668 - spam_application - INFO -
Georg Brandlc37f2882007-12-04 17:46:27 +00003653 calling auxiliary_module.Auxiliary.do_something
Vinay Sajipe28fa292008-01-07 15:30:36 +00003654 2005-03-23 23:47:11,668 - spam_application.auxiliary.Auxiliary - INFO -
Georg Brandlc37f2882007-12-04 17:46:27 +00003655 doing something
Vinay Sajipe28fa292008-01-07 15:30:36 +00003656 2005-03-23 23:47:11,669 - spam_application.auxiliary.Auxiliary - INFO -
Georg Brandlc37f2882007-12-04 17:46:27 +00003657 done doing something
Vinay Sajipe28fa292008-01-07 15:30:36 +00003658 2005-03-23 23:47:11,670 - spam_application - INFO -
Georg Brandlc37f2882007-12-04 17:46:27 +00003659 finished auxiliary_module.Auxiliary.do_something
Vinay Sajipe28fa292008-01-07 15:30:36 +00003660 2005-03-23 23:47:11,671 - spam_application - INFO -
Georg Brandlc37f2882007-12-04 17:46:27 +00003661 calling auxiliary_module.some_function()
Vinay Sajipe28fa292008-01-07 15:30:36 +00003662 2005-03-23 23:47:11,672 - spam_application.auxiliary - INFO -
Georg Brandlc37f2882007-12-04 17:46:27 +00003663 received a call to "some_function"
Vinay Sajipe28fa292008-01-07 15:30:36 +00003664 2005-03-23 23:47:11,673 - spam_application - INFO -
Georg Brandlc37f2882007-12-04 17:46:27 +00003665 done with auxiliary_module.some_function()
3666