blob: 32cad92b29978f2cb81477edd1200c3ffce287bd [file] [log] [blame]
Georg Brandl116aa622007-08-15 14:28:22 +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 Brandl116aa622007-08-15 14:28:22 +000012.. index:: pair: Errors; logging
13
Georg Brandl116aa622007-08-15 14:28:22 +000014This module defines functions and classes which implement a flexible error
15logging system for applications.
16
17Logging is performed by calling methods on instances of the :class:`Logger`
18class (hereafter called :dfn:`loggers`). Each instance has a name, and they are
Georg Brandl9afde1c2007-11-01 20:32:30 +000019conceptually arranged in a namespace hierarchy using dots (periods) as
Georg Brandl116aa622007-08-15 14:28:22 +000020separators. For example, a logger named "scan" is the parent of loggers
21"scan.text", "scan.html" and "scan.pdf". Logger names can be anything you want,
22and indicate the area of an application in which a logged message originates.
23
24Logged messages also have levels of importance associated with them. The default
25levels provided are :const:`DEBUG`, :const:`INFO`, :const:`WARNING`,
26:const:`ERROR` and :const:`CRITICAL`. As a convenience, you indicate the
27importance of a logged message by calling an appropriate method of
28:class:`Logger`. The methods are :meth:`debug`, :meth:`info`, :meth:`warning`,
29:meth:`error` and :meth:`critical`, which mirror the default levels. You are not
30constrained to use these levels: you can specify your own and use a more general
31:class:`Logger` method, :meth:`log`, which takes an explicit level argument.
32
Christian Heimes8b0facf2007-12-04 19:30:01 +000033
34Logging tutorial
35----------------
36
37The key benefit of having the logging API provided by a standard library module
38is that all Python modules can participate in logging, so your application log
39can include messages from third-party modules.
40
41It is, of course, possible to log messages with different verbosity levels or to
42different destinations. Support for writing log messages to files, HTTP
43GET/POST locations, email via SMTP, generic sockets, or OS-specific logging
Christian Heimesc3f30c42008-02-22 16:37:40 +000044mechanisms are all supported by the standard module. You can also create your
Christian Heimes8b0facf2007-12-04 19:30:01 +000045own log destination class if you have special requirements not met by any of the
46built-in classes.
47
48Simple examples
49^^^^^^^^^^^^^^^
50
51.. sectionauthor:: Doug Hellmann
52.. (see <http://blog.doughellmann.com/2007/05/pymotw-logging.html>)
53
54Most applications are probably going to want to log to a file, so let's start
55with that case. Using the :func:`basicConfig` function, we can set up the
56default handler so that debug messages are written to a file::
57
58 import logging
59 LOG_FILENAME = '/tmp/logging_example.out'
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +000060 logging.basicConfig(filename=LOG_FILENAME,level=logging.DEBUG)
Christian Heimes8b0facf2007-12-04 19:30:01 +000061
62 logging.debug('This message should go to the log file')
63
64And now if we open the file and look at what we have, we should find the log
65message::
66
67 DEBUG:root:This message should go to the log file
68
69If you run the script repeatedly, the additional log messages are appended to
Eric Smith5c01a8d2009-06-04 18:20:51 +000070the file. To create a new file each time, you can pass a *filemode* argument to
Christian Heimes8b0facf2007-12-04 19:30:01 +000071:func:`basicConfig` with a value of ``'w'``. Rather than managing the file size
72yourself, though, it is simpler to use a :class:`RotatingFileHandler`::
73
74 import glob
75 import logging
76 import logging.handlers
77
78 LOG_FILENAME = '/tmp/logging_rotatingfile_example.out'
79
80 # Set up a specific logger with our desired output level
81 my_logger = logging.getLogger('MyLogger')
82 my_logger.setLevel(logging.DEBUG)
83
84 # Add the log message handler to the logger
85 handler = logging.handlers.RotatingFileHandler(
86 LOG_FILENAME, maxBytes=20, backupCount=5)
87
88 my_logger.addHandler(handler)
89
90 # Log some messages
91 for i in range(20):
92 my_logger.debug('i = %d' % i)
93
94 # See what files are created
95 logfiles = glob.glob('%s*' % LOG_FILENAME)
96
97 for filename in logfiles:
Georg Brandlf6945182008-02-01 11:56:49 +000098 print(filename)
Christian Heimes8b0facf2007-12-04 19:30:01 +000099
100The result should be 6 separate files, each with part of the log history for the
101application::
102
103 /tmp/logging_rotatingfile_example.out
104 /tmp/logging_rotatingfile_example.out.1
105 /tmp/logging_rotatingfile_example.out.2
106 /tmp/logging_rotatingfile_example.out.3
107 /tmp/logging_rotatingfile_example.out.4
108 /tmp/logging_rotatingfile_example.out.5
109
110The most current file is always :file:`/tmp/logging_rotatingfile_example.out`,
111and each time it reaches the size limit it is renamed with the suffix
112``.1``. Each of the existing backup files is renamed to increment the suffix
Eric Smith5c01a8d2009-06-04 18:20:51 +0000113(``.1`` becomes ``.2``, etc.) and the ``.6`` file is erased.
Christian Heimes8b0facf2007-12-04 19:30:01 +0000114
115Obviously this example sets the log length much much too small as an extreme
116example. You would want to set *maxBytes* to an appropriate value.
117
118Another useful feature of the logging API is the ability to produce different
119messages at different log levels. This allows you to instrument your code with
120debug messages, for example, but turning the log level down so that those debug
121messages are not written for your production system. The default levels are
Vinay Sajipb6d065f2009-10-28 23:28:16 +0000122``NOTSET``, ``DEBUG``, ``INFO``, ``WARNING``, ``ERROR`` and ``CRITICAL``.
Christian Heimes8b0facf2007-12-04 19:30:01 +0000123
124The logger, handler, and log message call each specify a level. The log message
125is only emitted if the handler and logger are configured to emit messages of
126that level or lower. For example, if a message is ``CRITICAL``, and the logger
127is set to ``ERROR``, the message is emitted. If a message is a ``WARNING``, and
128the logger is set to produce only ``ERROR``\s, the message is not emitted::
129
130 import logging
131 import sys
132
133 LEVELS = {'debug': logging.DEBUG,
134 'info': logging.INFO,
135 'warning': logging.WARNING,
136 'error': logging.ERROR,
137 'critical': logging.CRITICAL}
138
139 if len(sys.argv) > 1:
140 level_name = sys.argv[1]
141 level = LEVELS.get(level_name, logging.NOTSET)
142 logging.basicConfig(level=level)
143
144 logging.debug('This is a debug message')
145 logging.info('This is an info message')
146 logging.warning('This is a warning message')
147 logging.error('This is an error message')
148 logging.critical('This is a critical error message')
149
150Run the script with an argument like 'debug' or 'warning' to see which messages
151show up at different levels::
152
153 $ python logging_level_example.py debug
154 DEBUG:root:This is a debug message
155 INFO:root:This is an info message
156 WARNING:root:This is a warning message
157 ERROR:root:This is an error message
158 CRITICAL:root:This is a critical error message
159
160 $ python logging_level_example.py info
161 INFO:root:This is an info message
162 WARNING:root:This is a warning message
163 ERROR:root:This is an error message
164 CRITICAL:root:This is a critical error message
165
166You will notice that these log messages all have ``root`` embedded in them. The
167logging module supports a hierarchy of loggers with different names. An easy
168way to tell where a specific log message comes from is to use a separate logger
169object for each of your modules. Each new logger "inherits" the configuration
170of its parent, and log messages sent to a logger include the name of that
171logger. Optionally, each logger can be configured differently, so that messages
172from different modules are handled in different ways. Let's look at a simple
173example of how to log from different modules so it is easy to trace the source
174of the message::
175
176 import logging
177
178 logging.basicConfig(level=logging.WARNING)
179
180 logger1 = logging.getLogger('package1.module1')
181 logger2 = logging.getLogger('package2.module2')
182
183 logger1.warning('This message comes from one module')
184 logger2.warning('And this message comes from another module')
185
186And the output::
187
188 $ python logging_modules_example.py
189 WARNING:package1.module1:This message comes from one module
190 WARNING:package2.module2:And this message comes from another module
191
192There are many more options for configuring logging, including different log
193message formatting options, having messages delivered to multiple destinations,
194and changing the configuration of a long-running application on the fly using a
195socket interface. All of these options are covered in depth in the library
196module documentation.
197
198Loggers
199^^^^^^^
200
201The logging library takes a modular approach and offers the several categories
202of components: loggers, handlers, filters, and formatters. Loggers expose the
203interface that application code directly uses. Handlers send the log records to
204the appropriate destination. Filters provide a finer grained facility for
205determining which log records to send on to a handler. Formatters specify the
206layout of the resultant log record.
207
208:class:`Logger` objects have a threefold job. First, they expose several
209methods to application code so that applications can log messages at runtime.
210Second, logger objects determine which log messages to act upon based upon
211severity (the default filtering facility) or filter objects. Third, logger
212objects pass along relevant log messages to all interested log handlers.
213
214The most widely used methods on logger objects fall into two categories:
215configuration and message sending.
216
217* :meth:`Logger.setLevel` specifies the lowest-severity log message a logger
218 will handle, where debug is the lowest built-in severity level and critical is
219 the highest built-in severity. For example, if the severity level is info,
220 the logger will handle only info, warning, error, and critical messages and
221 will ignore debug messages.
222
223* :meth:`Logger.addFilter` and :meth:`Logger.removeFilter` add and remove filter
224 objects from the logger object. This tutorial does not address filters.
225
226With the logger object configured, the following methods create log messages:
227
228* :meth:`Logger.debug`, :meth:`Logger.info`, :meth:`Logger.warning`,
229 :meth:`Logger.error`, and :meth:`Logger.critical` all create log records with
230 a message and a level that corresponds to their respective method names. The
231 message is actually a format string, which may contain the standard string
232 substitution syntax of :const:`%s`, :const:`%d`, :const:`%f`, and so on. The
233 rest of their arguments is a list of objects that correspond with the
234 substitution fields in the message. With regard to :const:`**kwargs`, the
235 logging methods care only about a keyword of :const:`exc_info` and use it to
236 determine whether to log exception information.
237
238* :meth:`Logger.exception` creates a log message similar to
239 :meth:`Logger.error`. The difference is that :meth:`Logger.exception` dumps a
240 stack trace along with it. Call this method only from an exception handler.
241
242* :meth:`Logger.log` takes a log level as an explicit argument. This is a
243 little more verbose for logging messages than using the log level convenience
244 methods listed above, but this is how to log at custom log levels.
245
Christian Heimesdcca98d2008-02-25 13:19:43 +0000246:func:`getLogger` returns a reference to a logger instance with the specified
Benjamin Peterson22005fc2010-04-11 16:25:06 +0000247if it is provided, or ``root`` if not. The names are period-separated
Christian Heimes8b0facf2007-12-04 19:30:01 +0000248hierarchical structures. Multiple calls to :func:`getLogger` with the same name
249will return a reference to the same logger object. Loggers that are further
250down in the hierarchical list are children of loggers higher up in the list.
251For example, given a logger with a name of ``foo``, loggers with names of
Benjamin Peterson22005fc2010-04-11 16:25:06 +0000252``foo.bar``, ``foo.bar.baz``, and ``foo.bam`` are all descendants of ``foo``.
253Child loggers propagate messages up to the handlers associated with their
254ancestor loggers. Because of this, it is unnecessary to define and configure
255handlers for all the loggers an application uses. It is sufficient to
256configure handlers for a top-level logger and create child loggers as needed.
Christian Heimes8b0facf2007-12-04 19:30:01 +0000257
258
259Handlers
260^^^^^^^^
261
262:class:`Handler` objects are responsible for dispatching the appropriate log
263messages (based on the log messages' severity) to the handler's specified
264destination. Logger objects can add zero or more handler objects to themselves
265with an :func:`addHandler` method. As an example scenario, an application may
266want to send all log messages to a log file, all log messages of error or higher
267to stdout, and all messages of critical to an email address. This scenario
Christian Heimesc3f30c42008-02-22 16:37:40 +0000268requires three individual handlers where each handler is responsible for sending
Christian Heimes8b0facf2007-12-04 19:30:01 +0000269messages of a specific severity to a specific location.
270
271The standard library includes quite a few handler types; this tutorial uses only
272:class:`StreamHandler` and :class:`FileHandler` in its examples.
273
274There are very few methods in a handler for application developers to concern
275themselves with. The only handler methods that seem relevant for application
276developers who are using the built-in handler objects (that is, not creating
277custom handlers) are the following configuration methods:
278
279* The :meth:`Handler.setLevel` method, just as in logger objects, specifies the
280 lowest severity that will be dispatched to the appropriate destination. Why
281 are there two :func:`setLevel` methods? The level set in the logger
282 determines which severity of messages it will pass to its handlers. The level
283 set in each handler determines which messages that handler will send on.
Benjamin Peterson22005fc2010-04-11 16:25:06 +0000284
285* :func:`setFormatter` selects a Formatter object for this handler to use.
Christian Heimes8b0facf2007-12-04 19:30:01 +0000286
287* :func:`addFilter` and :func:`removeFilter` respectively configure and
288 deconfigure filter objects on handlers.
289
Benjamin Peterson22005fc2010-04-11 16:25:06 +0000290Application code should not directly instantiate and use instances of
291:class:`Handler`. Instead, the :class:`Handler` class is a base class that
292defines the interface that all handlers should have and establishes some
293default behavior that child classes can use (or override).
Christian Heimes8b0facf2007-12-04 19:30:01 +0000294
295
296Formatters
297^^^^^^^^^^
298
299Formatter objects configure the final order, structure, and contents of the log
Christian Heimesdcca98d2008-02-25 13:19:43 +0000300message. Unlike the base :class:`logging.Handler` class, application code may
Christian Heimes8b0facf2007-12-04 19:30:01 +0000301instantiate formatter classes, although you could likely subclass the formatter
302if your application needs special behavior. The constructor takes two optional
303arguments: a message format string and a date format string. If there is no
304message format string, the default is to use the raw message. If there is no
305date format string, the default date format is::
306
307 %Y-%m-%d %H:%M:%S
308
309with the milliseconds tacked on at the end.
310
311The message format string uses ``%(<dictionary key>)s`` styled string
312substitution; the possible keys are documented in :ref:`formatter-objects`.
313
314The following message format string will log the time in a human-readable
315format, the severity of the message, and the contents of the message, in that
316order::
317
318 "%(asctime)s - %(levelname)s - %(message)s"
319
320
321Configuring Logging
322^^^^^^^^^^^^^^^^^^^
323
324Programmers can configure logging either by creating loggers, handlers, and
325formatters explicitly in a main module with the configuration methods listed
326above (using Python code), or by creating a logging config file. The following
327code is an example of configuring a very simple logger, a console handler, and a
328simple formatter in a Python module::
329
330 import logging
331
332 # create logger
333 logger = logging.getLogger("simple_example")
334 logger.setLevel(logging.DEBUG)
335 # create console handler and set level to debug
336 ch = logging.StreamHandler()
337 ch.setLevel(logging.DEBUG)
338 # create formatter
339 formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
340 # add formatter to ch
341 ch.setFormatter(formatter)
342 # add ch to logger
343 logger.addHandler(ch)
344
345 # "application" code
346 logger.debug("debug message")
347 logger.info("info message")
348 logger.warn("warn message")
349 logger.error("error message")
350 logger.critical("critical message")
351
352Running this module from the command line produces the following output::
353
354 $ python simple_logging_module.py
355 2005-03-19 15:10:26,618 - simple_example - DEBUG - debug message
356 2005-03-19 15:10:26,620 - simple_example - INFO - info message
357 2005-03-19 15:10:26,695 - simple_example - WARNING - warn message
358 2005-03-19 15:10:26,697 - simple_example - ERROR - error message
359 2005-03-19 15:10:26,773 - simple_example - CRITICAL - critical message
360
361The following Python module creates a logger, handler, and formatter nearly
362identical to those in the example listed above, with the only difference being
363the names of the objects::
364
365 import logging
366 import logging.config
367
368 logging.config.fileConfig("logging.conf")
369
370 # create logger
371 logger = logging.getLogger("simpleExample")
372
373 # "application" code
374 logger.debug("debug message")
375 logger.info("info message")
376 logger.warn("warn message")
377 logger.error("error message")
378 logger.critical("critical message")
379
380Here is the logging.conf file::
381
382 [loggers]
383 keys=root,simpleExample
384
385 [handlers]
386 keys=consoleHandler
387
388 [formatters]
389 keys=simpleFormatter
390
391 [logger_root]
392 level=DEBUG
393 handlers=consoleHandler
394
395 [logger_simpleExample]
396 level=DEBUG
397 handlers=consoleHandler
398 qualname=simpleExample
399 propagate=0
400
401 [handler_consoleHandler]
402 class=StreamHandler
403 level=DEBUG
404 formatter=simpleFormatter
405 args=(sys.stdout,)
406
407 [formatter_simpleFormatter]
408 format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
409 datefmt=
410
411The output is nearly identical to that of the non-config-file-based example::
412
413 $ python simple_logging_config.py
414 2005-03-19 15:38:55,977 - simpleExample - DEBUG - debug message
415 2005-03-19 15:38:55,979 - simpleExample - INFO - info message
416 2005-03-19 15:38:56,054 - simpleExample - WARNING - warn message
417 2005-03-19 15:38:56,055 - simpleExample - ERROR - error message
418 2005-03-19 15:38:56,130 - simpleExample - CRITICAL - critical message
419
420You can see that the config file approach has a few advantages over the Python
421code approach, mainly separation of configuration and code and the ability of
422noncoders to easily modify the logging properties.
423
Benjamin Peterson9451a1c2010-03-13 22:30:34 +0000424Note that the class names referenced in config files need to be either relative
425to the logging module, or absolute values which can be resolved using normal
426import mechanisms. Thus, you could use either `handlers.WatchedFileHandler`
427(relative to the logging module) or `mypackage.mymodule.MyHandler` (for a
428class defined in package `mypackage` and module `mymodule`, where `mypackage`
429is available on the Python import path).
430
Vinay Sajip26a2d5e2009-01-10 13:37:26 +0000431.. _library-config:
Vinay Sajip30bf1222009-01-10 19:23:34 +0000432
Benjamin Peterson3e4f0552008-09-02 00:31:15 +0000433Configuring Logging for a Library
434^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
435
436When developing a library which uses logging, some consideration needs to be
437given to its configuration. If the using application does not use logging, and
438library code makes logging calls, then a one-off message "No handlers could be
439found for logger X.Y.Z" is printed to the console. This message is intended
440to catch mistakes in logging configuration, but will confuse an application
441developer who is not aware of logging by the library.
442
443In addition to documenting how a library uses logging, a good way to configure
444library logging so that it does not cause a spurious message is to add a
445handler which does nothing. This avoids the message being printed, since a
446handler will be found: it just doesn't produce any output. If the library user
447configures logging for application use, presumably that configuration will add
448some handlers, and if levels are suitably configured then logging calls made
449in library code will send output to those handlers, as normal.
450
451A do-nothing handler can be simply defined as follows::
452
453 import logging
454
455 class NullHandler(logging.Handler):
456 def emit(self, record):
457 pass
458
459An instance of this handler should be added to the top-level logger of the
460logging namespace used by the library. If all logging by a library *foo* is
461done using loggers with names matching "foo.x.y", then the code::
462
463 import logging
464
465 h = NullHandler()
466 logging.getLogger("foo").addHandler(h)
467
468should have the desired effect. If an organisation produces a number of
469libraries, then the logger name specified can be "orgname.foo" rather than
470just "foo".
471
Georg Brandlf9734072008-12-07 15:30:06 +0000472.. versionadded:: 3.1
473
474The :class:`NullHandler` class was not present in previous versions, but is now
475included, so that it need not be defined in library code.
476
477
Christian Heimes8b0facf2007-12-04 19:30:01 +0000478
479Logging Levels
480--------------
481
Georg Brandl116aa622007-08-15 14:28:22 +0000482The numeric values of logging levels are given in the following table. These are
483primarily of interest if you want to define your own levels, and need them to
484have specific values relative to the predefined levels. If you define a level
485with the same numeric value, it overwrites the predefined value; the predefined
486name is lost.
487
488+--------------+---------------+
489| Level | Numeric value |
490+==============+===============+
491| ``CRITICAL`` | 50 |
492+--------------+---------------+
493| ``ERROR`` | 40 |
494+--------------+---------------+
495| ``WARNING`` | 30 |
496+--------------+---------------+
497| ``INFO`` | 20 |
498+--------------+---------------+
499| ``DEBUG`` | 10 |
500+--------------+---------------+
501| ``NOTSET`` | 0 |
502+--------------+---------------+
503
504Levels can also be associated with loggers, being set either by the developer or
505through loading a saved logging configuration. When a logging method is called
506on a logger, the logger compares its own level with the level associated with
507the method call. If the logger's level is higher than the method call's, no
508logging message is actually generated. This is the basic mechanism controlling
509the verbosity of logging output.
510
511Logging messages are encoded as instances of the :class:`LogRecord` class. When
512a logger decides to actually log an event, a :class:`LogRecord` instance is
513created from the logging message.
514
515Logging messages are subjected to a dispatch mechanism through the use of
516:dfn:`handlers`, which are instances of subclasses of the :class:`Handler`
517class. Handlers are responsible for ensuring that a logged message (in the form
518of a :class:`LogRecord`) ends up in a particular location (or set of locations)
519which is useful for the target audience for that message (such as end users,
520support desk staff, system administrators, developers). Handlers are passed
521:class:`LogRecord` instances intended for particular destinations. Each logger
522can have zero, one or more handlers associated with it (via the
523:meth:`addHandler` method of :class:`Logger`). In addition to any handlers
524directly associated with a logger, *all handlers associated with all ancestors
Benjamin Peterson22005fc2010-04-11 16:25:06 +0000525of the logger* are called to dispatch the message (unless the *propagate* flag
526for a logger is set to a false value, at which point the passing to ancestor
527handlers stops).
Georg Brandl116aa622007-08-15 14:28:22 +0000528
529Just as for loggers, handlers can have levels associated with them. A handler's
530level acts as a filter in the same way as a logger's level does. If a handler
531decides to actually dispatch an event, the :meth:`emit` method is used to send
532the message to its destination. Most user-defined subclasses of :class:`Handler`
533will need to override this :meth:`emit`.
534
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000535Useful Handlers
536---------------
537
Georg Brandl116aa622007-08-15 14:28:22 +0000538In addition to the base :class:`Handler` class, many useful subclasses are
539provided:
540
541#. :class:`StreamHandler` instances send error messages to streams (file-like
542 objects).
543
544#. :class:`FileHandler` instances send error messages to disk files.
545
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000546.. module:: logging.handlers
Vinay Sajip30bf1222009-01-10 19:23:34 +0000547
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000548#. :class:`BaseRotatingHandler` is the base class for handlers that
549 rotate log files at a certain point. It is not meant to be instantiated
550 directly. Instead, use :class:`RotatingFileHandler` or
551 :class:`TimedRotatingFileHandler`.
Georg Brandl116aa622007-08-15 14:28:22 +0000552
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000553#. :class:`RotatingFileHandler` instances send error messages to disk
554 files, with support for maximum log file sizes and log file rotation.
Georg Brandl116aa622007-08-15 14:28:22 +0000555
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000556#. :class:`TimedRotatingFileHandler` instances send error messages to
557 disk files, rotating the log file at certain timed intervals.
Georg Brandl116aa622007-08-15 14:28:22 +0000558
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000559#. :class:`SocketHandler` instances send error messages to TCP/IP
560 sockets.
Georg Brandl116aa622007-08-15 14:28:22 +0000561
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000562#. :class:`DatagramHandler` instances send error messages to UDP
563 sockets.
Georg Brandl116aa622007-08-15 14:28:22 +0000564
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000565#. :class:`SMTPHandler` instances send error messages to a designated
566 email address.
Georg Brandl116aa622007-08-15 14:28:22 +0000567
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000568#. :class:`SysLogHandler` instances send error messages to a Unix
569 syslog daemon, possibly on a remote machine.
Georg Brandl116aa622007-08-15 14:28:22 +0000570
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000571#. :class:`NTEventLogHandler` instances send error messages to a
572 Windows NT/2000/XP event log.
Georg Brandl116aa622007-08-15 14:28:22 +0000573
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000574#. :class:`MemoryHandler` instances send error messages to a buffer
575 in memory, which is flushed whenever specific criteria are met.
Georg Brandl116aa622007-08-15 14:28:22 +0000576
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000577#. :class:`HTTPHandler` instances send error messages to an HTTP
578 server using either ``GET`` or ``POST`` semantics.
Georg Brandl116aa622007-08-15 14:28:22 +0000579
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000580#. :class:`WatchedFileHandler` instances watch the file they are
581 logging to. If the file changes, it is closed and reopened using the file
582 name. This handler is only useful on Unix-like systems; Windows does not
583 support the underlying mechanism used.
Vinay Sajip30bf1222009-01-10 19:23:34 +0000584
585.. currentmodule:: logging
586
Georg Brandlf9734072008-12-07 15:30:06 +0000587#. :class:`NullHandler` instances do nothing with error messages. They are used
588 by library developers who want to use logging, but want to avoid the "No
589 handlers could be found for logger XXX" message which can be displayed if
Vinay Sajip26a2d5e2009-01-10 13:37:26 +0000590 the library user has not configured logging. See :ref:`library-config` for
591 more information.
Georg Brandlf9734072008-12-07 15:30:06 +0000592
593.. versionadded:: 3.1
594
595The :class:`NullHandler` class was not present in previous versions.
596
Vinay Sajipa17775f2008-12-30 07:32:59 +0000597The :class:`NullHandler`, :class:`StreamHandler` and :class:`FileHandler`
598classes are defined in the core logging package. The other handlers are
599defined in a sub- module, :mod:`logging.handlers`. (There is also another
600sub-module, :mod:`logging.config`, for configuration functionality.)
Georg Brandl116aa622007-08-15 14:28:22 +0000601
602Logged messages are formatted for presentation through instances of the
603:class:`Formatter` class. They are initialized with a format string suitable for
604use with the % operator and a dictionary.
605
606For formatting multiple messages in a batch, instances of
607:class:`BufferingFormatter` can be used. In addition to the format string (which
608is applied to each message in the batch), there is provision for header and
609trailer format strings.
610
611When filtering based on logger level and/or handler level is not enough,
612instances of :class:`Filter` can be added to both :class:`Logger` and
613:class:`Handler` instances (through their :meth:`addFilter` method). Before
614deciding to process a message further, both loggers and handlers consult all
615their filters for permission. If any filter returns a false value, the message
616is not processed further.
617
618The basic :class:`Filter` functionality allows filtering by specific logger
619name. If this feature is used, messages sent to the named logger and its
620children are allowed through the filter, and all others dropped.
621
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000622Module-Level Functions
623----------------------
624
Georg Brandl116aa622007-08-15 14:28:22 +0000625In addition to the classes described above, there are a number of module- level
626functions.
627
628
Georg Brandlcd7f32b2009-06-08 09:13:45 +0000629.. function:: getLogger(name=None)
Georg Brandl116aa622007-08-15 14:28:22 +0000630
Georg Brandlcd7f32b2009-06-08 09:13:45 +0000631 Return a logger with the specified name or, if name is ``None``, return a
Georg Brandl116aa622007-08-15 14:28:22 +0000632 logger which is the root logger of the hierarchy. If specified, the name is
633 typically a dot-separated hierarchical name like *"a"*, *"a.b"* or *"a.b.c.d"*.
634 Choice of these names is entirely up to the developer who is using logging.
635
636 All calls to this function with a given name return the same logger instance.
637 This means that logger instances never need to be passed between different parts
638 of an application.
639
640
641.. function:: getLoggerClass()
642
643 Return either the standard :class:`Logger` class, or the last class passed to
644 :func:`setLoggerClass`. This function may be called from within a new class
645 definition, to ensure that installing a customised :class:`Logger` class will
646 not undo customisations already applied by other code. For example::
647
648 class MyLogger(logging.getLoggerClass()):
649 # ... override behaviour here
650
651
Georg Brandlcd7f32b2009-06-08 09:13:45 +0000652.. function:: debug(msg, *args, **kwargs)
Georg Brandl116aa622007-08-15 14:28:22 +0000653
654 Logs a message with level :const:`DEBUG` on the root logger. The *msg* is the
655 message format string, and the *args* are the arguments which are merged into
656 *msg* using the string formatting operator. (Note that this means that you can
657 use keywords in the format string, together with a single dictionary argument.)
658
659 There are two keyword arguments in *kwargs* which are inspected: *exc_info*
660 which, if it does not evaluate as false, causes exception information to be
661 added to the logging message. If an exception tuple (in the format returned by
662 :func:`sys.exc_info`) is provided, it is used; otherwise, :func:`sys.exc_info`
663 is called to get the exception information.
664
665 The other optional keyword argument is *extra* which can be used to pass a
666 dictionary which is used to populate the __dict__ of the LogRecord created for
667 the logging event with user-defined attributes. These custom attributes can then
668 be used as you like. For example, they could be incorporated into logged
669 messages. For example::
670
671 FORMAT = "%(asctime)-15s %(clientip)s %(user)-8s %(message)s"
672 logging.basicConfig(format=FORMAT)
673 d = {'clientip': '192.168.0.1', 'user': 'fbloggs'}
674 logging.warning("Protocol problem: %s", "connection reset", extra=d)
675
Georg Brandlcd7f32b2009-06-08 09:13:45 +0000676 would print something like ::
Georg Brandl116aa622007-08-15 14:28:22 +0000677
678 2006-02-08 22:20:02,165 192.168.0.1 fbloggs Protocol problem: connection reset
679
680 The keys in the dictionary passed in *extra* should not clash with the keys used
681 by the logging system. (See the :class:`Formatter` documentation for more
682 information on which keys are used by the logging system.)
683
684 If you choose to use these attributes in logged messages, you need to exercise
685 some care. In the above example, for instance, the :class:`Formatter` has been
686 set up with a format string which expects 'clientip' and 'user' in the attribute
687 dictionary of the LogRecord. If these are missing, the message will not be
688 logged because a string formatting exception will occur. So in this case, you
689 always need to pass the *extra* dictionary with these keys.
690
691 While this might be annoying, this feature is intended for use in specialized
692 circumstances, such as multi-threaded servers where the same code executes in
693 many contexts, and interesting conditions which arise are dependent on this
694 context (such as remote client IP address and authenticated user name, in the
695 above example). In such circumstances, it is likely that specialized
696 :class:`Formatter`\ s would be used with particular :class:`Handler`\ s.
697
Georg Brandl116aa622007-08-15 14:28:22 +0000698
Georg Brandlcd7f32b2009-06-08 09:13:45 +0000699.. function:: info(msg, *args, **kwargs)
Georg Brandl116aa622007-08-15 14:28:22 +0000700
701 Logs a message with level :const:`INFO` on the root logger. The arguments are
702 interpreted as for :func:`debug`.
703
704
Georg Brandlcd7f32b2009-06-08 09:13:45 +0000705.. function:: warning(msg, *args, **kwargs)
Georg Brandl116aa622007-08-15 14:28:22 +0000706
707 Logs a message with level :const:`WARNING` on the root logger. The arguments are
708 interpreted as for :func:`debug`.
709
710
Georg Brandlcd7f32b2009-06-08 09:13:45 +0000711.. function:: error(msg, *args, **kwargs)
Georg Brandl116aa622007-08-15 14:28:22 +0000712
713 Logs a message with level :const:`ERROR` on the root logger. The arguments are
714 interpreted as for :func:`debug`.
715
716
Georg Brandlcd7f32b2009-06-08 09:13:45 +0000717.. function:: critical(msg, *args, **kwargs)
Georg Brandl116aa622007-08-15 14:28:22 +0000718
719 Logs a message with level :const:`CRITICAL` on the root logger. The arguments
720 are interpreted as for :func:`debug`.
721
722
Georg Brandlcd7f32b2009-06-08 09:13:45 +0000723.. function:: exception(msg, *args)
Georg Brandl116aa622007-08-15 14:28:22 +0000724
725 Logs a message with level :const:`ERROR` on the root logger. The arguments are
726 interpreted as for :func:`debug`. Exception info is added to the logging
727 message. This function should only be called from an exception handler.
728
729
Georg Brandlcd7f32b2009-06-08 09:13:45 +0000730.. function:: log(level, msg, *args, **kwargs)
Georg Brandl116aa622007-08-15 14:28:22 +0000731
732 Logs a message with level *level* on the root logger. The other arguments are
733 interpreted as for :func:`debug`.
734
735
736.. function:: disable(lvl)
737
738 Provides an overriding level *lvl* for all loggers which takes precedence over
739 the logger's own level. When the need arises to temporarily throttle logging
Benjamin Peterson886af962010-03-21 23:13:07 +0000740 output down across the whole application, this function can be useful. Its
741 effect is to disable all logging calls of severity *lvl* and below, so that
742 if you call it with a value of INFO, then all INFO and DEBUG events would be
743 discarded, whereas those of severity WARNING and above would be processed
744 according to the logger's effective level.
Georg Brandl116aa622007-08-15 14:28:22 +0000745
746
747.. function:: addLevelName(lvl, levelName)
748
749 Associates level *lvl* with text *levelName* in an internal dictionary, which is
750 used to map numeric levels to a textual representation, for example when a
751 :class:`Formatter` formats a message. This function can also be used to define
752 your own levels. The only constraints are that all levels used must be
753 registered using this function, levels should be positive integers and they
754 should increase in increasing order of severity.
755
756
757.. function:: getLevelName(lvl)
758
759 Returns the textual representation of logging level *lvl*. If the level is one
760 of the predefined levels :const:`CRITICAL`, :const:`ERROR`, :const:`WARNING`,
761 :const:`INFO` or :const:`DEBUG` then you get the corresponding string. If you
762 have associated levels with names using :func:`addLevelName` then the name you
763 have associated with *lvl* is returned. If a numeric value corresponding to one
764 of the defined levels is passed in, the corresponding string representation is
765 returned. Otherwise, the string "Level %s" % lvl is returned.
766
767
768.. function:: makeLogRecord(attrdict)
769
770 Creates and returns a new :class:`LogRecord` instance whose attributes are
771 defined by *attrdict*. This function is useful for taking a pickled
772 :class:`LogRecord` attribute dictionary, sent over a socket, and reconstituting
773 it as a :class:`LogRecord` instance at the receiving end.
774
775
Georg Brandlcd7f32b2009-06-08 09:13:45 +0000776.. function:: basicConfig(**kwargs)
Georg Brandl116aa622007-08-15 14:28:22 +0000777
778 Does basic configuration for the logging system by creating a
779 :class:`StreamHandler` with a default :class:`Formatter` and adding it to the
Vinay Sajipcbabd7e2009-10-10 20:32:36 +0000780 root logger. The functions :func:`debug`, :func:`info`, :func:`warning`,
Georg Brandl116aa622007-08-15 14:28:22 +0000781 :func:`error` and :func:`critical` will call :func:`basicConfig` automatically
782 if no handlers are defined for the root logger.
783
Vinay Sajipcbabd7e2009-10-10 20:32:36 +0000784 This function does nothing if the root logger already has handlers
785 configured for it.
786
Georg Brandl116aa622007-08-15 14:28:22 +0000787 The following keyword arguments are supported.
788
789 +--------------+---------------------------------------------+
790 | Format | Description |
791 +==============+=============================================+
792 | ``filename`` | Specifies that a FileHandler be created, |
793 | | using the specified filename, rather than a |
794 | | StreamHandler. |
795 +--------------+---------------------------------------------+
796 | ``filemode`` | Specifies the mode to open the file, if |
797 | | filename is specified (if filemode is |
798 | | unspecified, it defaults to 'a'). |
799 +--------------+---------------------------------------------+
800 | ``format`` | Use the specified format string for the |
801 | | handler. |
802 +--------------+---------------------------------------------+
803 | ``datefmt`` | Use the specified date/time format. |
804 +--------------+---------------------------------------------+
805 | ``level`` | Set the root logger level to the specified |
806 | | level. |
807 +--------------+---------------------------------------------+
808 | ``stream`` | Use the specified stream to initialize the |
809 | | StreamHandler. Note that this argument is |
810 | | incompatible with 'filename' - if both are |
811 | | present, 'stream' is ignored. |
812 +--------------+---------------------------------------------+
813
814
815.. function:: shutdown()
816
817 Informs the logging system to perform an orderly shutdown by flushing and
Christian Heimesb186d002008-03-18 15:15:01 +0000818 closing all handlers. This should be called at application exit and no
819 further use of the logging system should be made after this call.
Georg Brandl116aa622007-08-15 14:28:22 +0000820
821
822.. function:: setLoggerClass(klass)
823
824 Tells the logging system to use the class *klass* when instantiating a logger.
825 The class should define :meth:`__init__` such that only a name argument is
826 required, and the :meth:`__init__` should call :meth:`Logger.__init__`. This
827 function is typically called before any loggers are instantiated by applications
828 which need to use custom logger behavior.
829
830
831.. seealso::
832
833 :pep:`282` - A Logging System
834 The proposal which described this feature for inclusion in the Python standard
835 library.
836
Christian Heimes255f53b2007-12-08 15:33:56 +0000837 `Original Python logging package <http://www.red-dove.com/python_logging.html>`_
Georg Brandl116aa622007-08-15 14:28:22 +0000838 This is the original source for the :mod:`logging` package. The version of the
839 package available from this site is suitable for use with Python 1.5.2, 2.1.x
840 and 2.2.x, which do not include the :mod:`logging` package in the standard
841 library.
842
843
844Logger Objects
845--------------
846
847Loggers have the following attributes and methods. Note that Loggers are never
848instantiated directly, but always through the module-level function
849``logging.getLogger(name)``.
850
851
852.. attribute:: Logger.propagate
853
854 If this evaluates to false, logging messages are not passed by this logger or by
Benjamin Peterson22005fc2010-04-11 16:25:06 +0000855 its child loggers to the handlers of higher level (ancestor) loggers. The
856 constructor sets this attribute to 1.
Georg Brandl116aa622007-08-15 14:28:22 +0000857
858
859.. method:: Logger.setLevel(lvl)
860
861 Sets the threshold for this logger to *lvl*. Logging messages which are less
862 severe than *lvl* will be ignored. When a logger is created, the level is set to
863 :const:`NOTSET` (which causes all messages to be processed when the logger is
864 the root logger, or delegation to the parent when the logger is a non-root
865 logger). Note that the root logger is created with level :const:`WARNING`.
866
867 The term "delegation to the parent" means that if a logger has a level of
868 NOTSET, its chain of ancestor loggers is traversed until either an ancestor with
869 a level other than NOTSET is found, or the root is reached.
870
871 If an ancestor is found with a level other than NOTSET, then that ancestor's
872 level is treated as the effective level of the logger where the ancestor search
873 began, and is used to determine how a logging event is handled.
874
875 If the root is reached, and it has a level of NOTSET, then all messages will be
876 processed. Otherwise, the root's level will be used as the effective level.
877
878
879.. method:: Logger.isEnabledFor(lvl)
880
881 Indicates if a message of severity *lvl* would be processed by this logger.
882 This method checks first the module-level level set by
883 ``logging.disable(lvl)`` and then the logger's effective level as determined
884 by :meth:`getEffectiveLevel`.
885
886
887.. method:: Logger.getEffectiveLevel()
888
889 Indicates the effective level for this logger. If a value other than
890 :const:`NOTSET` has been set using :meth:`setLevel`, it is returned. Otherwise,
891 the hierarchy is traversed towards the root until a value other than
892 :const:`NOTSET` is found, and that value is returned.
893
894
Benjamin Peterson22005fc2010-04-11 16:25:06 +0000895.. method:: Logger.getChild(suffix)
896
897 Returns a logger which is a descendant to this logger, as determined by the suffix.
898 Thus, ``logging.getLogger('abc').getChild('def.ghi')`` would return the same
899 logger as would be returned by ``logging.getLogger('abc.def.ghi')``. This is a
900 convenience method, useful when the parent logger is named using e.g. ``__name__``
901 rather than a literal string.
902
903 .. versionadded:: 3.2
904
Georg Brandlcd7f32b2009-06-08 09:13:45 +0000905.. method:: Logger.debug(msg, *args, **kwargs)
Georg Brandl116aa622007-08-15 14:28:22 +0000906
907 Logs a message with level :const:`DEBUG` on this logger. The *msg* is the
908 message format string, and the *args* are the arguments which are merged into
909 *msg* using the string formatting operator. (Note that this means that you can
910 use keywords in the format string, together with a single dictionary argument.)
911
912 There are two keyword arguments in *kwargs* which are inspected: *exc_info*
913 which, if it does not evaluate as false, causes exception information to be
914 added to the logging message. If an exception tuple (in the format returned by
915 :func:`sys.exc_info`) is provided, it is used; otherwise, :func:`sys.exc_info`
916 is called to get the exception information.
917
918 The other optional keyword argument is *extra* which can be used to pass a
919 dictionary which is used to populate the __dict__ of the LogRecord created for
920 the logging event with user-defined attributes. These custom attributes can then
921 be used as you like. For example, they could be incorporated into logged
922 messages. For example::
923
924 FORMAT = "%(asctime)-15s %(clientip)s %(user)-8s %(message)s"
925 logging.basicConfig(format=FORMAT)
Georg Brandl9afde1c2007-11-01 20:32:30 +0000926 d = { 'clientip' : '192.168.0.1', 'user' : 'fbloggs' }
Georg Brandl116aa622007-08-15 14:28:22 +0000927 logger = logging.getLogger("tcpserver")
928 logger.warning("Protocol problem: %s", "connection reset", extra=d)
929
930 would print something like ::
931
932 2006-02-08 22:20:02,165 192.168.0.1 fbloggs Protocol problem: connection reset
933
934 The keys in the dictionary passed in *extra* should not clash with the keys used
935 by the logging system. (See the :class:`Formatter` documentation for more
936 information on which keys are used by the logging system.)
937
938 If you choose to use these attributes in logged messages, you need to exercise
939 some care. In the above example, for instance, the :class:`Formatter` has been
940 set up with a format string which expects 'clientip' and 'user' in the attribute
941 dictionary of the LogRecord. If these are missing, the message will not be
942 logged because a string formatting exception will occur. So in this case, you
943 always need to pass the *extra* dictionary with these keys.
944
945 While this might be annoying, this feature is intended for use in specialized
946 circumstances, such as multi-threaded servers where the same code executes in
947 many contexts, and interesting conditions which arise are dependent on this
948 context (such as remote client IP address and authenticated user name, in the
949 above example). In such circumstances, it is likely that specialized
950 :class:`Formatter`\ s would be used with particular :class:`Handler`\ s.
951
Georg Brandl116aa622007-08-15 14:28:22 +0000952
Georg Brandlcd7f32b2009-06-08 09:13:45 +0000953.. method:: Logger.info(msg, *args, **kwargs)
Georg Brandl116aa622007-08-15 14:28:22 +0000954
955 Logs a message with level :const:`INFO` on this logger. The arguments are
956 interpreted as for :meth:`debug`.
957
958
Georg Brandlcd7f32b2009-06-08 09:13:45 +0000959.. method:: Logger.warning(msg, *args, **kwargs)
Georg Brandl116aa622007-08-15 14:28:22 +0000960
961 Logs a message with level :const:`WARNING` on this logger. The arguments are
962 interpreted as for :meth:`debug`.
963
964
Georg Brandlcd7f32b2009-06-08 09:13:45 +0000965.. method:: Logger.error(msg, *args, **kwargs)
Georg Brandl116aa622007-08-15 14:28:22 +0000966
967 Logs a message with level :const:`ERROR` on this logger. The arguments are
968 interpreted as for :meth:`debug`.
969
970
Georg Brandlcd7f32b2009-06-08 09:13:45 +0000971.. method:: Logger.critical(msg, *args, **kwargs)
Georg Brandl116aa622007-08-15 14:28:22 +0000972
973 Logs a message with level :const:`CRITICAL` on this logger. The arguments are
974 interpreted as for :meth:`debug`.
975
976
Georg Brandlcd7f32b2009-06-08 09:13:45 +0000977.. method:: Logger.log(lvl, msg, *args, **kwargs)
Georg Brandl116aa622007-08-15 14:28:22 +0000978
979 Logs a message with integer level *lvl* on this logger. The other arguments are
980 interpreted as for :meth:`debug`.
981
982
Georg Brandlcd7f32b2009-06-08 09:13:45 +0000983.. method:: Logger.exception(msg, *args)
Georg Brandl116aa622007-08-15 14:28:22 +0000984
985 Logs a message with level :const:`ERROR` on this logger. The arguments are
986 interpreted as for :meth:`debug`. Exception info is added to the logging
987 message. This method should only be called from an exception handler.
988
989
990.. method:: Logger.addFilter(filt)
991
992 Adds the specified filter *filt* to this logger.
993
994
995.. method:: Logger.removeFilter(filt)
996
997 Removes the specified filter *filt* from this logger.
998
999
1000.. method:: Logger.filter(record)
1001
1002 Applies this logger's filters to the record and returns a true value if the
1003 record is to be processed.
1004
1005
1006.. method:: Logger.addHandler(hdlr)
1007
1008 Adds the specified handler *hdlr* to this logger.
1009
1010
1011.. method:: Logger.removeHandler(hdlr)
1012
1013 Removes the specified handler *hdlr* from this logger.
1014
1015
1016.. method:: Logger.findCaller()
1017
1018 Finds the caller's source filename and line number. Returns the filename, line
1019 number and function name as a 3-element tuple.
1020
Georg Brandl116aa622007-08-15 14:28:22 +00001021
1022.. method:: Logger.handle(record)
1023
1024 Handles a record by passing it to all handlers associated with this logger and
1025 its ancestors (until a false value of *propagate* is found). This method is used
1026 for unpickled records received from a socket, as well as those created locally.
Georg Brandl502d9a52009-07-26 15:02:41 +00001027 Logger-level filtering is applied using :meth:`~Logger.filter`.
Georg Brandl116aa622007-08-15 14:28:22 +00001028
1029
Georg Brandlcd7f32b2009-06-08 09:13:45 +00001030.. method:: Logger.makeRecord(name, lvl, fn, lno, msg, args, exc_info, func=None, extra=None)
Georg Brandl116aa622007-08-15 14:28:22 +00001031
1032 This is a factory method which can be overridden in subclasses to create
1033 specialized :class:`LogRecord` instances.
1034
Georg Brandl116aa622007-08-15 14:28:22 +00001035
1036.. _minimal-example:
1037
1038Basic example
1039-------------
1040
Georg Brandl116aa622007-08-15 14:28:22 +00001041The :mod:`logging` package provides a lot of flexibility, and its configuration
1042can appear daunting. This section demonstrates that simple use of the logging
1043package is possible.
1044
1045The simplest example shows logging to the console::
1046
1047 import logging
1048
1049 logging.debug('A debug message')
1050 logging.info('Some information')
1051 logging.warning('A shot across the bows')
1052
1053If you run the above script, you'll see this::
1054
1055 WARNING:root:A shot across the bows
1056
1057Because no particular logger was specified, the system used the root logger. The
1058debug and info messages didn't appear because by default, the root logger is
1059configured to only handle messages with a severity of WARNING or above. The
1060message format is also a configuration default, as is the output destination of
1061the messages - ``sys.stderr``. The severity level, the message format and
1062destination can be easily changed, as shown in the example below::
1063
1064 import logging
1065
1066 logging.basicConfig(level=logging.DEBUG,
1067 format='%(asctime)s %(levelname)s %(message)s',
1068 filename='/tmp/myapp.log',
1069 filemode='w')
1070 logging.debug('A debug message')
1071 logging.info('Some information')
1072 logging.warning('A shot across the bows')
1073
1074The :meth:`basicConfig` method is used to change the configuration defaults,
1075which results in output (written to ``/tmp/myapp.log``) which should look
1076something like the following::
1077
1078 2004-07-02 13:00:08,743 DEBUG A debug message
1079 2004-07-02 13:00:08,743 INFO Some information
1080 2004-07-02 13:00:08,743 WARNING A shot across the bows
1081
1082This time, all messages with a severity of DEBUG or above were handled, and the
1083format of the messages was also changed, and output went to the specified file
1084rather than the console.
1085
Georg Brandl81ac1ce2007-08-31 17:17:17 +00001086.. XXX logging should probably be updated for new string formatting!
Georg Brandl4b491312007-08-31 09:22:56 +00001087
1088Formatting uses the old Python string formatting - see section
1089:ref:`old-string-formatting`. The format string takes the following common
Georg Brandl116aa622007-08-15 14:28:22 +00001090specifiers. For a complete list of specifiers, consult the :class:`Formatter`
1091documentation.
1092
1093+-------------------+-----------------------------------------------+
1094| Format | Description |
1095+===================+===============================================+
1096| ``%(name)s`` | Name of the logger (logging channel). |
1097+-------------------+-----------------------------------------------+
1098| ``%(levelname)s`` | Text logging level for the message |
1099| | (``'DEBUG'``, ``'INFO'``, ``'WARNING'``, |
1100| | ``'ERROR'``, ``'CRITICAL'``). |
1101+-------------------+-----------------------------------------------+
1102| ``%(asctime)s`` | Human-readable time when the |
1103| | :class:`LogRecord` was created. By default |
1104| | this is of the form "2003-07-08 16:49:45,896" |
1105| | (the numbers after the comma are millisecond |
1106| | portion of the time). |
1107+-------------------+-----------------------------------------------+
1108| ``%(message)s`` | The logged message. |
1109+-------------------+-----------------------------------------------+
1110
1111To change the date/time format, you can pass an additional keyword parameter,
1112*datefmt*, as in the following::
1113
1114 import logging
1115
1116 logging.basicConfig(level=logging.DEBUG,
1117 format='%(asctime)s %(levelname)-8s %(message)s',
1118 datefmt='%a, %d %b %Y %H:%M:%S',
1119 filename='/temp/myapp.log',
1120 filemode='w')
1121 logging.debug('A debug message')
1122 logging.info('Some information')
1123 logging.warning('A shot across the bows')
1124
1125which would result in output like ::
1126
1127 Fri, 02 Jul 2004 13:06:18 DEBUG A debug message
1128 Fri, 02 Jul 2004 13:06:18 INFO Some information
1129 Fri, 02 Jul 2004 13:06:18 WARNING A shot across the bows
1130
1131The date format string follows the requirements of :func:`strftime` - see the
1132documentation for the :mod:`time` module.
1133
1134If, instead of sending logging output to the console or a file, you'd rather use
1135a file-like object which you have created separately, you can pass it to
1136:func:`basicConfig` using the *stream* keyword argument. Note that if both
1137*stream* and *filename* keyword arguments are passed, the *stream* argument is
1138ignored.
1139
1140Of course, you can put variable information in your output. To do this, simply
1141have the message be a format string and pass in additional arguments containing
1142the variable information, as in the following example::
1143
1144 import logging
1145
1146 logging.basicConfig(level=logging.DEBUG,
1147 format='%(asctime)s %(levelname)-8s %(message)s',
1148 datefmt='%a, %d %b %Y %H:%M:%S',
1149 filename='/temp/myapp.log',
1150 filemode='w')
1151 logging.error('Pack my box with %d dozen %s', 5, 'liquor jugs')
1152
1153which would result in ::
1154
1155 Wed, 21 Jul 2004 15:35:16 ERROR Pack my box with 5 dozen liquor jugs
1156
1157
1158.. _multiple-destinations:
1159
1160Logging to multiple destinations
1161--------------------------------
1162
1163Let's say you want to log to console and file with different message formats and
1164in differing circumstances. Say you want to log messages with levels of DEBUG
1165and higher to file, and those messages at level INFO and higher to the console.
1166Let's also assume that the file should contain timestamps, but the console
1167messages should not. Here's how you can achieve this::
1168
1169 import logging
1170
1171 # set up logging to file - see previous section for more details
1172 logging.basicConfig(level=logging.DEBUG,
1173 format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
1174 datefmt='%m-%d %H:%M',
1175 filename='/temp/myapp.log',
1176 filemode='w')
1177 # define a Handler which writes INFO messages or higher to the sys.stderr
1178 console = logging.StreamHandler()
1179 console.setLevel(logging.INFO)
1180 # set a format which is simpler for console use
1181 formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
1182 # tell the handler to use this format
1183 console.setFormatter(formatter)
1184 # add the handler to the root logger
1185 logging.getLogger('').addHandler(console)
1186
1187 # Now, we can log to the root logger, or any other logger. First the root...
1188 logging.info('Jackdaws love my big sphinx of quartz.')
1189
1190 # Now, define a couple of other loggers which might represent areas in your
1191 # application:
1192
1193 logger1 = logging.getLogger('myapp.area1')
1194 logger2 = logging.getLogger('myapp.area2')
1195
1196 logger1.debug('Quick zephyrs blow, vexing daft Jim.')
1197 logger1.info('How quickly daft jumping zebras vex.')
1198 logger2.warning('Jail zesty vixen who grabbed pay from quack.')
1199 logger2.error('The five boxing wizards jump quickly.')
1200
1201When you run this, on the console you will see ::
1202
1203 root : INFO Jackdaws love my big sphinx of quartz.
1204 myapp.area1 : INFO How quickly daft jumping zebras vex.
1205 myapp.area2 : WARNING Jail zesty vixen who grabbed pay from quack.
1206 myapp.area2 : ERROR The five boxing wizards jump quickly.
1207
1208and in the file you will see something like ::
1209
1210 10-22 22:19 root INFO Jackdaws love my big sphinx of quartz.
1211 10-22 22:19 myapp.area1 DEBUG Quick zephyrs blow, vexing daft Jim.
1212 10-22 22:19 myapp.area1 INFO How quickly daft jumping zebras vex.
1213 10-22 22:19 myapp.area2 WARNING Jail zesty vixen who grabbed pay from quack.
1214 10-22 22:19 myapp.area2 ERROR The five boxing wizards jump quickly.
1215
1216As you can see, the DEBUG message only shows up in the file. The other messages
1217are sent to both destinations.
1218
1219This example uses console and file handlers, but you can use any number and
1220combination of handlers you choose.
1221
Vinay Sajip3ee22ec2009-08-20 22:05:10 +00001222.. _logging-exceptions:
1223
1224Exceptions raised during logging
1225--------------------------------
1226
1227The logging package is designed to swallow exceptions which occur while logging
1228in production. This is so that errors which occur while handling logging events
1229- such as logging misconfiguration, network or other similar errors - do not
1230cause the application using logging to terminate prematurely.
1231
1232:class:`SystemExit` and :class:`KeyboardInterrupt` exceptions are never
1233swallowed. Other exceptions which occur during the :meth:`emit` method of a
1234:class:`Handler` subclass are passed to its :meth:`handleError` method.
1235
1236The default implementation of :meth:`handleError` in :class:`Handler` checks
Georg Brandlef871f62010-03-12 10:06:40 +00001237to see if a module-level variable, :data:`raiseExceptions`, is set. If set, a
1238traceback is printed to :data:`sys.stderr`. If not set, the exception is swallowed.
Vinay Sajip3ee22ec2009-08-20 22:05:10 +00001239
Georg Brandlef871f62010-03-12 10:06:40 +00001240**Note:** The default value of :data:`raiseExceptions` is ``True``. This is because
Vinay Sajip3ee22ec2009-08-20 22:05:10 +00001241during development, you typically want to be notified of any exceptions that
Georg Brandlef871f62010-03-12 10:06:40 +00001242occur. It's advised that you set :data:`raiseExceptions` to ``False`` for production
Vinay Sajip3ee22ec2009-08-20 22:05:10 +00001243usage.
Georg Brandl116aa622007-08-15 14:28:22 +00001244
Christian Heimes790c8232008-01-07 21:14:23 +00001245.. _context-info:
1246
1247Adding contextual information to your logging output
1248----------------------------------------------------
1249
1250Sometimes you want logging output to contain contextual information in
1251addition to the parameters passed to the logging call. For example, in a
1252networked application, it may be desirable to log client-specific information
1253in the log (e.g. remote client's username, or IP address). Although you could
1254use the *extra* parameter to achieve this, it's not always convenient to pass
1255the information in this way. While it might be tempting to create
1256:class:`Logger` instances on a per-connection basis, this is not a good idea
1257because these instances are not garbage collected. While this is not a problem
1258in practice, when the number of :class:`Logger` instances is dependent on the
1259level of granularity you want to use in logging an application, it could
1260be hard to manage if the number of :class:`Logger` instances becomes
1261effectively unbounded.
1262
Christian Heimes04c420f2008-01-18 18:40:46 +00001263An easy way in which you can pass contextual information to be output along
1264with logging event information is to use the :class:`LoggerAdapter` class.
1265This class is designed to look like a :class:`Logger`, so that you can call
1266:meth:`debug`, :meth:`info`, :meth:`warning`, :meth:`error`,
1267:meth:`exception`, :meth:`critical` and :meth:`log`. These methods have the
1268same signatures as their counterparts in :class:`Logger`, so you can use the
1269two types of instances interchangeably.
Christian Heimes790c8232008-01-07 21:14:23 +00001270
Christian Heimes04c420f2008-01-18 18:40:46 +00001271When you create an instance of :class:`LoggerAdapter`, you pass it a
1272:class:`Logger` instance and a dict-like object which contains your contextual
1273information. When you call one of the logging methods on an instance of
1274:class:`LoggerAdapter`, it delegates the call to the underlying instance of
1275:class:`Logger` passed to its constructor, and arranges to pass the contextual
1276information in the delegated call. Here's a snippet from the code of
1277:class:`LoggerAdapter`::
Christian Heimes790c8232008-01-07 21:14:23 +00001278
Christian Heimes04c420f2008-01-18 18:40:46 +00001279 def debug(self, msg, *args, **kwargs):
1280 """
1281 Delegate a debug call to the underlying logger, after adding
1282 contextual information from this adapter instance.
1283 """
1284 msg, kwargs = self.process(msg, kwargs)
1285 self.logger.debug(msg, *args, **kwargs)
Christian Heimes790c8232008-01-07 21:14:23 +00001286
Christian Heimes04c420f2008-01-18 18:40:46 +00001287The :meth:`process` method of :class:`LoggerAdapter` is where the contextual
1288information is added to the logging output. It's passed the message and
1289keyword arguments of the logging call, and it passes back (potentially)
1290modified versions of these to use in the call to the underlying logger. The
1291default implementation of this method leaves the message alone, but inserts
1292an "extra" key in the keyword argument whose value is the dict-like object
1293passed to the constructor. Of course, if you had passed an "extra" keyword
1294argument in the call to the adapter, it will be silently overwritten.
Christian Heimes790c8232008-01-07 21:14:23 +00001295
Christian Heimes04c420f2008-01-18 18:40:46 +00001296The advantage of using "extra" is that the values in the dict-like object are
1297merged into the :class:`LogRecord` instance's __dict__, allowing you to use
1298customized strings with your :class:`Formatter` instances which know about
1299the keys of the dict-like object. If you need a different method, e.g. if you
1300want to prepend or append the contextual information to the message string,
1301you just need to subclass :class:`LoggerAdapter` and override :meth:`process`
1302to do what you need. Here's an example script which uses this class, which
1303also illustrates what dict-like behaviour is needed from an arbitrary
1304"dict-like" object for use in the constructor::
1305
Christian Heimes587c2bf2008-01-19 16:21:02 +00001306 import logging
Georg Brandl86def6c2008-01-21 20:36:10 +00001307
Christian Heimes587c2bf2008-01-19 16:21:02 +00001308 class ConnInfo:
1309 """
1310 An example class which shows how an arbitrary class can be used as
1311 the 'extra' context information repository passed to a LoggerAdapter.
1312 """
Georg Brandl86def6c2008-01-21 20:36:10 +00001313
Christian Heimes587c2bf2008-01-19 16:21:02 +00001314 def __getitem__(self, name):
1315 """
1316 To allow this instance to look like a dict.
1317 """
1318 from random import choice
1319 if name == "ip":
1320 result = choice(["127.0.0.1", "192.168.0.1"])
1321 elif name == "user":
1322 result = choice(["jim", "fred", "sheila"])
1323 else:
1324 result = self.__dict__.get(name, "?")
1325 return result
Georg Brandl86def6c2008-01-21 20:36:10 +00001326
Christian Heimes587c2bf2008-01-19 16:21:02 +00001327 def __iter__(self):
1328 """
1329 To allow iteration over keys, which will be merged into
1330 the LogRecord dict before formatting and output.
1331 """
1332 keys = ["ip", "user"]
1333 keys.extend(self.__dict__.keys())
1334 return keys.__iter__()
Georg Brandl86def6c2008-01-21 20:36:10 +00001335
Christian Heimes587c2bf2008-01-19 16:21:02 +00001336 if __name__ == "__main__":
1337 from random import choice
1338 levels = (logging.DEBUG, logging.INFO, logging.WARNING, logging.ERROR, logging.CRITICAL)
1339 a1 = logging.LoggerAdapter(logging.getLogger("a.b.c"),
1340 { "ip" : "123.231.231.123", "user" : "sheila" })
1341 logging.basicConfig(level=logging.DEBUG,
1342 format="%(asctime)-15s %(name)-5s %(levelname)-8s IP: %(ip)-15s User: %(user)-8s %(message)s")
1343 a1.debug("A debug message")
1344 a1.info("An info message with %s", "some parameters")
1345 a2 = logging.LoggerAdapter(logging.getLogger("d.e.f"), ConnInfo())
1346 for x in range(10):
1347 lvl = choice(levels)
1348 lvlname = logging.getLevelName(lvl)
1349 a2.log(lvl, "A message at %s level with %d %s", lvlname, 2, "parameters")
Christian Heimes04c420f2008-01-18 18:40:46 +00001350
1351When this script is run, the output should look something like this::
1352
Christian Heimes587c2bf2008-01-19 16:21:02 +00001353 2008-01-18 14:49:54,023 a.b.c DEBUG IP: 123.231.231.123 User: sheila A debug message
1354 2008-01-18 14:49:54,023 a.b.c INFO IP: 123.231.231.123 User: sheila An info message with some parameters
1355 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
1356 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
1357 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
1358 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
1359 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
1360 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
1361 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
1362 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
1363 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
1364 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
Christian Heimes04c420f2008-01-18 18:40:46 +00001365
Christian Heimes790c8232008-01-07 21:14:23 +00001366
Vinay Sajipa7471bf2009-08-15 23:23:37 +00001367Logging to a single file from multiple processes
1368------------------------------------------------
1369
1370Although logging is thread-safe, and logging to a single file from multiple
1371threads in a single process *is* supported, logging to a single file from
1372*multiple processes* is *not* supported, because there is no standard way to
1373serialize access to a single file across multiple processes in Python. If you
1374need to log to a single file from multiple processes, the best way of doing
1375this is to have all the processes log to a :class:`SocketHandler`, and have a
1376separate process which implements a socket server which reads from the socket
1377and logs to file. (If you prefer, you can dedicate one thread in one of the
1378existing processes to perform this function.) The following section documents
1379this approach in more detail and includes a working socket receiver which can
1380be used as a starting point for you to adapt in your own applications.
1381
Vinay Sajip5a92b132009-08-15 23:35:08 +00001382If you are using a recent version of Python which includes the
1383:mod:`multiprocessing` module, you can write your own handler which uses the
1384:class:`Lock` class from this module to serialize access to the file from
1385your processes. The existing :class:`FileHandler` and subclasses do not make
1386use of :mod:`multiprocessing` at present, though they may do so in the future.
Vinay Sajip8c6b0a52009-08-17 13:17:47 +00001387Note that at present, the :mod:`multiprocessing` module does not provide
1388working lock functionality on all platforms (see
1389http://bugs.python.org/issue3770).
Vinay Sajip5a92b132009-08-15 23:35:08 +00001390
Benjamin Peterson8719ad52009-09-11 22:24:02 +00001391
Georg Brandl116aa622007-08-15 14:28:22 +00001392.. _network-logging:
1393
1394Sending and receiving logging events across a network
1395-----------------------------------------------------
1396
1397Let's say you want to send logging events across a network, and handle them at
1398the receiving end. A simple way of doing this is attaching a
1399:class:`SocketHandler` instance to the root logger at the sending end::
1400
1401 import logging, logging.handlers
1402
1403 rootLogger = logging.getLogger('')
1404 rootLogger.setLevel(logging.DEBUG)
1405 socketHandler = logging.handlers.SocketHandler('localhost',
1406 logging.handlers.DEFAULT_TCP_LOGGING_PORT)
1407 # don't bother with a formatter, since a socket handler sends the event as
1408 # an unformatted pickle
1409 rootLogger.addHandler(socketHandler)
1410
1411 # Now, we can log to the root logger, or any other logger. First the root...
1412 logging.info('Jackdaws love my big sphinx of quartz.')
1413
1414 # Now, define a couple of other loggers which might represent areas in your
1415 # application:
1416
1417 logger1 = logging.getLogger('myapp.area1')
1418 logger2 = logging.getLogger('myapp.area2')
1419
1420 logger1.debug('Quick zephyrs blow, vexing daft Jim.')
1421 logger1.info('How quickly daft jumping zebras vex.')
1422 logger2.warning('Jail zesty vixen who grabbed pay from quack.')
1423 logger2.error('The five boxing wizards jump quickly.')
1424
Alexandre Vassalottice261952008-05-12 02:31:37 +00001425At the receiving end, you can set up a receiver using the :mod:`socketserver`
Georg Brandl116aa622007-08-15 14:28:22 +00001426module. Here is a basic working example::
1427
Georg Brandla35f4b92009-05-31 16:41:59 +00001428 import pickle
Georg Brandl116aa622007-08-15 14:28:22 +00001429 import logging
1430 import logging.handlers
Alexandre Vassalottice261952008-05-12 02:31:37 +00001431 import socketserver
Georg Brandl116aa622007-08-15 14:28:22 +00001432 import struct
1433
1434
Alexandre Vassalottice261952008-05-12 02:31:37 +00001435 class LogRecordStreamHandler(socketserver.StreamRequestHandler):
Georg Brandl116aa622007-08-15 14:28:22 +00001436 """Handler for a streaming logging request.
1437
1438 This basically logs the record using whatever logging policy is
1439 configured locally.
1440 """
1441
1442 def handle(self):
1443 """
1444 Handle multiple requests - each expected to be a 4-byte length,
1445 followed by the LogRecord in pickle format. Logs the record
1446 according to whatever policy is configured locally.
1447 """
Collin Winter46334482007-09-10 00:49:57 +00001448 while True:
Georg Brandl116aa622007-08-15 14:28:22 +00001449 chunk = self.connection.recv(4)
1450 if len(chunk) < 4:
1451 break
1452 slen = struct.unpack(">L", chunk)[0]
1453 chunk = self.connection.recv(slen)
1454 while len(chunk) < slen:
1455 chunk = chunk + self.connection.recv(slen - len(chunk))
1456 obj = self.unPickle(chunk)
1457 record = logging.makeLogRecord(obj)
1458 self.handleLogRecord(record)
1459
1460 def unPickle(self, data):
Georg Brandla35f4b92009-05-31 16:41:59 +00001461 return pickle.loads(data)
Georg Brandl116aa622007-08-15 14:28:22 +00001462
1463 def handleLogRecord(self, record):
1464 # if a name is specified, we use the named logger rather than the one
1465 # implied by the record.
1466 if self.server.logname is not None:
1467 name = self.server.logname
1468 else:
1469 name = record.name
1470 logger = logging.getLogger(name)
1471 # N.B. EVERY record gets logged. This is because Logger.handle
1472 # is normally called AFTER logger-level filtering. If you want
1473 # to do filtering, do it at the client end to save wasting
1474 # cycles and network bandwidth!
1475 logger.handle(record)
1476
Alexandre Vassalottice261952008-05-12 02:31:37 +00001477 class LogRecordSocketReceiver(socketserver.ThreadingTCPServer):
Georg Brandl116aa622007-08-15 14:28:22 +00001478 """simple TCP socket-based logging receiver suitable for testing.
1479 """
1480
1481 allow_reuse_address = 1
1482
1483 def __init__(self, host='localhost',
1484 port=logging.handlers.DEFAULT_TCP_LOGGING_PORT,
1485 handler=LogRecordStreamHandler):
Alexandre Vassalottice261952008-05-12 02:31:37 +00001486 socketserver.ThreadingTCPServer.__init__(self, (host, port), handler)
Georg Brandl116aa622007-08-15 14:28:22 +00001487 self.abort = 0
1488 self.timeout = 1
1489 self.logname = None
1490
1491 def serve_until_stopped(self):
1492 import select
1493 abort = 0
1494 while not abort:
1495 rd, wr, ex = select.select([self.socket.fileno()],
1496 [], [],
1497 self.timeout)
1498 if rd:
1499 self.handle_request()
1500 abort = self.abort
1501
1502 def main():
1503 logging.basicConfig(
1504 format="%(relativeCreated)5d %(name)-15s %(levelname)-8s %(message)s")
1505 tcpserver = LogRecordSocketReceiver()
Georg Brandl6911e3c2007-09-04 07:15:32 +00001506 print("About to start TCP server...")
Georg Brandl116aa622007-08-15 14:28:22 +00001507 tcpserver.serve_until_stopped()
1508
1509 if __name__ == "__main__":
1510 main()
1511
1512First run the server, and then the client. On the client side, nothing is
1513printed on the console; on the server side, you should see something like::
1514
1515 About to start TCP server...
1516 59 root INFO Jackdaws love my big sphinx of quartz.
1517 59 myapp.area1 DEBUG Quick zephyrs blow, vexing daft Jim.
1518 69 myapp.area1 INFO How quickly daft jumping zebras vex.
1519 69 myapp.area2 WARNING Jail zesty vixen who grabbed pay from quack.
1520 69 myapp.area2 ERROR The five boxing wizards jump quickly.
1521
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +00001522Using arbitrary objects as messages
1523-----------------------------------
1524
1525In the preceding sections and examples, it has been assumed that the message
1526passed when logging the event is a string. However, this is not the only
1527possibility. You can pass an arbitrary object as a message, and its
1528:meth:`__str__` method will be called when the logging system needs to convert
1529it to a string representation. In fact, if you want to, you can avoid
1530computing a string representation altogether - for example, the
1531:class:`SocketHandler` emits an event by pickling it and sending it over the
1532wire.
1533
1534Optimization
1535------------
1536
1537Formatting of message arguments is deferred until it cannot be avoided.
1538However, computing the arguments passed to the logging method can also be
1539expensive, and you may want to avoid doing it if the logger will just throw
1540away your event. To decide what to do, you can call the :meth:`isEnabledFor`
1541method which takes a level argument and returns true if the event would be
1542created by the Logger for that level of call. You can write code like this::
1543
1544 if logger.isEnabledFor(logging.DEBUG):
1545 logger.debug("Message with %s, %s", expensive_func1(),
1546 expensive_func2())
1547
1548so that if the logger's threshold is set above ``DEBUG``, the calls to
1549:func:`expensive_func1` and :func:`expensive_func2` are never made.
1550
1551There are other optimizations which can be made for specific applications which
1552need more precise control over what logging information is collected. Here's a
1553list of things you can do to avoid processing during logging which you don't
1554need:
1555
1556+-----------------------------------------------+----------------------------------------+
1557| What you don't want to collect | How to avoid collecting it |
1558+===============================================+========================================+
1559| Information about where calls were made from. | Set ``logging._srcfile`` to ``None``. |
1560+-----------------------------------------------+----------------------------------------+
1561| Threading information. | Set ``logging.logThreads`` to ``0``. |
1562+-----------------------------------------------+----------------------------------------+
1563| Process information. | Set ``logging.logProcesses`` to ``0``. |
1564+-----------------------------------------------+----------------------------------------+
1565
1566Also note that the core logging module only includes the basic handlers. If
1567you don't import :mod:`logging.handlers` and :mod:`logging.config`, they won't
1568take up any memory.
1569
1570.. _handler:
Georg Brandl116aa622007-08-15 14:28:22 +00001571
1572Handler Objects
1573---------------
1574
1575Handlers have the following attributes and methods. Note that :class:`Handler`
1576is never instantiated directly; this class acts as a base for more useful
1577subclasses. However, the :meth:`__init__` method in subclasses needs to call
1578:meth:`Handler.__init__`.
1579
1580
1581.. method:: Handler.__init__(level=NOTSET)
1582
1583 Initializes the :class:`Handler` instance by setting its level, setting the list
1584 of filters to the empty list and creating a lock (using :meth:`createLock`) for
1585 serializing access to an I/O mechanism.
1586
1587
1588.. method:: Handler.createLock()
1589
1590 Initializes a thread lock which can be used to serialize access to underlying
1591 I/O functionality which may not be threadsafe.
1592
1593
1594.. method:: Handler.acquire()
1595
1596 Acquires the thread lock created with :meth:`createLock`.
1597
1598
1599.. method:: Handler.release()
1600
1601 Releases the thread lock acquired with :meth:`acquire`.
1602
1603
1604.. method:: Handler.setLevel(lvl)
1605
1606 Sets the threshold for this handler to *lvl*. Logging messages which are less
1607 severe than *lvl* will be ignored. When a handler is created, the level is set
1608 to :const:`NOTSET` (which causes all messages to be processed).
1609
1610
1611.. method:: Handler.setFormatter(form)
1612
1613 Sets the :class:`Formatter` for this handler to *form*.
1614
1615
1616.. method:: Handler.addFilter(filt)
1617
1618 Adds the specified filter *filt* to this handler.
1619
1620
1621.. method:: Handler.removeFilter(filt)
1622
1623 Removes the specified filter *filt* from this handler.
1624
1625
1626.. method:: Handler.filter(record)
1627
1628 Applies this handler's filters to the record and returns a true value if the
1629 record is to be processed.
1630
1631
1632.. method:: Handler.flush()
1633
1634 Ensure all logging output has been flushed. This version does nothing and is
1635 intended to be implemented by subclasses.
1636
1637
1638.. method:: Handler.close()
1639
Benjamin Peterson3e4f0552008-09-02 00:31:15 +00001640 Tidy up any resources used by the handler. This version does no output but
1641 removes the handler from an internal list of handlers which is closed when
1642 :func:`shutdown` is called. Subclasses should ensure that this gets called
1643 from overridden :meth:`close` methods.
Georg Brandl116aa622007-08-15 14:28:22 +00001644
1645
1646.. method:: Handler.handle(record)
1647
1648 Conditionally emits the specified logging record, depending on filters which may
1649 have been added to the handler. Wraps the actual emission of the record with
1650 acquisition/release of the I/O thread lock.
1651
1652
1653.. method:: Handler.handleError(record)
1654
1655 This method should be called from handlers when an exception is encountered
1656 during an :meth:`emit` call. By default it does nothing, which means that
1657 exceptions get silently ignored. This is what is mostly wanted for a logging
1658 system - most users will not care about errors in the logging system, they are
1659 more interested in application errors. You could, however, replace this with a
1660 custom handler if you wish. The specified record is the one which was being
1661 processed when the exception occurred.
1662
1663
1664.. method:: Handler.format(record)
1665
1666 Do formatting for a record - if a formatter is set, use it. Otherwise, use the
1667 default formatter for the module.
1668
1669
1670.. method:: Handler.emit(record)
1671
1672 Do whatever it takes to actually log the specified logging record. This version
1673 is intended to be implemented by subclasses and so raises a
1674 :exc:`NotImplementedError`.
1675
1676
1677StreamHandler
1678^^^^^^^^^^^^^
1679
1680The :class:`StreamHandler` class, located in the core :mod:`logging` package,
1681sends logging output to streams such as *sys.stdout*, *sys.stderr* or any
1682file-like object (or, more precisely, any object which supports :meth:`write`
1683and :meth:`flush` methods).
1684
1685
Benjamin Peterson1baf4652009-12-31 03:11:23 +00001686.. currentmodule:: logging
1687
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +00001688.. class:: StreamHandler(stream=None)
Georg Brandl116aa622007-08-15 14:28:22 +00001689
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +00001690 Returns a new instance of the :class:`StreamHandler` class. If *stream* is
Georg Brandl116aa622007-08-15 14:28:22 +00001691 specified, the instance will use it for logging output; otherwise, *sys.stderr*
1692 will be used.
1693
1694
Benjamin Petersone41251e2008-04-25 01:59:09 +00001695 .. method:: emit(record)
Georg Brandl116aa622007-08-15 14:28:22 +00001696
Benjamin Petersone41251e2008-04-25 01:59:09 +00001697 If a formatter is specified, it is used to format the record. The record
1698 is then written to the stream with a trailing newline. If exception
1699 information is present, it is formatted using
1700 :func:`traceback.print_exception` and appended to the stream.
Georg Brandl116aa622007-08-15 14:28:22 +00001701
1702
Benjamin Petersone41251e2008-04-25 01:59:09 +00001703 .. method:: flush()
Georg Brandl116aa622007-08-15 14:28:22 +00001704
Benjamin Petersone41251e2008-04-25 01:59:09 +00001705 Flushes the stream by calling its :meth:`flush` method. Note that the
1706 :meth:`close` method is inherited from :class:`Handler` and so does
Benjamin Peterson3e4f0552008-09-02 00:31:15 +00001707 no output, so an explicit :meth:`flush` call may be needed at times.
Georg Brandl116aa622007-08-15 14:28:22 +00001708
1709
1710FileHandler
1711^^^^^^^^^^^
1712
1713The :class:`FileHandler` class, located in the core :mod:`logging` package,
1714sends logging output to a disk file. It inherits the output functionality from
1715:class:`StreamHandler`.
1716
1717
Georg Brandlcd7f32b2009-06-08 09:13:45 +00001718.. class:: FileHandler(filename, mode='a', encoding=None, delay=0)
Georg Brandl116aa622007-08-15 14:28:22 +00001719
1720 Returns a new instance of the :class:`FileHandler` class. The specified file is
1721 opened and used as the stream for logging. If *mode* is not specified,
1722 :const:`'a'` is used. If *encoding* is not *None*, it is used to open the file
Christian Heimese7a15bb2008-01-24 16:21:45 +00001723 with that encoding. If *delay* is true, then file opening is deferred until the
1724 first call to :meth:`emit`. By default, the file grows indefinitely.
Georg Brandl116aa622007-08-15 14:28:22 +00001725
1726
Benjamin Petersone41251e2008-04-25 01:59:09 +00001727 .. method:: close()
Georg Brandl116aa622007-08-15 14:28:22 +00001728
Benjamin Petersone41251e2008-04-25 01:59:09 +00001729 Closes the file.
Georg Brandl116aa622007-08-15 14:28:22 +00001730
1731
Benjamin Petersone41251e2008-04-25 01:59:09 +00001732 .. method:: emit(record)
Georg Brandl116aa622007-08-15 14:28:22 +00001733
Benjamin Petersone41251e2008-04-25 01:59:09 +00001734 Outputs the record to the file.
Georg Brandl116aa622007-08-15 14:28:22 +00001735
1736
Vinay Sajipaa672eb2009-01-02 18:53:45 +00001737NullHandler
1738^^^^^^^^^^^
1739
1740.. versionadded:: 3.1
1741
1742The :class:`NullHandler` class, located in the core :mod:`logging` package,
1743does not do any formatting or output. It is essentially a "no-op" handler
1744for use by library developers.
1745
1746
1747.. class:: NullHandler()
1748
1749 Returns a new instance of the :class:`NullHandler` class.
1750
1751
1752 .. method:: emit(record)
1753
1754 This method does nothing.
1755
Vinay Sajip26a2d5e2009-01-10 13:37:26 +00001756See :ref:`library-config` for more information on how to use
1757:class:`NullHandler`.
Benjamin Peterson960cf0f2009-01-09 04:11:44 +00001758
Georg Brandl116aa622007-08-15 14:28:22 +00001759WatchedFileHandler
1760^^^^^^^^^^^^^^^^^^
1761
Benjamin Peterson058e31e2009-01-16 03:54:08 +00001762.. currentmodule:: logging.handlers
Vinay Sajipaa672eb2009-01-02 18:53:45 +00001763
Georg Brandl116aa622007-08-15 14:28:22 +00001764The :class:`WatchedFileHandler` class, located in the :mod:`logging.handlers`
1765module, is a :class:`FileHandler` which watches the file it is logging to. If
1766the file changes, it is closed and reopened using the file name.
1767
1768A file change can happen because of usage of programs such as *newsyslog* and
1769*logrotate* which perform log file rotation. This handler, intended for use
1770under Unix/Linux, watches the file to see if it has changed since the last emit.
1771(A file is deemed to have changed if its device or inode have changed.) If the
1772file has changed, the old file stream is closed, and the file opened to get a
1773new stream.
1774
1775This handler is not appropriate for use under Windows, because under Windows
1776open log files cannot be moved or renamed - logging opens the files with
1777exclusive locks - and so there is no need for such a handler. Furthermore,
1778*ST_INO* is not supported under Windows; :func:`stat` always returns zero for
1779this value.
1780
1781
Christian Heimese7a15bb2008-01-24 16:21:45 +00001782.. class:: WatchedFileHandler(filename[,mode[, encoding[, delay]]])
Georg Brandl116aa622007-08-15 14:28:22 +00001783
1784 Returns a new instance of the :class:`WatchedFileHandler` class. The specified
1785 file is opened and used as the stream for logging. If *mode* is not specified,
1786 :const:`'a'` is used. If *encoding* is not *None*, it is used to open the file
Christian Heimese7a15bb2008-01-24 16:21:45 +00001787 with that encoding. If *delay* is true, then file opening is deferred until the
1788 first call to :meth:`emit`. By default, the file grows indefinitely.
Georg Brandl116aa622007-08-15 14:28:22 +00001789
1790
Benjamin Petersone41251e2008-04-25 01:59:09 +00001791 .. method:: emit(record)
Georg Brandl116aa622007-08-15 14:28:22 +00001792
Benjamin Petersone41251e2008-04-25 01:59:09 +00001793 Outputs the record to the file, but first checks to see if the file has
1794 changed. If it has, the existing stream is flushed and closed and the
1795 file opened again, before outputting the record to the file.
Georg Brandl116aa622007-08-15 14:28:22 +00001796
1797
1798RotatingFileHandler
1799^^^^^^^^^^^^^^^^^^^
1800
1801The :class:`RotatingFileHandler` class, located in the :mod:`logging.handlers`
1802module, supports rotation of disk log files.
1803
1804
Georg Brandlcd7f32b2009-06-08 09:13:45 +00001805.. class:: RotatingFileHandler(filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=0)
Georg Brandl116aa622007-08-15 14:28:22 +00001806
1807 Returns a new instance of the :class:`RotatingFileHandler` class. The specified
1808 file is opened and used as the stream for logging. If *mode* is not specified,
Christian Heimese7a15bb2008-01-24 16:21:45 +00001809 ``'a'`` is used. If *encoding* is not *None*, it is used to open the file
1810 with that encoding. If *delay* is true, then file opening is deferred until the
1811 first call to :meth:`emit`. By default, the file grows indefinitely.
Georg Brandl116aa622007-08-15 14:28:22 +00001812
1813 You can use the *maxBytes* and *backupCount* values to allow the file to
1814 :dfn:`rollover` at a predetermined size. When the size is about to be exceeded,
1815 the file is closed and a new file is silently opened for output. Rollover occurs
1816 whenever the current log file is nearly *maxBytes* in length; if *maxBytes* is
1817 zero, rollover never occurs. If *backupCount* is non-zero, the system will save
1818 old log files by appending the extensions ".1", ".2" etc., to the filename. For
1819 example, with a *backupCount* of 5 and a base file name of :file:`app.log`, you
1820 would get :file:`app.log`, :file:`app.log.1`, :file:`app.log.2`, up to
1821 :file:`app.log.5`. The file being written to is always :file:`app.log`. When
1822 this file is filled, it is closed and renamed to :file:`app.log.1`, and if files
1823 :file:`app.log.1`, :file:`app.log.2`, etc. exist, then they are renamed to
1824 :file:`app.log.2`, :file:`app.log.3` etc. respectively.
1825
1826
Benjamin Petersone41251e2008-04-25 01:59:09 +00001827 .. method:: doRollover()
Georg Brandl116aa622007-08-15 14:28:22 +00001828
Benjamin Petersone41251e2008-04-25 01:59:09 +00001829 Does a rollover, as described above.
Georg Brandl116aa622007-08-15 14:28:22 +00001830
1831
Benjamin Petersone41251e2008-04-25 01:59:09 +00001832 .. method:: emit(record)
Georg Brandl116aa622007-08-15 14:28:22 +00001833
Benjamin Petersone41251e2008-04-25 01:59:09 +00001834 Outputs the record to the file, catering for rollover as described
1835 previously.
Georg Brandl116aa622007-08-15 14:28:22 +00001836
1837
1838TimedRotatingFileHandler
1839^^^^^^^^^^^^^^^^^^^^^^^^
1840
1841The :class:`TimedRotatingFileHandler` class, located in the
1842:mod:`logging.handlers` module, supports rotation of disk log files at certain
1843timed intervals.
1844
1845
Georg Brandlcd7f32b2009-06-08 09:13:45 +00001846.. class:: TimedRotatingFileHandler(filename, when='h', interval=1, backupCount=0, encoding=None, delay=0, utc=False)
Georg Brandl116aa622007-08-15 14:28:22 +00001847
1848 Returns a new instance of the :class:`TimedRotatingFileHandler` class. The
1849 specified file is opened and used as the stream for logging. On rotating it also
1850 sets the filename suffix. Rotating happens based on the product of *when* and
1851 *interval*.
1852
1853 You can use the *when* to specify the type of *interval*. The list of possible
Georg Brandl0c77a822008-06-10 16:37:50 +00001854 values is below. Note that they are not case sensitive.
Georg Brandl116aa622007-08-15 14:28:22 +00001855
Christian Heimesb558a2e2008-03-02 22:46:37 +00001856 +----------------+-----------------------+
1857 | Value | Type of interval |
1858 +================+=======================+
1859 | ``'S'`` | Seconds |
1860 +----------------+-----------------------+
1861 | ``'M'`` | Minutes |
1862 +----------------+-----------------------+
1863 | ``'H'`` | Hours |
1864 +----------------+-----------------------+
1865 | ``'D'`` | Days |
1866 +----------------+-----------------------+
1867 | ``'W'`` | Week day (0=Monday) |
1868 +----------------+-----------------------+
1869 | ``'midnight'`` | Roll over at midnight |
1870 +----------------+-----------------------+
Georg Brandl116aa622007-08-15 14:28:22 +00001871
Christian Heimesb558a2e2008-03-02 22:46:37 +00001872 The system will save old log files by appending extensions to the filename.
1873 The extensions are date-and-time based, using the strftime format
Benjamin Petersonad9d48d2008-04-02 21:49:44 +00001874 ``%Y-%m-%d_%H-%M-%S`` or a leading portion thereof, depending on the
Georg Brandl3dbca812008-07-23 16:10:53 +00001875 rollover interval.
Benjamin Peterson9451a1c2010-03-13 22:30:34 +00001876
1877 When computing the next rollover time for the first time (when the handler
1878 is created), the last modification time of an existing log file, or else
1879 the current time, is used to compute when the next rotation will occur.
1880
Georg Brandl0c77a822008-06-10 16:37:50 +00001881 If the *utc* argument is true, times in UTC will be used; otherwise
1882 local time is used.
1883
1884 If *backupCount* is nonzero, at most *backupCount* files
Benjamin Petersonad9d48d2008-04-02 21:49:44 +00001885 will be kept, and if more would be created when rollover occurs, the oldest
1886 one is deleted. The deletion logic uses the interval to determine which
1887 files to delete, so changing the interval may leave old files lying around.
Georg Brandl116aa622007-08-15 14:28:22 +00001888
1889
Benjamin Petersone41251e2008-04-25 01:59:09 +00001890 .. method:: doRollover()
Georg Brandl116aa622007-08-15 14:28:22 +00001891
Benjamin Petersone41251e2008-04-25 01:59:09 +00001892 Does a rollover, as described above.
Georg Brandl116aa622007-08-15 14:28:22 +00001893
1894
Benjamin Petersone41251e2008-04-25 01:59:09 +00001895 .. method:: emit(record)
Georg Brandl116aa622007-08-15 14:28:22 +00001896
Benjamin Petersone41251e2008-04-25 01:59:09 +00001897 Outputs the record to the file, catering for rollover as described above.
Georg Brandl116aa622007-08-15 14:28:22 +00001898
1899
1900SocketHandler
1901^^^^^^^^^^^^^
1902
1903The :class:`SocketHandler` class, located in the :mod:`logging.handlers` module,
1904sends logging output to a network socket. The base class uses a TCP socket.
1905
1906
1907.. class:: SocketHandler(host, port)
1908
1909 Returns a new instance of the :class:`SocketHandler` class intended to
1910 communicate with a remote machine whose address is given by *host* and *port*.
1911
1912
Benjamin Petersone41251e2008-04-25 01:59:09 +00001913 .. method:: close()
Georg Brandl116aa622007-08-15 14:28:22 +00001914
Benjamin Petersone41251e2008-04-25 01:59:09 +00001915 Closes the socket.
Georg Brandl116aa622007-08-15 14:28:22 +00001916
1917
Benjamin Petersone41251e2008-04-25 01:59:09 +00001918 .. method:: emit()
Georg Brandl116aa622007-08-15 14:28:22 +00001919
Benjamin Petersone41251e2008-04-25 01:59:09 +00001920 Pickles the record's attribute dictionary and writes it to the socket in
1921 binary format. If there is an error with the socket, silently drops the
1922 packet. If the connection was previously lost, re-establishes the
1923 connection. To unpickle the record at the receiving end into a
1924 :class:`LogRecord`, use the :func:`makeLogRecord` function.
Georg Brandl116aa622007-08-15 14:28:22 +00001925
1926
Benjamin Petersone41251e2008-04-25 01:59:09 +00001927 .. method:: handleError()
Georg Brandl116aa622007-08-15 14:28:22 +00001928
Benjamin Petersone41251e2008-04-25 01:59:09 +00001929 Handles an error which has occurred during :meth:`emit`. The most likely
1930 cause is a lost connection. Closes the socket so that we can retry on the
1931 next event.
Georg Brandl116aa622007-08-15 14:28:22 +00001932
1933
Benjamin Petersone41251e2008-04-25 01:59:09 +00001934 .. method:: makeSocket()
Georg Brandl116aa622007-08-15 14:28:22 +00001935
Benjamin Petersone41251e2008-04-25 01:59:09 +00001936 This is a factory method which allows subclasses to define the precise
1937 type of socket they want. The default implementation creates a TCP socket
1938 (:const:`socket.SOCK_STREAM`).
Georg Brandl116aa622007-08-15 14:28:22 +00001939
1940
Benjamin Petersone41251e2008-04-25 01:59:09 +00001941 .. method:: makePickle(record)
Georg Brandl116aa622007-08-15 14:28:22 +00001942
Benjamin Petersone41251e2008-04-25 01:59:09 +00001943 Pickles the record's attribute dictionary in binary format with a length
1944 prefix, and returns it ready for transmission across the socket.
Georg Brandl116aa622007-08-15 14:28:22 +00001945
1946
Benjamin Petersone41251e2008-04-25 01:59:09 +00001947 .. method:: send(packet)
Georg Brandl116aa622007-08-15 14:28:22 +00001948
Benjamin Petersone41251e2008-04-25 01:59:09 +00001949 Send a pickled string *packet* to the socket. This function allows for
1950 partial sends which can happen when the network is busy.
Georg Brandl116aa622007-08-15 14:28:22 +00001951
1952
1953DatagramHandler
1954^^^^^^^^^^^^^^^
1955
1956The :class:`DatagramHandler` class, located in the :mod:`logging.handlers`
1957module, inherits from :class:`SocketHandler` to support sending logging messages
1958over UDP sockets.
1959
1960
1961.. class:: DatagramHandler(host, port)
1962
1963 Returns a new instance of the :class:`DatagramHandler` class intended to
1964 communicate with a remote machine whose address is given by *host* and *port*.
1965
1966
Benjamin Petersone41251e2008-04-25 01:59:09 +00001967 .. method:: emit()
Georg Brandl116aa622007-08-15 14:28:22 +00001968
Benjamin Petersone41251e2008-04-25 01:59:09 +00001969 Pickles the record's attribute dictionary and writes it to the socket in
1970 binary format. If there is an error with the socket, silently drops the
1971 packet. To unpickle the record at the receiving end into a
1972 :class:`LogRecord`, use the :func:`makeLogRecord` function.
Georg Brandl116aa622007-08-15 14:28:22 +00001973
1974
Benjamin Petersone41251e2008-04-25 01:59:09 +00001975 .. method:: makeSocket()
Georg Brandl116aa622007-08-15 14:28:22 +00001976
Benjamin Petersone41251e2008-04-25 01:59:09 +00001977 The factory method of :class:`SocketHandler` is here overridden to create
1978 a UDP socket (:const:`socket.SOCK_DGRAM`).
Georg Brandl116aa622007-08-15 14:28:22 +00001979
1980
Benjamin Petersone41251e2008-04-25 01:59:09 +00001981 .. method:: send(s)
Georg Brandl116aa622007-08-15 14:28:22 +00001982
Benjamin Petersone41251e2008-04-25 01:59:09 +00001983 Send a pickled string to a socket.
Georg Brandl116aa622007-08-15 14:28:22 +00001984
1985
1986SysLogHandler
1987^^^^^^^^^^^^^
1988
1989The :class:`SysLogHandler` class, located in the :mod:`logging.handlers` module,
1990supports sending logging messages to a remote or local Unix syslog.
1991
1992
Vinay Sajipcbabd7e2009-10-10 20:32:36 +00001993.. class:: SysLogHandler(address=('localhost', SYSLOG_UDP_PORT), facility=LOG_USER, socktype=socket.SOCK_DGRAM)
Georg Brandl116aa622007-08-15 14:28:22 +00001994
1995 Returns a new instance of the :class:`SysLogHandler` class intended to
1996 communicate with a remote Unix machine whose address is given by *address* in
1997 the form of a ``(host, port)`` tuple. If *address* is not specified,
Vinay Sajipcbabd7e2009-10-10 20:32:36 +00001998 ``('localhost', 514)`` is used. The address is used to open a socket. An
Georg Brandl116aa622007-08-15 14:28:22 +00001999 alternative to providing a ``(host, port)`` tuple is providing an address as a
2000 string, for example "/dev/log". In this case, a Unix domain socket is used to
2001 send the message to the syslog. If *facility* is not specified,
Vinay Sajipcbabd7e2009-10-10 20:32:36 +00002002 :const:`LOG_USER` is used. The type of socket opened depends on the
2003 *socktype* argument, which defaults to :const:`socket.SOCK_DGRAM` and thus
2004 opens a UDP socket. To open a TCP socket (for use with the newer syslog
2005 daemons such as rsyslog), specify a value of :const:`socket.SOCK_STREAM`.
2006
2007 .. versionchanged:: 3.2
2008 *socktype* was added.
Georg Brandl116aa622007-08-15 14:28:22 +00002009
2010
Benjamin Petersone41251e2008-04-25 01:59:09 +00002011 .. method:: close()
Georg Brandl116aa622007-08-15 14:28:22 +00002012
Benjamin Petersone41251e2008-04-25 01:59:09 +00002013 Closes the socket to the remote host.
Georg Brandl116aa622007-08-15 14:28:22 +00002014
2015
Benjamin Petersone41251e2008-04-25 01:59:09 +00002016 .. method:: emit(record)
Georg Brandl116aa622007-08-15 14:28:22 +00002017
Benjamin Petersone41251e2008-04-25 01:59:09 +00002018 The record is formatted, and then sent to the syslog server. If exception
2019 information is present, it is *not* sent to the server.
Georg Brandl116aa622007-08-15 14:28:22 +00002020
2021
Benjamin Petersone41251e2008-04-25 01:59:09 +00002022 .. method:: encodePriority(facility, priority)
Georg Brandl116aa622007-08-15 14:28:22 +00002023
Benjamin Petersone41251e2008-04-25 01:59:09 +00002024 Encodes the facility and priority into an integer. You can pass in strings
2025 or integers - if strings are passed, internal mapping dictionaries are
2026 used to convert them to integers.
Georg Brandl116aa622007-08-15 14:28:22 +00002027
Benjamin Peterson22005fc2010-04-11 16:25:06 +00002028 The symbolic ``LOG_`` values are defined in :class:`SysLogHandler` and
2029 mirror the values defined in the ``sys/syslog.h`` header file.
Benjamin Peterson08bf91c2010-04-11 16:12:57 +00002030
Benjamin Peterson22005fc2010-04-11 16:25:06 +00002031 +------------------------------------------+
2032 | Priorities |
Benjamin Peterson08bf91c2010-04-11 16:12:57 +00002033 +--------------------------+---------------+
2034 | Name (string) | Symbolic value|
2035 +==========================+===============+
2036 | ``alert`` | LOG_ALERT |
2037 +--------------------------+---------------+
2038 | ``crit`` or ``critical`` | LOG_CRIT |
2039 +--------------------------+---------------+
2040 | ``debug`` | LOG_DEBUG |
2041 +--------------------------+---------------+
2042 | ``emerg`` or ``panic`` | LOG_EMERG |
2043 +--------------------------+---------------+
2044 | ``err`` or ``error`` | LOG_ERR |
2045 +--------------------------+---------------+
2046 | ``info`` | LOG_INFO |
2047 +--------------------------+---------------+
2048 | ``notice`` | LOG_NOTICE |
2049 +--------------------------+---------------+
2050 | ``warn`` or ``warning`` | LOG_WARNING |
2051 +--------------------------+---------------+
2052
Benjamin Peterson22005fc2010-04-11 16:25:06 +00002053 +-------------------------------+
2054 | Facilities |
Benjamin Peterson08bf91c2010-04-11 16:12:57 +00002055 +---------------+---------------+
2056 | Name (string) | Symbolic value|
2057 +===============+===============+
2058 | ``auth`` | LOG_AUTH |
2059 +---------------+---------------+
2060 | ``authpriv`` | LOG_AUTHPRIV |
2061 +---------------+---------------+
2062 | ``cron`` | LOG_CRON |
2063 +---------------+---------------+
2064 | ``daemon`` | LOG_DAEMON |
2065 +---------------+---------------+
2066 | ``ftp`` | LOG_FTP |
2067 +---------------+---------------+
2068 | ``kern`` | LOG_KERN |
2069 +---------------+---------------+
2070 | ``lpr`` | LOG_LPR |
2071 +---------------+---------------+
2072 | ``mail`` | LOG_MAIL |
2073 +---------------+---------------+
2074 | ``news`` | LOG_NEWS |
2075 +---------------+---------------+
2076 | ``syslog`` | LOG_SYSLOG |
2077 +---------------+---------------+
2078 | ``user`` | LOG_USER |
2079 +---------------+---------------+
2080 | ``uucp`` | LOG_UUCP |
2081 +---------------+---------------+
2082 | ``local0`` | LOG_LOCAL0 |
2083 +---------------+---------------+
2084 | ``local1`` | LOG_LOCAL1 |
2085 +---------------+---------------+
2086 | ``local2`` | LOG_LOCAL2 |
2087 +---------------+---------------+
2088 | ``local3`` | LOG_LOCAL3 |
2089 +---------------+---------------+
2090 | ``local4`` | LOG_LOCAL4 |
2091 +---------------+---------------+
2092 | ``local5`` | LOG_LOCAL5 |
2093 +---------------+---------------+
2094 | ``local6`` | LOG_LOCAL6 |
2095 +---------------+---------------+
2096 | ``local7`` | LOG_LOCAL7 |
2097 +---------------+---------------+
2098
2099 .. method:: mapPriority(levelname)
2100
2101 Maps a logging level name to a syslog priority name.
2102 You may need to override this if you are using custom levels, or
2103 if the default algorithm is not suitable for your needs. The
2104 default algorithm maps ``DEBUG``, ``INFO``, ``WARNING``, ``ERROR`` and
2105 ``CRITICAL`` to the equivalent syslog names, and all other level
2106 names to "warning".
2107
2108.. _nt-eventlog-handler:
Georg Brandl116aa622007-08-15 14:28:22 +00002109
2110NTEventLogHandler
2111^^^^^^^^^^^^^^^^^
2112
2113The :class:`NTEventLogHandler` class, located in the :mod:`logging.handlers`
2114module, supports sending logging messages to a local Windows NT, Windows 2000 or
2115Windows XP event log. Before you can use it, you need Mark Hammond's Win32
2116extensions for Python installed.
2117
2118
Georg Brandlcd7f32b2009-06-08 09:13:45 +00002119.. class:: NTEventLogHandler(appname, dllname=None, logtype='Application')
Georg Brandl116aa622007-08-15 14:28:22 +00002120
2121 Returns a new instance of the :class:`NTEventLogHandler` class. The *appname* is
2122 used to define the application name as it appears in the event log. An
2123 appropriate registry entry is created using this name. The *dllname* should give
2124 the fully qualified pathname of a .dll or .exe which contains message
2125 definitions to hold in the log (if not specified, ``'win32service.pyd'`` is used
2126 - this is installed with the Win32 extensions and contains some basic
2127 placeholder message definitions. Note that use of these placeholders will make
2128 your event logs big, as the entire message source is held in the log. If you
2129 want slimmer logs, you have to pass in the name of your own .dll or .exe which
2130 contains the message definitions you want to use in the event log). The
2131 *logtype* is one of ``'Application'``, ``'System'`` or ``'Security'``, and
2132 defaults to ``'Application'``.
2133
2134
Benjamin Petersone41251e2008-04-25 01:59:09 +00002135 .. method:: close()
Georg Brandl116aa622007-08-15 14:28:22 +00002136
Benjamin Petersone41251e2008-04-25 01:59:09 +00002137 At this point, you can remove the application name from the registry as a
2138 source of event log entries. However, if you do this, you will not be able
2139 to see the events as you intended in the Event Log Viewer - it needs to be
2140 able to access the registry to get the .dll name. The current version does
Benjamin Peterson3e4f0552008-09-02 00:31:15 +00002141 not do this.
Georg Brandl116aa622007-08-15 14:28:22 +00002142
2143
Benjamin Petersone41251e2008-04-25 01:59:09 +00002144 .. method:: emit(record)
Georg Brandl116aa622007-08-15 14:28:22 +00002145
Benjamin Petersone41251e2008-04-25 01:59:09 +00002146 Determines the message ID, event category and event type, and then logs
2147 the message in the NT event log.
Georg Brandl116aa622007-08-15 14:28:22 +00002148
2149
Benjamin Petersone41251e2008-04-25 01:59:09 +00002150 .. method:: getEventCategory(record)
Georg Brandl116aa622007-08-15 14:28:22 +00002151
Benjamin Petersone41251e2008-04-25 01:59:09 +00002152 Returns the event category for the record. Override this if you want to
2153 specify your own categories. This version returns 0.
Georg Brandl116aa622007-08-15 14:28:22 +00002154
2155
Benjamin Petersone41251e2008-04-25 01:59:09 +00002156 .. method:: getEventType(record)
Georg Brandl116aa622007-08-15 14:28:22 +00002157
Benjamin Petersone41251e2008-04-25 01:59:09 +00002158 Returns the event type for the record. Override this if you want to
2159 specify your own types. This version does a mapping using the handler's
2160 typemap attribute, which is set up in :meth:`__init__` to a dictionary
2161 which contains mappings for :const:`DEBUG`, :const:`INFO`,
2162 :const:`WARNING`, :const:`ERROR` and :const:`CRITICAL`. If you are using
2163 your own levels, you will either need to override this method or place a
2164 suitable dictionary in the handler's *typemap* attribute.
Georg Brandl116aa622007-08-15 14:28:22 +00002165
2166
Benjamin Petersone41251e2008-04-25 01:59:09 +00002167 .. method:: getMessageID(record)
Georg Brandl116aa622007-08-15 14:28:22 +00002168
Benjamin Petersone41251e2008-04-25 01:59:09 +00002169 Returns the message ID for the record. If you are using your own messages,
2170 you could do this by having the *msg* passed to the logger being an ID
2171 rather than a format string. Then, in here, you could use a dictionary
2172 lookup to get the message ID. This version returns 1, which is the base
2173 message ID in :file:`win32service.pyd`.
Georg Brandl116aa622007-08-15 14:28:22 +00002174
2175
2176SMTPHandler
2177^^^^^^^^^^^
2178
2179The :class:`SMTPHandler` class, located in the :mod:`logging.handlers` module,
2180supports sending logging messages to an email address via SMTP.
2181
2182
Georg Brandlcd7f32b2009-06-08 09:13:45 +00002183.. class:: SMTPHandler(mailhost, fromaddr, toaddrs, subject, credentials=None)
Georg Brandl116aa622007-08-15 14:28:22 +00002184
2185 Returns a new instance of the :class:`SMTPHandler` class. The instance is
2186 initialized with the from and to addresses and subject line of the email. The
2187 *toaddrs* should be a list of strings. To specify a non-standard SMTP port, use
2188 the (host, port) tuple format for the *mailhost* argument. If you use a string,
2189 the standard SMTP port is used. If your SMTP server requires authentication, you
2190 can specify a (username, password) tuple for the *credentials* argument.
2191
Georg Brandl116aa622007-08-15 14:28:22 +00002192
Benjamin Petersone41251e2008-04-25 01:59:09 +00002193 .. method:: emit(record)
Georg Brandl116aa622007-08-15 14:28:22 +00002194
Benjamin Petersone41251e2008-04-25 01:59:09 +00002195 Formats the record and sends it to the specified addressees.
Georg Brandl116aa622007-08-15 14:28:22 +00002196
2197
Benjamin Petersone41251e2008-04-25 01:59:09 +00002198 .. method:: getSubject(record)
Georg Brandl116aa622007-08-15 14:28:22 +00002199
Benjamin Petersone41251e2008-04-25 01:59:09 +00002200 If you want to specify a subject line which is record-dependent, override
2201 this method.
Georg Brandl116aa622007-08-15 14:28:22 +00002202
2203
2204MemoryHandler
2205^^^^^^^^^^^^^
2206
2207The :class:`MemoryHandler` class, located in the :mod:`logging.handlers` module,
2208supports buffering of logging records in memory, periodically flushing them to a
2209:dfn:`target` handler. Flushing occurs whenever the buffer is full, or when an
2210event of a certain severity or greater is seen.
2211
2212:class:`MemoryHandler` is a subclass of the more general
2213:class:`BufferingHandler`, which is an abstract class. This buffers logging
2214records in memory. Whenever each record is added to the buffer, a check is made
2215by calling :meth:`shouldFlush` to see if the buffer should be flushed. If it
2216should, then :meth:`flush` is expected to do the needful.
2217
2218
2219.. class:: BufferingHandler(capacity)
2220
2221 Initializes the handler with a buffer of the specified capacity.
2222
2223
Benjamin Petersone41251e2008-04-25 01:59:09 +00002224 .. method:: emit(record)
Georg Brandl116aa622007-08-15 14:28:22 +00002225
Benjamin Petersone41251e2008-04-25 01:59:09 +00002226 Appends the record to the buffer. If :meth:`shouldFlush` returns true,
2227 calls :meth:`flush` to process the buffer.
Georg Brandl116aa622007-08-15 14:28:22 +00002228
2229
Benjamin Petersone41251e2008-04-25 01:59:09 +00002230 .. method:: flush()
Georg Brandl116aa622007-08-15 14:28:22 +00002231
Benjamin Petersone41251e2008-04-25 01:59:09 +00002232 You can override this to implement custom flushing behavior. This version
2233 just zaps the buffer to empty.
Georg Brandl116aa622007-08-15 14:28:22 +00002234
2235
Benjamin Petersone41251e2008-04-25 01:59:09 +00002236 .. method:: shouldFlush(record)
Georg Brandl116aa622007-08-15 14:28:22 +00002237
Benjamin Petersone41251e2008-04-25 01:59:09 +00002238 Returns true if the buffer is up to capacity. This method can be
2239 overridden to implement custom flushing strategies.
Georg Brandl116aa622007-08-15 14:28:22 +00002240
2241
Georg Brandlcd7f32b2009-06-08 09:13:45 +00002242.. class:: MemoryHandler(capacity, flushLevel=ERROR, target=None)
Georg Brandl116aa622007-08-15 14:28:22 +00002243
2244 Returns a new instance of the :class:`MemoryHandler` class. The instance is
2245 initialized with a buffer size of *capacity*. If *flushLevel* is not specified,
2246 :const:`ERROR` is used. If no *target* is specified, the target will need to be
2247 set using :meth:`setTarget` before this handler does anything useful.
2248
2249
Benjamin Petersone41251e2008-04-25 01:59:09 +00002250 .. method:: close()
Georg Brandl116aa622007-08-15 14:28:22 +00002251
Benjamin Petersone41251e2008-04-25 01:59:09 +00002252 Calls :meth:`flush`, sets the target to :const:`None` and clears the
2253 buffer.
Georg Brandl116aa622007-08-15 14:28:22 +00002254
2255
Benjamin Petersone41251e2008-04-25 01:59:09 +00002256 .. method:: flush()
Georg Brandl116aa622007-08-15 14:28:22 +00002257
Benjamin Petersone41251e2008-04-25 01:59:09 +00002258 For a :class:`MemoryHandler`, flushing means just sending the buffered
2259 records to the target, if there is one. Override if you want different
2260 behavior.
Georg Brandl116aa622007-08-15 14:28:22 +00002261
2262
Benjamin Petersone41251e2008-04-25 01:59:09 +00002263 .. method:: setTarget(target)
Georg Brandl116aa622007-08-15 14:28:22 +00002264
Benjamin Petersone41251e2008-04-25 01:59:09 +00002265 Sets the target handler for this handler.
Georg Brandl116aa622007-08-15 14:28:22 +00002266
2267
Benjamin Petersone41251e2008-04-25 01:59:09 +00002268 .. method:: shouldFlush(record)
Georg Brandl116aa622007-08-15 14:28:22 +00002269
Benjamin Petersone41251e2008-04-25 01:59:09 +00002270 Checks for buffer full or a record at the *flushLevel* or higher.
Georg Brandl116aa622007-08-15 14:28:22 +00002271
2272
2273HTTPHandler
2274^^^^^^^^^^^
2275
2276The :class:`HTTPHandler` class, located in the :mod:`logging.handlers` module,
2277supports sending logging messages to a Web server, using either ``GET`` or
2278``POST`` semantics.
2279
2280
Georg Brandlcd7f32b2009-06-08 09:13:45 +00002281.. class:: HTTPHandler(host, url, method='GET')
Georg Brandl116aa622007-08-15 14:28:22 +00002282
2283 Returns a new instance of the :class:`HTTPHandler` class. The instance is
2284 initialized with a host address, url and HTTP method. The *host* can be of the
2285 form ``host:port``, should you need to use a specific port number. If no
2286 *method* is specified, ``GET`` is used.
2287
2288
Benjamin Petersone41251e2008-04-25 01:59:09 +00002289 .. method:: emit(record)
Georg Brandl116aa622007-08-15 14:28:22 +00002290
Benjamin Petersone41251e2008-04-25 01:59:09 +00002291 Sends the record to the Web server as an URL-encoded dictionary.
Georg Brandl116aa622007-08-15 14:28:22 +00002292
2293
Christian Heimes8b0facf2007-12-04 19:30:01 +00002294.. _formatter-objects:
2295
Georg Brandl116aa622007-08-15 14:28:22 +00002296Formatter Objects
2297-----------------
2298
Benjamin Peterson75edad02009-01-01 15:05:06 +00002299.. currentmodule:: logging
2300
Georg Brandl116aa622007-08-15 14:28:22 +00002301:class:`Formatter`\ s have the following attributes and methods. They are
2302responsible for converting a :class:`LogRecord` to (usually) a string which can
2303be interpreted by either a human or an external system. The base
2304:class:`Formatter` allows a formatting string to be specified. If none is
2305supplied, the default value of ``'%(message)s'`` is used.
2306
2307A Formatter can be initialized with a format string which makes use of knowledge
2308of the :class:`LogRecord` attributes - such as the default value mentioned above
2309making use of the fact that the user's message and arguments are pre-formatted
2310into a :class:`LogRecord`'s *message* attribute. This format string contains
Ezio Melotti0639d5a2009-12-19 23:26:38 +00002311standard Python %-style mapping keys. See section :ref:`old-string-formatting`
Georg Brandl116aa622007-08-15 14:28:22 +00002312for more information on string formatting.
2313
2314Currently, the useful mapping keys in a :class:`LogRecord` are:
2315
2316+-------------------------+-----------------------------------------------+
2317| Format | Description |
2318+=========================+===============================================+
2319| ``%(name)s`` | Name of the logger (logging channel). |
2320+-------------------------+-----------------------------------------------+
2321| ``%(levelno)s`` | Numeric logging level for the message |
2322| | (:const:`DEBUG`, :const:`INFO`, |
2323| | :const:`WARNING`, :const:`ERROR`, |
2324| | :const:`CRITICAL`). |
2325+-------------------------+-----------------------------------------------+
2326| ``%(levelname)s`` | Text logging level for the message |
2327| | (``'DEBUG'``, ``'INFO'``, ``'WARNING'``, |
2328| | ``'ERROR'``, ``'CRITICAL'``). |
2329+-------------------------+-----------------------------------------------+
2330| ``%(pathname)s`` | Full pathname of the source file where the |
2331| | logging call was issued (if available). |
2332+-------------------------+-----------------------------------------------+
2333| ``%(filename)s`` | Filename portion of pathname. |
2334+-------------------------+-----------------------------------------------+
2335| ``%(module)s`` | Module (name portion of filename). |
2336+-------------------------+-----------------------------------------------+
2337| ``%(funcName)s`` | Name of function containing the logging call. |
2338+-------------------------+-----------------------------------------------+
2339| ``%(lineno)d`` | Source line number where the logging call was |
2340| | issued (if available). |
2341+-------------------------+-----------------------------------------------+
2342| ``%(created)f`` | Time when the :class:`LogRecord` was created |
2343| | (as returned by :func:`time.time`). |
2344+-------------------------+-----------------------------------------------+
2345| ``%(relativeCreated)d`` | Time in milliseconds when the LogRecord was |
2346| | created, relative to the time the logging |
2347| | module was loaded. |
2348+-------------------------+-----------------------------------------------+
2349| ``%(asctime)s`` | Human-readable time when the |
2350| | :class:`LogRecord` was created. By default |
2351| | this is of the form "2003-07-08 16:49:45,896" |
2352| | (the numbers after the comma are millisecond |
2353| | portion of the time). |
2354+-------------------------+-----------------------------------------------+
2355| ``%(msecs)d`` | Millisecond portion of the time when the |
2356| | :class:`LogRecord` was created. |
2357+-------------------------+-----------------------------------------------+
2358| ``%(thread)d`` | Thread ID (if available). |
2359+-------------------------+-----------------------------------------------+
2360| ``%(threadName)s`` | Thread name (if available). |
2361+-------------------------+-----------------------------------------------+
2362| ``%(process)d`` | Process ID (if available). |
2363+-------------------------+-----------------------------------------------+
2364| ``%(message)s`` | The logged message, computed as ``msg % |
2365| | args``. |
2366+-------------------------+-----------------------------------------------+
2367
Georg Brandl116aa622007-08-15 14:28:22 +00002368
Georg Brandlcd7f32b2009-06-08 09:13:45 +00002369.. class:: Formatter(fmt=None, datefmt=None)
Georg Brandl116aa622007-08-15 14:28:22 +00002370
Georg Brandlcd7f32b2009-06-08 09:13:45 +00002371 Returns a new instance of the :class:`Formatter` class. The instance is
2372 initialized with a format string for the message as a whole, as well as a
2373 format string for the date/time portion of a message. If no *fmt* is
2374 specified, ``'%(message)s'`` is used. If no *datefmt* is specified, the
2375 ISO8601 date format is used.
Georg Brandl116aa622007-08-15 14:28:22 +00002376
2377
Benjamin Petersone41251e2008-04-25 01:59:09 +00002378 .. method:: format(record)
Georg Brandl116aa622007-08-15 14:28:22 +00002379
Benjamin Petersone41251e2008-04-25 01:59:09 +00002380 The record's attribute dictionary is used as the operand to a string
2381 formatting operation. Returns the resulting string. Before formatting the
2382 dictionary, a couple of preparatory steps are carried out. The *message*
2383 attribute of the record is computed using *msg* % *args*. If the
2384 formatting string contains ``'(asctime)'``, :meth:`formatTime` is called
2385 to format the event time. If there is exception information, it is
2386 formatted using :meth:`formatException` and appended to the message. Note
2387 that the formatted exception information is cached in attribute
2388 *exc_text*. This is useful because the exception information can be
2389 pickled and sent across the wire, but you should be careful if you have
2390 more than one :class:`Formatter` subclass which customizes the formatting
2391 of exception information. In this case, you will have to clear the cached
2392 value after a formatter has done its formatting, so that the next
2393 formatter to handle the event doesn't use the cached value but
2394 recalculates it afresh.
Georg Brandl116aa622007-08-15 14:28:22 +00002395
2396
Georg Brandlcd7f32b2009-06-08 09:13:45 +00002397 .. method:: formatTime(record, datefmt=None)
Georg Brandl116aa622007-08-15 14:28:22 +00002398
Benjamin Petersone41251e2008-04-25 01:59:09 +00002399 This method should be called from :meth:`format` by a formatter which
2400 wants to make use of a formatted time. This method can be overridden in
2401 formatters to provide for any specific requirement, but the basic behavior
2402 is as follows: if *datefmt* (a string) is specified, it is used with
2403 :func:`time.strftime` to format the creation time of the
2404 record. Otherwise, the ISO8601 format is used. The resulting string is
2405 returned.
Georg Brandl116aa622007-08-15 14:28:22 +00002406
2407
Benjamin Petersone41251e2008-04-25 01:59:09 +00002408 .. method:: formatException(exc_info)
Georg Brandl116aa622007-08-15 14:28:22 +00002409
Benjamin Petersone41251e2008-04-25 01:59:09 +00002410 Formats the specified exception information (a standard exception tuple as
2411 returned by :func:`sys.exc_info`) as a string. This default implementation
2412 just uses :func:`traceback.print_exception`. The resulting string is
2413 returned.
Georg Brandl116aa622007-08-15 14:28:22 +00002414
2415
2416Filter Objects
2417--------------
2418
2419:class:`Filter`\ s can be used by :class:`Handler`\ s and :class:`Logger`\ s for
2420more sophisticated filtering than is provided by levels. The base filter class
2421only allows events which are below a certain point in the logger hierarchy. For
2422example, a filter initialized with "A.B" will allow events logged by loggers
2423"A.B", "A.B.C", "A.B.C.D", "A.B.D" etc. but not "A.BB", "B.A.B" etc. If
2424initialized with the empty string, all events are passed.
2425
2426
Georg Brandlcd7f32b2009-06-08 09:13:45 +00002427.. class:: Filter(name='')
Georg Brandl116aa622007-08-15 14:28:22 +00002428
2429 Returns an instance of the :class:`Filter` class. If *name* is specified, it
2430 names a logger which, together with its children, will have its events allowed
Georg Brandlcd7f32b2009-06-08 09:13:45 +00002431 through the filter. If *name* is the empty string, allows every event.
Georg Brandl116aa622007-08-15 14:28:22 +00002432
2433
Benjamin Petersone41251e2008-04-25 01:59:09 +00002434 .. method:: filter(record)
Georg Brandl116aa622007-08-15 14:28:22 +00002435
Benjamin Petersone41251e2008-04-25 01:59:09 +00002436 Is the specified record to be logged? Returns zero for no, nonzero for
2437 yes. If deemed appropriate, the record may be modified in-place by this
2438 method.
Georg Brandl116aa622007-08-15 14:28:22 +00002439
2440
2441LogRecord Objects
2442-----------------
2443
2444:class:`LogRecord` instances are created every time something is logged. They
2445contain all the information pertinent to the event being logged. The main
2446information passed in is in msg and args, which are combined using msg % args to
2447create the message field of the record. The record also includes information
2448such as when the record was created, the source line where the logging call was
2449made, and any exception information to be logged.
2450
2451
Georg Brandlcd7f32b2009-06-08 09:13:45 +00002452.. class:: LogRecord(name, lvl, pathname, lineno, msg, args, exc_info, func=None)
Georg Brandl116aa622007-08-15 14:28:22 +00002453
2454 Returns an instance of :class:`LogRecord` initialized with interesting
2455 information. The *name* is the logger name; *lvl* is the numeric level;
2456 *pathname* is the absolute pathname of the source file in which the logging
2457 call was made; *lineno* is the line number in that file where the logging
2458 call is found; *msg* is the user-supplied message (a format string); *args*
2459 is the tuple which, together with *msg*, makes up the user message; and
2460 *exc_info* is the exception tuple obtained by calling :func:`sys.exc_info`
2461 (or :const:`None`, if no exception information is available). The *func* is
2462 the name of the function from which the logging call was made. If not
2463 specified, it defaults to ``None``.
2464
Georg Brandl116aa622007-08-15 14:28:22 +00002465
Benjamin Petersone41251e2008-04-25 01:59:09 +00002466 .. method:: getMessage()
Georg Brandl116aa622007-08-15 14:28:22 +00002467
Benjamin Petersone41251e2008-04-25 01:59:09 +00002468 Returns the message for this :class:`LogRecord` instance after merging any
2469 user-supplied arguments with the message.
2470
Georg Brandl116aa622007-08-15 14:28:22 +00002471
Christian Heimes04c420f2008-01-18 18:40:46 +00002472LoggerAdapter Objects
2473---------------------
2474
Christian Heimes04c420f2008-01-18 18:40:46 +00002475:class:`LoggerAdapter` instances are used to conveniently pass contextual
Georg Brandl86def6c2008-01-21 20:36:10 +00002476information into logging calls. For a usage example , see the section on
2477`adding contextual information to your logging output`__.
2478
2479__ context-info_
Christian Heimes04c420f2008-01-18 18:40:46 +00002480
2481.. class:: LoggerAdapter(logger, extra)
2482
2483 Returns an instance of :class:`LoggerAdapter` initialized with an
2484 underlying :class:`Logger` instance and a dict-like object.
2485
Benjamin Petersone41251e2008-04-25 01:59:09 +00002486 .. method:: process(msg, kwargs)
Christian Heimes04c420f2008-01-18 18:40:46 +00002487
Benjamin Petersone41251e2008-04-25 01:59:09 +00002488 Modifies the message and/or keyword arguments passed to a logging call in
2489 order to insert contextual information. This implementation takes the object
2490 passed as *extra* to the constructor and adds it to *kwargs* using key
2491 'extra'. The return value is a (*msg*, *kwargs*) tuple which has the
2492 (possibly modified) versions of the arguments passed in.
Christian Heimes04c420f2008-01-18 18:40:46 +00002493
2494In addition to the above, :class:`LoggerAdapter` supports all the logging
2495methods of :class:`Logger`, i.e. :meth:`debug`, :meth:`info`, :meth:`warning`,
2496:meth:`error`, :meth:`exception`, :meth:`critical` and :meth:`log`. These
2497methods have the same signatures as their counterparts in :class:`Logger`, so
2498you can use the two types of instances interchangeably.
2499
Benjamin Peterson22005fc2010-04-11 16:25:06 +00002500.. versionchanged:: 2.7
2501
2502The :meth:`isEnabledFor` method was added to :class:`LoggerAdapter`. This method
2503delegates to the underlying logger.
2504
Georg Brandl116aa622007-08-15 14:28:22 +00002505
2506Thread Safety
2507-------------
2508
2509The logging module is intended to be thread-safe without any special work
2510needing to be done by its clients. It achieves this though using threading
2511locks; there is one lock to serialize access to the module's shared data, and
2512each handler also creates a lock to serialize access to its underlying I/O.
2513
Benjamin Petersond23f8222009-04-05 19:13:16 +00002514If you are implementing asynchronous signal handlers using the :mod:`signal`
2515module, you may not be able to use logging from within such handlers. This is
2516because lock implementations in the :mod:`threading` module are not always
2517re-entrant, and so cannot be invoked from such signal handlers.
Georg Brandl116aa622007-08-15 14:28:22 +00002518
Benjamin Peterson9451a1c2010-03-13 22:30:34 +00002519
2520Integration with the warnings module
2521------------------------------------
2522
2523The :func:`captureWarnings` function can be used to integrate :mod:`logging`
2524with the :mod:`warnings` module.
2525
2526.. function:: captureWarnings(capture)
2527
2528 This function is used to turn the capture of warnings by logging on and
2529 off.
2530
2531 If `capture` is `True`, warnings issued by the :mod:`warnings` module
2532 will be redirected to the logging system. Specifically, a warning will be
2533 formatted using :func:`warnings.formatwarning` and the resulting string
2534 logged to a logger named "py.warnings" with a severity of `WARNING`.
2535
2536 If `capture` is `False`, the redirection of warnings to the logging system
2537 will stop, and warnings will be redirected to their original destinations
2538 (i.e. those in effect before `captureWarnings(True)` was called).
2539
2540
Georg Brandl116aa622007-08-15 14:28:22 +00002541Configuration
2542-------------
2543
2544
2545.. _logging-config-api:
2546
2547Configuration functions
2548^^^^^^^^^^^^^^^^^^^^^^^
2549
Georg Brandl116aa622007-08-15 14:28:22 +00002550The following functions configure the logging module. They are located in the
2551:mod:`logging.config` module. Their use is optional --- you can configure the
2552logging module using these functions or by making calls to the main API (defined
2553in :mod:`logging` itself) and defining handlers which are declared either in
2554:mod:`logging` or :mod:`logging.handlers`.
2555
2556
Georg Brandlcd7f32b2009-06-08 09:13:45 +00002557.. function:: fileConfig(fname, defaults=None, disable_existing_loggers=True)
Georg Brandl116aa622007-08-15 14:28:22 +00002558
Alexandre Vassalotti1d1eaa42008-05-14 22:59:42 +00002559 Reads the logging configuration from a :mod:`configparser`\-format file named
Benjamin Peterson960cf0f2009-01-09 04:11:44 +00002560 *fname*. This function can be called several times from an application,
Alexandre Vassalotti1d1eaa42008-05-14 22:59:42 +00002561 allowing an end user the ability to select from various pre-canned
2562 configurations (if the developer provides a mechanism to present the choices
2563 and load the chosen configuration). Defaults to be passed to the ConfigParser
2564 can be specified in the *defaults* argument.
Georg Brandl116aa622007-08-15 14:28:22 +00002565
Georg Brandlcd7f32b2009-06-08 09:13:45 +00002566 If *disable_existing_loggers* is true, any existing loggers that are not
2567 children of named loggers will be disabled.
Georg Brandl116aa622007-08-15 14:28:22 +00002568
Georg Brandlcd7f32b2009-06-08 09:13:45 +00002569
2570.. function:: listen(port=DEFAULT_LOGGING_CONFIG_PORT)
Georg Brandl116aa622007-08-15 14:28:22 +00002571
2572 Starts up a socket server on the specified port, and listens for new
2573 configurations. If no port is specified, the module's default
2574 :const:`DEFAULT_LOGGING_CONFIG_PORT` is used. Logging configurations will be
2575 sent as a file suitable for processing by :func:`fileConfig`. Returns a
2576 :class:`Thread` instance on which you can call :meth:`start` to start the
2577 server, and which you can :meth:`join` when appropriate. To stop the server,
Christian Heimes8b0facf2007-12-04 19:30:01 +00002578 call :func:`stopListening`.
2579
2580 To send a configuration to the socket, read in the configuration file and
2581 send it to the socket as a string of bytes preceded by a four-byte length
2582 string packed in binary using ``struct.pack('>L', n)``.
Georg Brandl116aa622007-08-15 14:28:22 +00002583
2584
2585.. function:: stopListening()
2586
Christian Heimes8b0facf2007-12-04 19:30:01 +00002587 Stops the listening server which was created with a call to :func:`listen`.
2588 This is typically called before calling :meth:`join` on the return value from
Georg Brandl116aa622007-08-15 14:28:22 +00002589 :func:`listen`.
2590
2591
2592.. _logging-config-fileformat:
2593
2594Configuration file format
2595^^^^^^^^^^^^^^^^^^^^^^^^^
2596
Benjamin Peterson960cf0f2009-01-09 04:11:44 +00002597The configuration file format understood by :func:`fileConfig` is based on
2598:mod:`configparser` functionality. The file must contain sections called
2599``[loggers]``, ``[handlers]`` and ``[formatters]`` which identify by name the
2600entities of each type which are defined in the file. For each such entity, there
2601is a separate section which identifies how that entity is configured. Thus, for
2602a logger named ``log01`` in the ``[loggers]`` section, the relevant
2603configuration details are held in a section ``[logger_log01]``. Similarly, a
2604handler called ``hand01`` in the ``[handlers]`` section will have its
2605configuration held in a section called ``[handler_hand01]``, while a formatter
2606called ``form01`` in the ``[formatters]`` section will have its configuration
2607specified in a section called ``[formatter_form01]``. The root logger
2608configuration must be specified in a section called ``[logger_root]``.
Georg Brandl116aa622007-08-15 14:28:22 +00002609
2610Examples of these sections in the file are given below. ::
2611
2612 [loggers]
2613 keys=root,log02,log03,log04,log05,log06,log07
2614
2615 [handlers]
2616 keys=hand01,hand02,hand03,hand04,hand05,hand06,hand07,hand08,hand09
2617
2618 [formatters]
2619 keys=form01,form02,form03,form04,form05,form06,form07,form08,form09
2620
2621The root logger must specify a level and a list of handlers. An example of a
2622root logger section is given below. ::
2623
2624 [logger_root]
2625 level=NOTSET
2626 handlers=hand01
2627
2628The ``level`` entry can be one of ``DEBUG, INFO, WARNING, ERROR, CRITICAL`` or
2629``NOTSET``. For the root logger only, ``NOTSET`` means that all messages will be
2630logged. Level values are :func:`eval`\ uated in the context of the ``logging``
2631package's namespace.
2632
2633The ``handlers`` entry is a comma-separated list of handler names, which must
2634appear in the ``[handlers]`` section. These names must appear in the
2635``[handlers]`` section and have corresponding sections in the configuration
2636file.
2637
2638For loggers other than the root logger, some additional information is required.
2639This is illustrated by the following example. ::
2640
2641 [logger_parser]
2642 level=DEBUG
2643 handlers=hand01
2644 propagate=1
2645 qualname=compiler.parser
2646
2647The ``level`` and ``handlers`` entries are interpreted as for the root logger,
2648except that if a non-root logger's level is specified as ``NOTSET``, the system
2649consults loggers higher up the hierarchy to determine the effective level of the
2650logger. The ``propagate`` entry is set to 1 to indicate that messages must
2651propagate to handlers higher up the logger hierarchy from this logger, or 0 to
2652indicate that messages are **not** propagated to handlers up the hierarchy. The
2653``qualname`` entry is the hierarchical channel name of the logger, that is to
2654say the name used by the application to get the logger.
2655
2656Sections which specify handler configuration are exemplified by the following.
2657::
2658
2659 [handler_hand01]
2660 class=StreamHandler
2661 level=NOTSET
2662 formatter=form01
2663 args=(sys.stdout,)
2664
2665The ``class`` entry indicates the handler's class (as determined by :func:`eval`
2666in the ``logging`` package's namespace). The ``level`` is interpreted as for
2667loggers, and ``NOTSET`` is taken to mean "log everything".
2668
2669The ``formatter`` entry indicates the key name of the formatter for this
2670handler. If blank, a default formatter (``logging._defaultFormatter``) is used.
2671If a name is specified, it must appear in the ``[formatters]`` section and have
2672a corresponding section in the configuration file.
2673
2674The ``args`` entry, when :func:`eval`\ uated in the context of the ``logging``
2675package's namespace, is the list of arguments to the constructor for the handler
2676class. Refer to the constructors for the relevant handlers, or to the examples
2677below, to see how typical entries are constructed. ::
2678
2679 [handler_hand02]
2680 class=FileHandler
2681 level=DEBUG
2682 formatter=form02
2683 args=('python.log', 'w')
2684
2685 [handler_hand03]
2686 class=handlers.SocketHandler
2687 level=INFO
2688 formatter=form03
2689 args=('localhost', handlers.DEFAULT_TCP_LOGGING_PORT)
2690
2691 [handler_hand04]
2692 class=handlers.DatagramHandler
2693 level=WARN
2694 formatter=form04
2695 args=('localhost', handlers.DEFAULT_UDP_LOGGING_PORT)
2696
2697 [handler_hand05]
2698 class=handlers.SysLogHandler
2699 level=ERROR
2700 formatter=form05
2701 args=(('localhost', handlers.SYSLOG_UDP_PORT), handlers.SysLogHandler.LOG_USER)
2702
2703 [handler_hand06]
2704 class=handlers.NTEventLogHandler
2705 level=CRITICAL
2706 formatter=form06
2707 args=('Python Application', '', 'Application')
2708
2709 [handler_hand07]
2710 class=handlers.SMTPHandler
2711 level=WARN
2712 formatter=form07
2713 args=('localhost', 'from@abc', ['user1@abc', 'user2@xyz'], 'Logger Subject')
2714
2715 [handler_hand08]
2716 class=handlers.MemoryHandler
2717 level=NOTSET
2718 formatter=form08
2719 target=
2720 args=(10, ERROR)
2721
2722 [handler_hand09]
2723 class=handlers.HTTPHandler
2724 level=NOTSET
2725 formatter=form09
2726 args=('localhost:9022', '/log', 'GET')
2727
2728Sections which specify formatter configuration are typified by the following. ::
2729
2730 [formatter_form01]
2731 format=F1 %(asctime)s %(levelname)s %(message)s
2732 datefmt=
2733 class=logging.Formatter
2734
2735The ``format`` entry is the overall format string, and the ``datefmt`` entry is
Christian Heimes5b5e81c2007-12-31 16:14:33 +00002736the :func:`strftime`\ -compatible date/time format string. If empty, the
2737package substitutes ISO8601 format date/times, which is almost equivalent to
2738specifying the date format string ``"%Y-%m-%d %H:%M:%S"``. The ISO8601 format
2739also specifies milliseconds, which are appended to the result of using the above
2740format string, with a comma separator. An example time in ISO8601 format is
2741``2003-01-23 00:29:50,411``.
Georg Brandl116aa622007-08-15 14:28:22 +00002742
2743The ``class`` entry is optional. It indicates the name of the formatter's class
2744(as a dotted module and class name.) This option is useful for instantiating a
2745:class:`Formatter` subclass. Subclasses of :class:`Formatter` can present
2746exception tracebacks in an expanded or condensed format.
2747
Christian Heimes8b0facf2007-12-04 19:30:01 +00002748
2749Configuration server example
2750^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2751
2752Here is an example of a module using the logging configuration server::
2753
2754 import logging
2755 import logging.config
2756 import time
2757 import os
2758
2759 # read initial config file
2760 logging.config.fileConfig("logging.conf")
2761
2762 # create and start listener on port 9999
2763 t = logging.config.listen(9999)
2764 t.start()
2765
2766 logger = logging.getLogger("simpleExample")
2767
2768 try:
2769 # loop through logging calls to see the difference
2770 # new configurations make, until Ctrl+C is pressed
2771 while True:
2772 logger.debug("debug message")
2773 logger.info("info message")
2774 logger.warn("warn message")
2775 logger.error("error message")
2776 logger.critical("critical message")
2777 time.sleep(5)
2778 except KeyboardInterrupt:
2779 # cleanup
2780 logging.config.stopListening()
2781 t.join()
2782
2783And here is a script that takes a filename and sends that file to the server,
2784properly preceded with the binary-encoded length, as the new logging
2785configuration::
2786
2787 #!/usr/bin/env python
2788 import socket, sys, struct
2789
2790 data_to_send = open(sys.argv[1], "r").read()
2791
2792 HOST = 'localhost'
2793 PORT = 9999
2794 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Georg Brandlf6945182008-02-01 11:56:49 +00002795 print("connecting...")
Christian Heimes8b0facf2007-12-04 19:30:01 +00002796 s.connect((HOST, PORT))
Georg Brandlf6945182008-02-01 11:56:49 +00002797 print("sending config...")
Christian Heimes8b0facf2007-12-04 19:30:01 +00002798 s.send(struct.pack(">L", len(data_to_send)))
2799 s.send(data_to_send)
2800 s.close()
Georg Brandlf6945182008-02-01 11:56:49 +00002801 print("complete")
Christian Heimes8b0facf2007-12-04 19:30:01 +00002802
2803
2804More examples
2805-------------
2806
2807Multiple handlers and formatters
2808^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2809
2810Loggers are plain Python objects. The :func:`addHandler` method has no minimum
2811or maximum quota for the number of handlers you may add. Sometimes it will be
2812beneficial for an application to log all messages of all severities to a text
2813file while simultaneously logging errors or above to the console. To set this
2814up, simply configure the appropriate handlers. The logging calls in the
2815application code will remain unchanged. Here is a slight modification to the
2816previous simple module-based configuration example::
2817
2818 import logging
2819
2820 logger = logging.getLogger("simple_example")
2821 logger.setLevel(logging.DEBUG)
2822 # create file handler which logs even debug messages
2823 fh = logging.FileHandler("spam.log")
2824 fh.setLevel(logging.DEBUG)
2825 # create console handler with a higher log level
2826 ch = logging.StreamHandler()
2827 ch.setLevel(logging.ERROR)
2828 # create formatter and add it to the handlers
2829 formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
2830 ch.setFormatter(formatter)
2831 fh.setFormatter(formatter)
2832 # add the handlers to logger
2833 logger.addHandler(ch)
2834 logger.addHandler(fh)
2835
2836 # "application" code
2837 logger.debug("debug message")
2838 logger.info("info message")
2839 logger.warn("warn message")
2840 logger.error("error message")
2841 logger.critical("critical message")
2842
2843Notice that the "application" code does not care about multiple handlers. All
2844that changed was the addition and configuration of a new handler named *fh*.
2845
2846The ability to create new handlers with higher- or lower-severity filters can be
2847very helpful when writing and testing an application. Instead of using many
2848``print`` statements for debugging, use ``logger.debug``: Unlike the print
2849statements, which you will have to delete or comment out later, the logger.debug
2850statements can remain intact in the source code and remain dormant until you
2851need them again. At that time, the only change that needs to happen is to
2852modify the severity level of the logger and/or handler to debug.
2853
2854
2855Using logging in multiple modules
2856^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2857
2858It was mentioned above that multiple calls to
2859``logging.getLogger('someLogger')`` return a reference to the same logger
2860object. This is true not only within the same module, but also across modules
2861as long as it is in the same Python interpreter process. It is true for
2862references to the same object; additionally, application code can define and
2863configure a parent logger in one module and create (but not configure) a child
2864logger in a separate module, and all logger calls to the child will pass up to
2865the parent. Here is a main module::
2866
2867 import logging
2868 import auxiliary_module
2869
2870 # create logger with "spam_application"
2871 logger = logging.getLogger("spam_application")
2872 logger.setLevel(logging.DEBUG)
2873 # create file handler which logs even debug messages
2874 fh = logging.FileHandler("spam.log")
2875 fh.setLevel(logging.DEBUG)
2876 # create console handler with a higher log level
2877 ch = logging.StreamHandler()
2878 ch.setLevel(logging.ERROR)
2879 # create formatter and add it to the handlers
2880 formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
2881 fh.setFormatter(formatter)
2882 ch.setFormatter(formatter)
2883 # add the handlers to the logger
2884 logger.addHandler(fh)
2885 logger.addHandler(ch)
2886
2887 logger.info("creating an instance of auxiliary_module.Auxiliary")
2888 a = auxiliary_module.Auxiliary()
2889 logger.info("created an instance of auxiliary_module.Auxiliary")
2890 logger.info("calling auxiliary_module.Auxiliary.do_something")
2891 a.do_something()
2892 logger.info("finished auxiliary_module.Auxiliary.do_something")
2893 logger.info("calling auxiliary_module.some_function()")
2894 auxiliary_module.some_function()
2895 logger.info("done with auxiliary_module.some_function()")
2896
2897Here is the auxiliary module::
2898
2899 import logging
2900
2901 # create logger
2902 module_logger = logging.getLogger("spam_application.auxiliary")
2903
2904 class Auxiliary:
2905 def __init__(self):
2906 self.logger = logging.getLogger("spam_application.auxiliary.Auxiliary")
2907 self.logger.info("creating an instance of Auxiliary")
2908 def do_something(self):
2909 self.logger.info("doing something")
2910 a = 1 + 1
2911 self.logger.info("done doing something")
2912
2913 def some_function():
2914 module_logger.info("received a call to \"some_function\"")
2915
2916The output looks like this::
2917
Christian Heimes043d6f62008-01-07 17:19:16 +00002918 2005-03-23 23:47:11,663 - spam_application - INFO -
Christian Heimes8b0facf2007-12-04 19:30:01 +00002919 creating an instance of auxiliary_module.Auxiliary
Christian Heimes043d6f62008-01-07 17:19:16 +00002920 2005-03-23 23:47:11,665 - spam_application.auxiliary.Auxiliary - INFO -
Christian Heimes8b0facf2007-12-04 19:30:01 +00002921 creating an instance of Auxiliary
Christian Heimes043d6f62008-01-07 17:19:16 +00002922 2005-03-23 23:47:11,665 - spam_application - INFO -
Christian Heimes8b0facf2007-12-04 19:30:01 +00002923 created an instance of auxiliary_module.Auxiliary
Christian Heimes043d6f62008-01-07 17:19:16 +00002924 2005-03-23 23:47:11,668 - spam_application - INFO -
Christian Heimes8b0facf2007-12-04 19:30:01 +00002925 calling auxiliary_module.Auxiliary.do_something
Christian Heimes043d6f62008-01-07 17:19:16 +00002926 2005-03-23 23:47:11,668 - spam_application.auxiliary.Auxiliary - INFO -
Christian Heimes8b0facf2007-12-04 19:30:01 +00002927 doing something
Christian Heimes043d6f62008-01-07 17:19:16 +00002928 2005-03-23 23:47:11,669 - spam_application.auxiliary.Auxiliary - INFO -
Christian Heimes8b0facf2007-12-04 19:30:01 +00002929 done doing something
Christian Heimes043d6f62008-01-07 17:19:16 +00002930 2005-03-23 23:47:11,670 - spam_application - INFO -
Christian Heimes8b0facf2007-12-04 19:30:01 +00002931 finished auxiliary_module.Auxiliary.do_something
Christian Heimes043d6f62008-01-07 17:19:16 +00002932 2005-03-23 23:47:11,671 - spam_application - INFO -
Christian Heimes8b0facf2007-12-04 19:30:01 +00002933 calling auxiliary_module.some_function()
Christian Heimes043d6f62008-01-07 17:19:16 +00002934 2005-03-23 23:47:11,672 - spam_application.auxiliary - INFO -
Christian Heimes8b0facf2007-12-04 19:30:01 +00002935 received a call to "some_function"
Christian Heimes043d6f62008-01-07 17:19:16 +00002936 2005-03-23 23:47:11,673 - spam_application - INFO -
Christian Heimes8b0facf2007-12-04 19:30:01 +00002937 done with auxiliary_module.some_function()
2938