blob: e6e285ed749868663a5ba91921fa854c3ade7266 [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
Vinay Sajipa18b9592010-12-12 13:20:55 +000017The key benefit of having the logging API provided by a standard library module
18is that all Python modules can participate in logging, so your application log
19can include your own messages integrated with messages from third-party
20modules.
21
22
23Logging tutorial
24----------------
25
26Logging is a means of tracking events that happen when some software runs. The
27software's developer adds logging calls to their code to indicate that certain
28events have occurred. An event is described by a descriptive message which can
29optionally contain variable data (i.e. data that is potentially different for
30each occurrence of the event). Events also have an importance which the
31developer ascribes to the event; the importance can also be called the *level*
32or *severity*.
33
34When to use logging
35^^^^^^^^^^^^^^^^^^^
36
37Logging provides a set of convenience functions for simple logging usage. These
38are :func:`debug`, :func:`info`, :func:`warning`, :func:`error` and
39:func:`critical`. To determine when to use logging, see the table below, which
40states, for each of a set of common tasks, the best tool to use for it.
41
42+-------------------------------------+--------------------------------------+
43| Task you want to perform | The best tool for the task |
44+=====================================+======================================+
45| Display console output for ordinary | print() |
46| usage of a command line script or | |
47| program | |
48+-------------------------------------+--------------------------------------+
49| Report events that occur during | logging.info() (or logging.debug() |
50| normal operation of a program (e.g. | for very detailed output for |
51| or status monitoring or fault | diagnostic purposes) |
52| investigation) | |
53+-------------------------------------+--------------------------------------+
54| Issue a warning regarding a | warnings.warn() in library code |
55| particular runtime event | if the issue is avoidable and the |
56| | client application should be |
57| | modified to eliminate the warning |
58| | |
59| | logging.warn() if there is nothing |
60| | the client application can do about |
61| | the situation, but the event should |
62| | still be noted |
63+-------------------------------------+--------------------------------------+
64| Report an error regarding a | Raise an exception |
65| particular runtime event | |
66+-------------------------------------+--------------------------------------+
67| Report suppression of an error | logging.error(), logging.exception(),|
68| without raising an exception (e.g. | or logging.critical() as appropriate |
69| error handler in a long-running | for the specific error and |
70| server process) | application domain |
71+-------------------------------------+--------------------------------------+
72
73The logging functions are named after the level or severity of the events
74they are used to track. The standard levels and their applicability are
75described below (in increasing order of severity):
76
77+--------------+---------------------------------------------+
78| Level | When it's used |
79+==============+=============================================+
80| ``DEBUG`` | Detailed information, typically of interest |
81| | only when diagnosing problems. |
82+--------------+---------------------------------------------+
83| ``INFO`` | Confirmation that things are working as |
84| | expected. |
85+--------------+---------------------------------------------+
86| ``WARNING`` | An indication that something unexpected |
87| | happened, or indicative of some problem in |
88| | the near future (e.g. "disk space low"). |
89| | The software is still working as expected. |
90+--------------+---------------------------------------------+
91| ``ERROR`` | Due to a more serious problem, the software |
92| | has not been able to perform some function. |
93+--------------+---------------------------------------------+
94| ``CRITICAL`` | A serious error, indicating that the program|
95| | itself may be unable to continue running. |
96+--------------+---------------------------------------------+
97
98The default level is ``WARNING``, which means that only events of this level
99and above will be tracked, unless the logging package is configured to do
100otherwise.
101
102Events that are tracked can be handled in different ways. The simplest way of
103handling tracked events is to print them to the console. Another common way
104is to write them to a disk file.
105
106
107.. _minimal-example:
108
109A simple example
110^^^^^^^^^^^^^^^^
111
112A very simple example is::
113
114 import logging
115 logging.warning('Watch out!') # will print a message to the console
116 logging.info('I told you so') # will not print anything
117
118If you type these lines into a script and run it, you'll see::
119
120 WARNING:root:Watch out!
121
122printed out on the console. The ``INFO`` message doesn't appear because the
123default level is ``WARNING``. The printed message includes the indication of
124the level and the description of the event provided in the logging call, i.e.
125'Watch out!'. Don't worry about the 'root' part for now: it will be explained
126later. The actual output can be formatted quite flexibly if you need that;
127formatting options will also be explained later.
128
129
130Logging to a file
131^^^^^^^^^^^^^^^^^
132
133A very common situation is that of recording logging events in a file, so let's
134look at that next::
135
136 import logging
137 logging.basicConfig(filename='example.log',level=logging.DEBUG)
138 logging.debug('This message should go to the log file')
139 logging.info('So should this')
140 logging.warning('And this, too')
141
142And now if we open the file and look at what we have, we should find the log
143messages::
144
145 DEBUG:root:This message should go to the log file
146 INFO:root:So should this
147 WARNING:root:And this, too
148
Vinay Sajip0e65cf02010-12-12 13:49:39 +0000149The call to :func:`basicConfig` should come *before* any calls to :func:`debug`,
150:func:`info` etc. As it's intended as a one-off simple configuration facility,
151only the first call will actually do anything: subsequent calls are effectively
152no-ops.
153
Vinay Sajipa18b9592010-12-12 13:20:55 +0000154This example also shows how you can set the logging level which acts as the
155threshold for tracking. In this case, because we set the threshold to
156``DEBUG``, all of the messages were printed.
157
158If you run the above script several times, the messages from successive runs
159are appended to the file *example.log*. If you want each run to start afresh,
160not remembering the messages from earlier runs, you can specify the *filemode*
161argument, by changing the call in the above example to::
162
163 logging.basicConfig(filename='example.log', filemode='w', level=logging.DEBUG)
164
165The output will be the same as before, but the log file is no longer appended
166to, so the messages from earlier runs are lost.
167
168
169Logging from multiple modules
170^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
171
172If your program consists of multiple modules, here's an example of how you
173could organize logging in it::
174
175 # myapp.py
176 import logging
177 import mylib
178
179 def main():
180 logging.basicConfig(filename='myapp.log', level=logging.INFO)
181 logging.info('Started')
182 mylib.do_something()
183 logging.info('Finished')
184
185 if __name__ == '__main__':
186 main()
187
188::
189
190 # mylib.py
191 import logging
192
193 def do_something():
194 logging.info('Doing something')
195
196If you run myapp.py, you should see this in myapp.log::
197
198 INFO:root:Started
199 INFO:root:Doing something
200 INFO:root:Finished
201
202which is hopefully what you were expecting to see. You can generalize this to
203multiple modules, using the pattern in *mylib.py*. Note that for this simple
204usage pattern, you won't know, by looking in the log file, *where* in your
205application your messages came from, apart from looking at the event
206description. If you want to track the location of your messages, you'll need
207to refer to the documentation beyond the tutorial level - see
208:ref:`more-advanced-logging`.
209
210
211Logging variable data
212^^^^^^^^^^^^^^^^^^^^^
213
214To log variable data, use a format string for the event description message and
215append the variable data as arguments. For example::
216
217 import logging
218 logging.warning('%s before you %s', 'Look', 'leap!')
219
220will display::
221
222 WARNING:root:Look before you leap!
223
224As you can see, merging of variable data into the event description message
225uses the old, %-style of string formatting. This is for backwards
226compatibility: the logging package pre-dates newer formatting options such as
227:meth:`str.format` and :class:`string.Template`. These formatting options *are*
228supported, but exploring them is outside the scope of this tutorial.
229
230
231Changing the format of displayed messages
232^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
233
234To change the format which is used to display messages, you need to
235specify the format you want to use::
236
237 import logging
238 logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.DEBUG)
239 logging.debug('This message should appear on the console')
240 logging.info('So should this')
241 logging.warning('And this, too')
242
243which would print::
244
245 DEBUG:This message should appear on the console
246 INFO:So should this
247 WARNING:And this, too
248
249Notice that the 'root' which appeared in earlier examples has disappeared. For
250a full set of things that can appear in format strings, you can refer to the
251documentation for :ref:`formatter-objects`, but for simple usage, you just need
252the *levelname* (severity), *message* (event description, including variable
253data) and perhaps to display when the event occurred. This is described in the
254next section.
255
256Displaying the date/time in messages
257^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
258
259To display the date and time of an event, you would place "%(asctime)s" in
260your format string::
261
262 import logging
263 logging.basicConfig(format='%(asctime)s %(message)s')
264 logging.warning('is when this event was logged.')
265
266which should print something like this::
267
268 2010-12-12 11:41:42,612 is when this event was logged.
269
270The default format for date/time display (shown above) is ISO8601. If you need
271more control over the formatting of the date/time, provide a *datefmt*
272argument to ``basicConfig``, as in this example::
273
274 import logging
275 logging.basicConfig(format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p')
276 logging.warning('is when this event was logged.')
277
278which would display something like this::
279
280 12/12/2010 11:46:36 AM is when this event was logged.
281
282The format of the *datefmt* argument is the same as supported by
283:func:`time.strftime`.
284
285
286Er...that's it for the tutorial
287^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
288
289That concludes the tutorial. It should be enough to get you up and running
290with logging. There's a lot more that the logging package offers, but to get
291the best out of it, you'll need to invest a little more of your time in
292reading the following sections. If you're ready for that, grab some of your
293favourite beverage and carry on.
294
295If your logging needs are simple, then use the above examples to incorporate
296logging into your own scripts, and if you run into problems or don't
297understand something, please post a question on the comp.lang.python Usenet
298group (available at http://groups.google.com/group/comp.lang.python) and you
299should receive help before too long.
300
301Still here? There's no need to read this long page in linear fashion, top to
302bottom. Take a look at the topics in the sidebar to see if there's something
303that interests you, and click on a topic to see more detail. Although some of
304the topics do follow on from each other, there are a few that can just stand
305alone.
306
307
308.. _more-advanced-logging:
309
310More advanced logging
311---------------------
312
313The logging library takes a modular approach and offers several categories
314of components: loggers, handlers, filters, and formatters. Loggers expose the
315interface that application code directly uses. Handlers send the log records
316(created by loggers) to the appropriate destination. Filters provide a finer
317grained facility for determining which log records to output. Formatters
318specify the layout of the resultant log record in the final output.
319
Georg Brandl116aa622007-08-15 14:28:22 +0000320Logging is performed by calling methods on instances of the :class:`Logger`
321class (hereafter called :dfn:`loggers`). Each instance has a name, and they are
Georg Brandl9afde1c2007-11-01 20:32:30 +0000322conceptually arranged in a namespace hierarchy using dots (periods) as
Georg Brandl116aa622007-08-15 14:28:22 +0000323separators. For example, a logger named "scan" is the parent of loggers
324"scan.text", "scan.html" and "scan.pdf". Logger names can be anything you want,
325and indicate the area of an application in which a logged message originates.
326
Vinay Sajip5286ccf2010-12-12 13:25:29 +0000327A good convention to use when naming loggers is to use a module-level logger,
328in each module which uses logging, named as follows::
329
330 logger = logging.getLogger(__name__)
331
332This means that logger names track the package/module hierarchy, and it's
333intuitively obvious where events are logged just from the logger name.
334
Vinay Sajipa18b9592010-12-12 13:20:55 +0000335The root of the hierarchy of loggers is called the root logger. That's the
336logger used by the functions :func:`debug`, :func:`info`, :func:`warning`,
337:func:`error` and :func:`critical`, which just call the same-named method of
338the root logger. The functions and the methods have the same signatures. The
339root logger's name is printed as 'root' in the logged output.
Georg Brandl116aa622007-08-15 14:28:22 +0000340
Vinay Sajipa18b9592010-12-12 13:20:55 +0000341It is, of course, possible to log messages to different destinations. Support
342for writing log messages to files, HTTP GET/POST locations, email via SMTP,
343generic sockets, or OS-specific logging mechanisms is included in the package.
344Destinations are served by :dfn:`handler` classes. You can create your own log
Vinay Sajipdfa0a2a2010-12-10 08:17:05 +0000345destination class if you have special requirements not met by any of the
Vinay Sajipa18b9592010-12-12 13:20:55 +0000346built-in handler classes.
Christian Heimes8b0facf2007-12-04 19:30:01 +0000347
Vinay Sajipa18b9592010-12-12 13:20:55 +0000348By default, no destination is set for any logging messages. You can specify
349a destination (such as console or file) by using :func:`basicConfig` as in the
350tutorial examples. If you call the functions :func:`debug`, :func:`info`,
351:func:`warning`, :func:`error` and :func:`critical`, they will check to see
352if no destination is set; and if one is not set, they will set a destination
353of the console (``sys.stderr``) and a default format for the displayed
354message before delegating to the root logger to do the actual message output.
Christian Heimes8b0facf2007-12-04 19:30:01 +0000355
Vinay Sajipa18b9592010-12-12 13:20:55 +0000356The default format set by :func:`basicConfig` for messages is::
Christian Heimes8b0facf2007-12-04 19:30:01 +0000357
Vinay Sajipa18b9592010-12-12 13:20:55 +0000358 severity:logger name:message
Christian Heimes8b0facf2007-12-04 19:30:01 +0000359
Vinay Sajipa18b9592010-12-12 13:20:55 +0000360You can change this by passing a format string to :func:`basicConfig` with the
361*format* keyword argument. For all options regarding how a format string is
362constructed, see :ref:`formatter-objects`.
Christian Heimes8b0facf2007-12-04 19:30:01 +0000363
Christian Heimes8b0facf2007-12-04 19:30:01 +0000364
365Loggers
366^^^^^^^
367
Christian Heimes8b0facf2007-12-04 19:30:01 +0000368:class:`Logger` objects have a threefold job. First, they expose several
369methods to application code so that applications can log messages at runtime.
370Second, logger objects determine which log messages to act upon based upon
371severity (the default filtering facility) or filter objects. Third, logger
372objects pass along relevant log messages to all interested log handlers.
373
374The most widely used methods on logger objects fall into two categories:
375configuration and message sending.
376
377* :meth:`Logger.setLevel` specifies the lowest-severity log message a logger
378 will handle, where debug is the lowest built-in severity level and critical is
379 the highest built-in severity. For example, if the severity level is info,
380 the logger will handle only info, warning, error, and critical messages and
381 will ignore debug messages.
382
383* :meth:`Logger.addFilter` and :meth:`Logger.removeFilter` add and remove filter
384 objects from the logger object. This tutorial does not address filters.
385
386With the logger object configured, the following methods create log messages:
387
388* :meth:`Logger.debug`, :meth:`Logger.info`, :meth:`Logger.warning`,
389 :meth:`Logger.error`, and :meth:`Logger.critical` all create log records with
390 a message and a level that corresponds to their respective method names. The
391 message is actually a format string, which may contain the standard string
392 substitution syntax of :const:`%s`, :const:`%d`, :const:`%f`, and so on. The
393 rest of their arguments is a list of objects that correspond with the
394 substitution fields in the message. With regard to :const:`**kwargs`, the
395 logging methods care only about a keyword of :const:`exc_info` and use it to
396 determine whether to log exception information.
397
398* :meth:`Logger.exception` creates a log message similar to
399 :meth:`Logger.error`. The difference is that :meth:`Logger.exception` dumps a
400 stack trace along with it. Call this method only from an exception handler.
401
402* :meth:`Logger.log` takes a log level as an explicit argument. This is a
403 little more verbose for logging messages than using the log level convenience
404 methods listed above, but this is how to log at custom log levels.
405
Christian Heimesdcca98d2008-02-25 13:19:43 +0000406:func:`getLogger` returns a reference to a logger instance with the specified
Vinay Sajipc15dfd62010-07-06 15:08:55 +0000407name if it is provided, or ``root`` if not. The names are period-separated
Christian Heimes8b0facf2007-12-04 19:30:01 +0000408hierarchical structures. Multiple calls to :func:`getLogger` with the same name
409will return a reference to the same logger object. Loggers that are further
410down in the hierarchical list are children of loggers higher up in the list.
411For example, given a logger with a name of ``foo``, loggers with names of
Benjamin Peterson22005fc2010-04-11 16:25:06 +0000412``foo.bar``, ``foo.bar.baz``, and ``foo.bam`` are all descendants of ``foo``.
413Child loggers propagate messages up to the handlers associated with their
414ancestor loggers. Because of this, it is unnecessary to define and configure
415handlers for all the loggers an application uses. It is sufficient to
416configure handlers for a top-level logger and create child loggers as needed.
Christian Heimes8b0facf2007-12-04 19:30:01 +0000417
418
419Handlers
420^^^^^^^^
421
422:class:`Handler` objects are responsible for dispatching the appropriate log
423messages (based on the log messages' severity) to the handler's specified
424destination. Logger objects can add zero or more handler objects to themselves
425with an :func:`addHandler` method. As an example scenario, an application may
426want to send all log messages to a log file, all log messages of error or higher
427to stdout, and all messages of critical to an email address. This scenario
Christian Heimesc3f30c42008-02-22 16:37:40 +0000428requires three individual handlers where each handler is responsible for sending
Christian Heimes8b0facf2007-12-04 19:30:01 +0000429messages of a specific severity to a specific location.
430
431The standard library includes quite a few handler types; this tutorial uses only
432:class:`StreamHandler` and :class:`FileHandler` in its examples.
433
434There are very few methods in a handler for application developers to concern
435themselves with. The only handler methods that seem relevant for application
436developers who are using the built-in handler objects (that is, not creating
437custom handlers) are the following configuration methods:
438
439* The :meth:`Handler.setLevel` method, just as in logger objects, specifies the
440 lowest severity that will be dispatched to the appropriate destination. Why
441 are there two :func:`setLevel` methods? The level set in the logger
442 determines which severity of messages it will pass to its handlers. The level
443 set in each handler determines which messages that handler will send on.
Benjamin Peterson22005fc2010-04-11 16:25:06 +0000444
445* :func:`setFormatter` selects a Formatter object for this handler to use.
Christian Heimes8b0facf2007-12-04 19:30:01 +0000446
447* :func:`addFilter` and :func:`removeFilter` respectively configure and
448 deconfigure filter objects on handlers.
449
Benjamin Peterson22005fc2010-04-11 16:25:06 +0000450Application code should not directly instantiate and use instances of
451:class:`Handler`. Instead, the :class:`Handler` class is a base class that
452defines the interface that all handlers should have and establishes some
453default behavior that child classes can use (or override).
Christian Heimes8b0facf2007-12-04 19:30:01 +0000454
455
456Formatters
457^^^^^^^^^^
458
459Formatter objects configure the final order, structure, and contents of the log
Christian Heimesdcca98d2008-02-25 13:19:43 +0000460message. Unlike the base :class:`logging.Handler` class, application code may
Christian Heimes8b0facf2007-12-04 19:30:01 +0000461instantiate formatter classes, although you could likely subclass the formatter
Vinay Sajipa39c5712010-10-25 13:57:39 +0000462if your application needs special behavior. The constructor takes three
463optional arguments -- a message format string, a date format string and a style
464indicator.
465
466.. method:: logging.Formatter.__init__(fmt=None, datefmt=None, style='%')
467
468If there is no message format string, the default is to use the
469raw message. If there is no date format string, the default date format is::
Christian Heimes8b0facf2007-12-04 19:30:01 +0000470
471 %Y-%m-%d %H:%M:%S
472
Vinay Sajipa39c5712010-10-25 13:57:39 +0000473with the milliseconds tacked on at the end. The ``style`` is one of `%`, '{'
474or '$'. If one of these is not specified, then '%' will be used.
Christian Heimes8b0facf2007-12-04 19:30:01 +0000475
Vinay Sajipa39c5712010-10-25 13:57:39 +0000476If the ``style`` is '%', the message format string uses
477``%(<dictionary key>)s`` styled string substitution; the possible keys are
478documented in :ref:`formatter-objects`. If the style is '{', the message format
479string is assumed to be compatible with :meth:`str.format` (using keyword
480arguments), while if the style is '$' then the message format string should
481conform to what is expected by :meth:`string.Template.substitute`.
482
483.. versionchanged:: 3.2
484 Added the ``style`` parameter.
Christian Heimes8b0facf2007-12-04 19:30:01 +0000485
486The following message format string will log the time in a human-readable
487format, the severity of the message, and the contents of the message, in that
488order::
489
490 "%(asctime)s - %(levelname)s - %(message)s"
491
Vinay Sajip40d9a4e2010-08-30 18:10:03 +0000492Formatters use a user-configurable function to convert the creation time of a
493record to a tuple. By default, :func:`time.localtime` is used; to change this
494for a particular formatter instance, set the ``converter`` attribute of the
495instance to a function with the same signature as :func:`time.localtime` or
496:func:`time.gmtime`. To change it for all formatters, for example if you want
497all logging times to be shown in GMT, set the ``converter`` attribute in the
498Formatter class (to ``time.gmtime`` for GMT display).
499
Christian Heimes8b0facf2007-12-04 19:30:01 +0000500
501Configuring Logging
502^^^^^^^^^^^^^^^^^^^
503
Benjamin Petersond7c3ed52010-06-27 22:32:30 +0000504Programmers can configure logging in three ways:
505
5061. Creating loggers, handlers, and formatters explicitly using Python
507 code that calls the configuration methods listed above.
5082. Creating a logging config file and reading it using the :func:`fileConfig`
509 function.
5103. Creating a dictionary of configuration information and passing it
511 to the :func:`dictConfig` function.
512
513The following example configures a very simple logger, a console
514handler, and a simple formatter using Python code::
Christian Heimes8b0facf2007-12-04 19:30:01 +0000515
516 import logging
517
518 # create logger
519 logger = logging.getLogger("simple_example")
520 logger.setLevel(logging.DEBUG)
Benjamin Petersond7c3ed52010-06-27 22:32:30 +0000521
Christian Heimes8b0facf2007-12-04 19:30:01 +0000522 # create console handler and set level to debug
523 ch = logging.StreamHandler()
524 ch.setLevel(logging.DEBUG)
Benjamin Petersond7c3ed52010-06-27 22:32:30 +0000525
Christian Heimes8b0facf2007-12-04 19:30:01 +0000526 # create formatter
527 formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
Benjamin Petersond7c3ed52010-06-27 22:32:30 +0000528
Christian Heimes8b0facf2007-12-04 19:30:01 +0000529 # add formatter to ch
530 ch.setFormatter(formatter)
Benjamin Petersond7c3ed52010-06-27 22:32:30 +0000531
Christian Heimes8b0facf2007-12-04 19:30:01 +0000532 # add ch to logger
533 logger.addHandler(ch)
534
535 # "application" code
536 logger.debug("debug message")
537 logger.info("info message")
538 logger.warn("warn message")
539 logger.error("error message")
540 logger.critical("critical message")
541
542Running this module from the command line produces the following output::
543
544 $ python simple_logging_module.py
545 2005-03-19 15:10:26,618 - simple_example - DEBUG - debug message
546 2005-03-19 15:10:26,620 - simple_example - INFO - info message
547 2005-03-19 15:10:26,695 - simple_example - WARNING - warn message
548 2005-03-19 15:10:26,697 - simple_example - ERROR - error message
549 2005-03-19 15:10:26,773 - simple_example - CRITICAL - critical message
550
551The following Python module creates a logger, handler, and formatter nearly
552identical to those in the example listed above, with the only difference being
553the names of the objects::
554
555 import logging
556 import logging.config
557
558 logging.config.fileConfig("logging.conf")
559
560 # create logger
561 logger = logging.getLogger("simpleExample")
562
563 # "application" code
564 logger.debug("debug message")
565 logger.info("info message")
566 logger.warn("warn message")
567 logger.error("error message")
568 logger.critical("critical message")
569
570Here is the logging.conf file::
571
572 [loggers]
573 keys=root,simpleExample
574
575 [handlers]
576 keys=consoleHandler
577
578 [formatters]
579 keys=simpleFormatter
580
581 [logger_root]
582 level=DEBUG
583 handlers=consoleHandler
584
585 [logger_simpleExample]
586 level=DEBUG
587 handlers=consoleHandler
588 qualname=simpleExample
589 propagate=0
590
591 [handler_consoleHandler]
592 class=StreamHandler
593 level=DEBUG
594 formatter=simpleFormatter
595 args=(sys.stdout,)
596
597 [formatter_simpleFormatter]
598 format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
599 datefmt=
600
601The output is nearly identical to that of the non-config-file-based example::
602
603 $ python simple_logging_config.py
604 2005-03-19 15:38:55,977 - simpleExample - DEBUG - debug message
605 2005-03-19 15:38:55,979 - simpleExample - INFO - info message
606 2005-03-19 15:38:56,054 - simpleExample - WARNING - warn message
607 2005-03-19 15:38:56,055 - simpleExample - ERROR - error message
608 2005-03-19 15:38:56,130 - simpleExample - CRITICAL - critical message
609
610You can see that the config file approach has a few advantages over the Python
611code approach, mainly separation of configuration and code and the ability of
612noncoders to easily modify the logging properties.
613
Benjamin Peterson9451a1c2010-03-13 22:30:34 +0000614Note that the class names referenced in config files need to be either relative
615to the logging module, or absolute values which can be resolved using normal
Senthil Kumaran46a48be2010-10-15 13:10:10 +0000616import mechanisms. Thus, you could use either
617:class:`handlers.WatchedFileHandler` (relative to the logging module) or
618``mypackage.mymodule.MyHandler`` (for a class defined in package ``mypackage``
619and module ``mymodule``, where ``mypackage`` is available on the Python import
620path).
Benjamin Peterson9451a1c2010-03-13 22:30:34 +0000621
Benjamin Peterson56894b52010-06-28 00:16:12 +0000622In Python 3.2, a new means of configuring logging has been introduced, using
Benjamin Petersond7c3ed52010-06-27 22:32:30 +0000623dictionaries to hold configuration information. This provides a superset of the
624functionality of the config-file-based approach outlined above, and is the
625recommended configuration method for new applications and deployments. Because
626a Python dictionary is used to hold configuration information, and since you
627can populate that dictionary using different means, you have more options for
628configuration. For example, you can use a configuration file in JSON format,
629or, if you have access to YAML processing functionality, a file in YAML
630format, to populate the configuration dictionary. Or, of course, you can
631construct the dictionary in Python code, receive it in pickled form over a
632socket, or use whatever approach makes sense for your application.
633
634Here's an example of the same configuration as above, in YAML format for
635the new dictionary-based approach::
636
637 version: 1
638 formatters:
639 simple:
640 format: format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
641 handlers:
642 console:
643 class: logging.StreamHandler
644 level: DEBUG
645 formatter: simple
646 stream: ext://sys.stdout
647 loggers:
648 simpleExample:
649 level: DEBUG
650 handlers: [console]
651 propagate: no
652 root:
653 level: DEBUG
654 handlers: [console]
655
656For more information about logging using a dictionary, see
657:ref:`logging-config-api`.
658
Vinay Sajip26a2d5e2009-01-10 13:37:26 +0000659.. _library-config:
Vinay Sajip30bf1222009-01-10 19:23:34 +0000660
Benjamin Peterson3e4f0552008-09-02 00:31:15 +0000661Configuring Logging for a Library
662^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
663
664When developing a library which uses logging, some consideration needs to be
665given to its configuration. If the using application does not use logging, and
666library code makes logging calls, then a one-off message "No handlers could be
667found for logger X.Y.Z" is printed to the console. This message is intended
668to catch mistakes in logging configuration, but will confuse an application
669developer who is not aware of logging by the library.
670
671In addition to documenting how a library uses logging, a good way to configure
672library logging so that it does not cause a spurious message is to add a
673handler which does nothing. This avoids the message being printed, since a
674handler will be found: it just doesn't produce any output. If the library user
675configures logging for application use, presumably that configuration will add
676some handlers, and if levels are suitably configured then logging calls made
677in library code will send output to those handlers, as normal.
678
679A do-nothing handler can be simply defined as follows::
680
681 import logging
682
683 class NullHandler(logging.Handler):
684 def emit(self, record):
685 pass
686
687An instance of this handler should be added to the top-level logger of the
688logging namespace used by the library. If all logging by a library *foo* is
689done using loggers with names matching "foo.x.y", then the code::
690
691 import logging
692
693 h = NullHandler()
694 logging.getLogger("foo").addHandler(h)
695
696should have the desired effect. If an organisation produces a number of
697libraries, then the logger name specified can be "orgname.foo" rather than
698just "foo".
699
Vinay Sajip76ca3b42010-09-27 13:53:47 +0000700**PLEASE NOTE:** It is strongly advised that you *do not add any handlers other
701than* :class:`NullHandler` *to your library's loggers*. This is because the
702configuration of handlers is the prerogative of the application developer who
703uses your library. The application developer knows their target audience and
704what handlers are most appropriate for their application: if you add handlers
705"under the hood", you might well interfere with their ability to carry out
706unit tests and deliver logs which suit their requirements.
707
Georg Brandlf9734072008-12-07 15:30:06 +0000708.. versionadded:: 3.1
Georg Brandl1eb40bc2010-12-03 15:30:09 +0000709 The :class:`NullHandler` class.
Georg Brandlf9734072008-12-07 15:30:06 +0000710
Christian Heimes8b0facf2007-12-04 19:30:01 +0000711
712Logging Levels
713--------------
714
Georg Brandl116aa622007-08-15 14:28:22 +0000715The numeric values of logging levels are given in the following table. These are
716primarily of interest if you want to define your own levels, and need them to
717have specific values relative to the predefined levels. If you define a level
718with the same numeric value, it overwrites the predefined value; the predefined
719name is lost.
720
721+--------------+---------------+
722| Level | Numeric value |
723+==============+===============+
724| ``CRITICAL`` | 50 |
725+--------------+---------------+
726| ``ERROR`` | 40 |
727+--------------+---------------+
728| ``WARNING`` | 30 |
729+--------------+---------------+
730| ``INFO`` | 20 |
731+--------------+---------------+
732| ``DEBUG`` | 10 |
733+--------------+---------------+
734| ``NOTSET`` | 0 |
735+--------------+---------------+
736
737Levels can also be associated with loggers, being set either by the developer or
738through loading a saved logging configuration. When a logging method is called
739on a logger, the logger compares its own level with the level associated with
740the method call. If the logger's level is higher than the method call's, no
741logging message is actually generated. This is the basic mechanism controlling
742the verbosity of logging output.
743
744Logging messages are encoded as instances of the :class:`LogRecord` class. When
745a logger decides to actually log an event, a :class:`LogRecord` instance is
746created from the logging message.
747
748Logging messages are subjected to a dispatch mechanism through the use of
749:dfn:`handlers`, which are instances of subclasses of the :class:`Handler`
750class. Handlers are responsible for ensuring that a logged message (in the form
751of a :class:`LogRecord`) ends up in a particular location (or set of locations)
752which is useful for the target audience for that message (such as end users,
753support desk staff, system administrators, developers). Handlers are passed
754:class:`LogRecord` instances intended for particular destinations. Each logger
755can have zero, one or more handlers associated with it (via the
756:meth:`addHandler` method of :class:`Logger`). In addition to any handlers
757directly associated with a logger, *all handlers associated with all ancestors
Benjamin Peterson22005fc2010-04-11 16:25:06 +0000758of the logger* are called to dispatch the message (unless the *propagate* flag
759for a logger is set to a false value, at which point the passing to ancestor
760handlers stops).
Georg Brandl116aa622007-08-15 14:28:22 +0000761
762Just as for loggers, handlers can have levels associated with them. A handler's
763level acts as a filter in the same way as a logger's level does. If a handler
764decides to actually dispatch an event, the :meth:`emit` method is used to send
765the message to its destination. Most user-defined subclasses of :class:`Handler`
766will need to override this :meth:`emit`.
767
Vinay Sajipc8c8c692010-09-17 10:09:04 +0000768.. _custom-levels:
769
770Custom Levels
771^^^^^^^^^^^^^
772
773Defining your own levels is possible, but should not be necessary, as the
774existing levels have been chosen on the basis of practical experience.
775However, if you are convinced that you need custom levels, great care should
776be exercised when doing this, and it is possibly *a very bad idea to define
777custom levels if you are developing a library*. That's because if multiple
778library authors all define their own custom levels, there is a chance that
779the logging output from such multiple libraries used together will be
780difficult for the using developer to control and/or interpret, because a
781given numeric value might mean different things for different libraries.
782
783
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000784Useful Handlers
785---------------
786
Georg Brandl116aa622007-08-15 14:28:22 +0000787In addition to the base :class:`Handler` class, many useful subclasses are
788provided:
789
Vinay Sajip121a1c42010-09-08 10:46:15 +0000790#. :class:`StreamHandler` instances send messages to streams (file-like
Georg Brandl116aa622007-08-15 14:28:22 +0000791 objects).
792
Vinay Sajip121a1c42010-09-08 10:46:15 +0000793#. :class:`FileHandler` instances send messages to disk files.
Georg Brandl116aa622007-08-15 14:28:22 +0000794
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000795.. module:: logging.handlers
Vinay Sajip30bf1222009-01-10 19:23:34 +0000796
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000797#. :class:`BaseRotatingHandler` is the base class for handlers that
798 rotate log files at a certain point. It is not meant to be instantiated
799 directly. Instead, use :class:`RotatingFileHandler` or
800 :class:`TimedRotatingFileHandler`.
Georg Brandl116aa622007-08-15 14:28:22 +0000801
Vinay Sajip121a1c42010-09-08 10:46:15 +0000802#. :class:`RotatingFileHandler` instances send messages to disk
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000803 files, with support for maximum log file sizes and log file rotation.
Georg Brandl116aa622007-08-15 14:28:22 +0000804
Vinay Sajip121a1c42010-09-08 10:46:15 +0000805#. :class:`TimedRotatingFileHandler` instances send messages to
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000806 disk files, rotating the log file at certain timed intervals.
Georg Brandl116aa622007-08-15 14:28:22 +0000807
Vinay Sajip121a1c42010-09-08 10:46:15 +0000808#. :class:`SocketHandler` instances send messages to TCP/IP
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000809 sockets.
Georg Brandl116aa622007-08-15 14:28:22 +0000810
Vinay Sajip121a1c42010-09-08 10:46:15 +0000811#. :class:`DatagramHandler` instances send messages to UDP
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000812 sockets.
Georg Brandl116aa622007-08-15 14:28:22 +0000813
Vinay Sajip121a1c42010-09-08 10:46:15 +0000814#. :class:`SMTPHandler` instances send messages to a designated
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000815 email address.
Georg Brandl116aa622007-08-15 14:28:22 +0000816
Vinay Sajip121a1c42010-09-08 10:46:15 +0000817#. :class:`SysLogHandler` instances send messages to a Unix
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000818 syslog daemon, possibly on a remote machine.
Georg Brandl116aa622007-08-15 14:28:22 +0000819
Vinay Sajip121a1c42010-09-08 10:46:15 +0000820#. :class:`NTEventLogHandler` instances send messages to a
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000821 Windows NT/2000/XP event log.
Georg Brandl116aa622007-08-15 14:28:22 +0000822
Vinay Sajip121a1c42010-09-08 10:46:15 +0000823#. :class:`MemoryHandler` instances send messages to a buffer
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000824 in memory, which is flushed whenever specific criteria are met.
Georg Brandl116aa622007-08-15 14:28:22 +0000825
Vinay Sajip121a1c42010-09-08 10:46:15 +0000826#. :class:`HTTPHandler` instances send messages to an HTTP
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000827 server using either ``GET`` or ``POST`` semantics.
Georg Brandl116aa622007-08-15 14:28:22 +0000828
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000829#. :class:`WatchedFileHandler` instances watch the file they are
830 logging to. If the file changes, it is closed and reopened using the file
831 name. This handler is only useful on Unix-like systems; Windows does not
832 support the underlying mechanism used.
Vinay Sajip30bf1222009-01-10 19:23:34 +0000833
Vinay Sajip121a1c42010-09-08 10:46:15 +0000834#. :class:`QueueHandler` instances send messages to a queue, such as
835 those implemented in the :mod:`queue` or :mod:`multiprocessing` modules.
836
Vinay Sajip30bf1222009-01-10 19:23:34 +0000837.. currentmodule:: logging
838
Georg Brandlf9734072008-12-07 15:30:06 +0000839#. :class:`NullHandler` instances do nothing with error messages. They are used
840 by library developers who want to use logging, but want to avoid the "No
841 handlers could be found for logger XXX" message which can be displayed if
Vinay Sajip26a2d5e2009-01-10 13:37:26 +0000842 the library user has not configured logging. See :ref:`library-config` for
843 more information.
Georg Brandlf9734072008-12-07 15:30:06 +0000844
845.. versionadded:: 3.1
Georg Brandl1eb40bc2010-12-03 15:30:09 +0000846 The :class:`NullHandler` class.
Georg Brandlf9734072008-12-07 15:30:06 +0000847
Vinay Sajip121a1c42010-09-08 10:46:15 +0000848.. versionadded:: 3.2
Vinay Sajipa18b9592010-12-12 13:20:55 +0000849 The :class:`~logging.handlers.QueueHandler` class.
Vinay Sajip121a1c42010-09-08 10:46:15 +0000850
Vinay Sajipa17775f2008-12-30 07:32:59 +0000851The :class:`NullHandler`, :class:`StreamHandler` and :class:`FileHandler`
852classes are defined in the core logging package. The other handlers are
853defined in a sub- module, :mod:`logging.handlers`. (There is also another
854sub-module, :mod:`logging.config`, for configuration functionality.)
Georg Brandl116aa622007-08-15 14:28:22 +0000855
856Logged messages are formatted for presentation through instances of the
857:class:`Formatter` class. They are initialized with a format string suitable for
858use with the % operator and a dictionary.
859
860For formatting multiple messages in a batch, instances of
861:class:`BufferingFormatter` can be used. In addition to the format string (which
862is applied to each message in the batch), there is provision for header and
863trailer format strings.
864
865When filtering based on logger level and/or handler level is not enough,
866instances of :class:`Filter` can be added to both :class:`Logger` and
867:class:`Handler` instances (through their :meth:`addFilter` method). Before
868deciding to process a message further, both loggers and handlers consult all
869their filters for permission. If any filter returns a false value, the message
870is not processed further.
871
872The basic :class:`Filter` functionality allows filtering by specific logger
873name. If this feature is used, messages sent to the named logger and its
874children are allowed through the filter, and all others dropped.
875
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000876Module-Level Functions
877----------------------
878
Georg Brandl116aa622007-08-15 14:28:22 +0000879In addition to the classes described above, there are a number of module- level
880functions.
881
882
Georg Brandlcd7f32b2009-06-08 09:13:45 +0000883.. function:: getLogger(name=None)
Georg Brandl116aa622007-08-15 14:28:22 +0000884
Georg Brandlcd7f32b2009-06-08 09:13:45 +0000885 Return a logger with the specified name or, if name is ``None``, return a
Georg Brandl116aa622007-08-15 14:28:22 +0000886 logger which is the root logger of the hierarchy. If specified, the name is
887 typically a dot-separated hierarchical name like *"a"*, *"a.b"* or *"a.b.c.d"*.
888 Choice of these names is entirely up to the developer who is using logging.
889
890 All calls to this function with a given name return the same logger instance.
891 This means that logger instances never need to be passed between different parts
892 of an application.
893
894
895.. function:: getLoggerClass()
896
897 Return either the standard :class:`Logger` class, or the last class passed to
898 :func:`setLoggerClass`. This function may be called from within a new class
899 definition, to ensure that installing a customised :class:`Logger` class will
900 not undo customisations already applied by other code. For example::
901
902 class MyLogger(logging.getLoggerClass()):
903 # ... override behaviour here
904
905
Vinay Sajip61561522010-12-03 11:50:38 +0000906.. function:: getLogRecordFactory()
907
908 Return a callable which is used to create a :class:`LogRecord`.
909
910 .. versionadded:: 3.2
Vinay Sajip61561522010-12-03 11:50:38 +0000911 This function has been provided, along with :func:`setLogRecordFactory`,
912 to allow developers more control over how the :class:`LogRecord`
913 representing a logging event is constructed.
914
915 See :func:`setLogRecordFactory` for more information about the how the
916 factory is called.
917
Georg Brandlcd7f32b2009-06-08 09:13:45 +0000918.. function:: debug(msg, *args, **kwargs)
Georg Brandl116aa622007-08-15 14:28:22 +0000919
920 Logs a message with level :const:`DEBUG` on the root logger. The *msg* is the
921 message format string, and the *args* are the arguments which are merged into
922 *msg* using the string formatting operator. (Note that this means that you can
923 use keywords in the format string, together with a single dictionary argument.)
924
Vinay Sajip8593ae62010-11-14 21:33:04 +0000925 There are three keyword arguments in *kwargs* which are inspected: *exc_info*
Georg Brandl116aa622007-08-15 14:28:22 +0000926 which, if it does not evaluate as false, causes exception information to be
927 added to the logging message. If an exception tuple (in the format returned by
928 :func:`sys.exc_info`) is provided, it is used; otherwise, :func:`sys.exc_info`
929 is called to get the exception information.
930
Vinay Sajip8593ae62010-11-14 21:33:04 +0000931 The second optional keyword argument is *stack_info*, which defaults to
932 False. If specified as True, stack information is added to the logging
933 message, including the actual logging call. Note that this is not the same
934 stack information as that displayed through specifying *exc_info*: The
935 former is stack frames from the bottom of the stack up to the logging call
936 in the current thread, whereas the latter is information about stack frames
937 which have been unwound, following an exception, while searching for
938 exception handlers.
939
940 You can specify *stack_info* independently of *exc_info*, e.g. to just show
941 how you got to a certain point in your code, even when no exceptions were
942 raised. The stack frames are printed following a header line which says::
943
944 Stack (most recent call last):
945
946 This mimics the `Traceback (most recent call last):` which is used when
947 displaying exception frames.
948
949 The third optional keyword argument is *extra* which can be used to pass a
Georg Brandl116aa622007-08-15 14:28:22 +0000950 dictionary which is used to populate the __dict__ of the LogRecord created for
951 the logging event with user-defined attributes. These custom attributes can then
952 be used as you like. For example, they could be incorporated into logged
953 messages. For example::
954
955 FORMAT = "%(asctime)-15s %(clientip)s %(user)-8s %(message)s"
956 logging.basicConfig(format=FORMAT)
957 d = {'clientip': '192.168.0.1', 'user': 'fbloggs'}
958 logging.warning("Protocol problem: %s", "connection reset", extra=d)
959
Vinay Sajip4039aff2010-09-11 10:25:28 +0000960 would print something like::
Georg Brandl116aa622007-08-15 14:28:22 +0000961
962 2006-02-08 22:20:02,165 192.168.0.1 fbloggs Protocol problem: connection reset
963
964 The keys in the dictionary passed in *extra* should not clash with the keys used
965 by the logging system. (See the :class:`Formatter` documentation for more
966 information on which keys are used by the logging system.)
967
968 If you choose to use these attributes in logged messages, you need to exercise
969 some care. In the above example, for instance, the :class:`Formatter` has been
970 set up with a format string which expects 'clientip' and 'user' in the attribute
971 dictionary of the LogRecord. If these are missing, the message will not be
972 logged because a string formatting exception will occur. So in this case, you
973 always need to pass the *extra* dictionary with these keys.
974
975 While this might be annoying, this feature is intended for use in specialized
976 circumstances, such as multi-threaded servers where the same code executes in
977 many contexts, and interesting conditions which arise are dependent on this
978 context (such as remote client IP address and authenticated user name, in the
979 above example). In such circumstances, it is likely that specialized
980 :class:`Formatter`\ s would be used with particular :class:`Handler`\ s.
981
Vinay Sajip8593ae62010-11-14 21:33:04 +0000982 .. versionadded:: 3.2
983 The *stack_info* parameter was added.
Georg Brandl116aa622007-08-15 14:28:22 +0000984
Georg Brandlcd7f32b2009-06-08 09:13:45 +0000985.. function:: info(msg, *args, **kwargs)
Georg Brandl116aa622007-08-15 14:28:22 +0000986
987 Logs a message with level :const:`INFO` on the root logger. The arguments are
988 interpreted as for :func:`debug`.
989
990
Georg Brandlcd7f32b2009-06-08 09:13:45 +0000991.. function:: warning(msg, *args, **kwargs)
Georg Brandl116aa622007-08-15 14:28:22 +0000992
993 Logs a message with level :const:`WARNING` on the root logger. The arguments are
994 interpreted as for :func:`debug`.
995
996
Georg Brandlcd7f32b2009-06-08 09:13:45 +0000997.. function:: error(msg, *args, **kwargs)
Georg Brandl116aa622007-08-15 14:28:22 +0000998
999 Logs a message with level :const:`ERROR` on the root logger. The arguments are
1000 interpreted as for :func:`debug`.
1001
1002
Georg Brandlcd7f32b2009-06-08 09:13:45 +00001003.. function:: critical(msg, *args, **kwargs)
Georg Brandl116aa622007-08-15 14:28:22 +00001004
1005 Logs a message with level :const:`CRITICAL` on the root logger. The arguments
1006 are interpreted as for :func:`debug`.
1007
1008
Georg Brandlcd7f32b2009-06-08 09:13:45 +00001009.. function:: exception(msg, *args)
Georg Brandl116aa622007-08-15 14:28:22 +00001010
1011 Logs a message with level :const:`ERROR` on the root logger. The arguments are
1012 interpreted as for :func:`debug`. Exception info is added to the logging
1013 message. This function should only be called from an exception handler.
1014
Georg Brandlcd7f32b2009-06-08 09:13:45 +00001015.. function:: log(level, msg, *args, **kwargs)
Georg Brandl116aa622007-08-15 14:28:22 +00001016
1017 Logs a message with level *level* on the root logger. The other arguments are
1018 interpreted as for :func:`debug`.
1019
Vinay Sajipc8c8c692010-09-17 10:09:04 +00001020 PLEASE NOTE: The above module-level functions which delegate to the root
1021 logger should *not* be used in threads, in versions of Python earlier than
1022 2.7.1 and 3.2, unless at least one handler has been added to the root
1023 logger *before* the threads are started. These convenience functions call
1024 :func:`basicConfig` to ensure that at least one handler is available; in
1025 earlier versions of Python, this can (under rare circumstances) lead to
1026 handlers being added multiple times to the root logger, which can in turn
1027 lead to multiple messages for the same event.
Georg Brandl116aa622007-08-15 14:28:22 +00001028
1029.. function:: disable(lvl)
1030
1031 Provides an overriding level *lvl* for all loggers which takes precedence over
1032 the logger's own level. When the need arises to temporarily throttle logging
Benjamin Peterson886af962010-03-21 23:13:07 +00001033 output down across the whole application, this function can be useful. Its
1034 effect is to disable all logging calls of severity *lvl* and below, so that
1035 if you call it with a value of INFO, then all INFO and DEBUG events would be
1036 discarded, whereas those of severity WARNING and above would be processed
1037 according to the logger's effective level.
Georg Brandl116aa622007-08-15 14:28:22 +00001038
1039
1040.. function:: addLevelName(lvl, levelName)
1041
1042 Associates level *lvl* with text *levelName* in an internal dictionary, which is
1043 used to map numeric levels to a textual representation, for example when a
1044 :class:`Formatter` formats a message. This function can also be used to define
1045 your own levels. The only constraints are that all levels used must be
1046 registered using this function, levels should be positive integers and they
1047 should increase in increasing order of severity.
1048
Vinay Sajipc8c8c692010-09-17 10:09:04 +00001049 NOTE: If you are thinking of defining your own levels, please see the section
1050 on :ref:`custom-levels`.
Georg Brandl116aa622007-08-15 14:28:22 +00001051
1052.. function:: getLevelName(lvl)
1053
1054 Returns the textual representation of logging level *lvl*. If the level is one
1055 of the predefined levels :const:`CRITICAL`, :const:`ERROR`, :const:`WARNING`,
1056 :const:`INFO` or :const:`DEBUG` then you get the corresponding string. If you
1057 have associated levels with names using :func:`addLevelName` then the name you
1058 have associated with *lvl* is returned. If a numeric value corresponding to one
1059 of the defined levels is passed in, the corresponding string representation is
1060 returned. Otherwise, the string "Level %s" % lvl is returned.
1061
1062
1063.. function:: makeLogRecord(attrdict)
1064
1065 Creates and returns a new :class:`LogRecord` instance whose attributes are
1066 defined by *attrdict*. This function is useful for taking a pickled
1067 :class:`LogRecord` attribute dictionary, sent over a socket, and reconstituting
1068 it as a :class:`LogRecord` instance at the receiving end.
1069
1070
Georg Brandlcd7f32b2009-06-08 09:13:45 +00001071.. function:: basicConfig(**kwargs)
Georg Brandl116aa622007-08-15 14:28:22 +00001072
1073 Does basic configuration for the logging system by creating a
1074 :class:`StreamHandler` with a default :class:`Formatter` and adding it to the
Vinay Sajipcbabd7e2009-10-10 20:32:36 +00001075 root logger. The functions :func:`debug`, :func:`info`, :func:`warning`,
Georg Brandl116aa622007-08-15 14:28:22 +00001076 :func:`error` and :func:`critical` will call :func:`basicConfig` automatically
1077 if no handlers are defined for the root logger.
1078
Vinay Sajipcbabd7e2009-10-10 20:32:36 +00001079 This function does nothing if the root logger already has handlers
1080 configured for it.
1081
Vinay Sajipc8c8c692010-09-17 10:09:04 +00001082 PLEASE NOTE: This function should be called from the main thread
1083 before other threads are started. In versions of Python prior to
1084 2.7.1 and 3.2, if this function is called from multiple threads,
1085 it is possible (in rare circumstances) that a handler will be added
1086 to the root logger more than once, leading to unexpected results
1087 such as messages being duplicated in the log.
1088
Georg Brandl116aa622007-08-15 14:28:22 +00001089 The following keyword arguments are supported.
1090
1091 +--------------+---------------------------------------------+
1092 | Format | Description |
1093 +==============+=============================================+
1094 | ``filename`` | Specifies that a FileHandler be created, |
1095 | | using the specified filename, rather than a |
1096 | | StreamHandler. |
1097 +--------------+---------------------------------------------+
1098 | ``filemode`` | Specifies the mode to open the file, if |
1099 | | filename is specified (if filemode is |
1100 | | unspecified, it defaults to 'a'). |
1101 +--------------+---------------------------------------------+
1102 | ``format`` | Use the specified format string for the |
1103 | | handler. |
1104 +--------------+---------------------------------------------+
1105 | ``datefmt`` | Use the specified date/time format. |
1106 +--------------+---------------------------------------------+
Vinay Sajipc5b27302010-10-31 14:59:16 +00001107 | ``style`` | If ``format`` is specified, use this style |
1108 | | for the format string. One of '%', '{' or |
1109 | | '$' for %-formatting, :meth:`str.format` or |
1110 | | :class:`string.Template` respectively, and |
1111 | | defaulting to '%' if not specified. |
1112 +--------------+---------------------------------------------+
Georg Brandl116aa622007-08-15 14:28:22 +00001113 | ``level`` | Set the root logger level to the specified |
1114 | | level. |
1115 +--------------+---------------------------------------------+
1116 | ``stream`` | Use the specified stream to initialize the |
1117 | | StreamHandler. Note that this argument is |
1118 | | incompatible with 'filename' - if both are |
1119 | | present, 'stream' is ignored. |
1120 +--------------+---------------------------------------------+
1121
Vinay Sajipc5b27302010-10-31 14:59:16 +00001122 .. versionchanged:: 3.2
1123 The ``style`` argument was added.
1124
1125
Georg Brandl116aa622007-08-15 14:28:22 +00001126.. function:: shutdown()
1127
1128 Informs the logging system to perform an orderly shutdown by flushing and
Christian Heimesb186d002008-03-18 15:15:01 +00001129 closing all handlers. This should be called at application exit and no
1130 further use of the logging system should be made after this call.
Georg Brandl116aa622007-08-15 14:28:22 +00001131
1132
1133.. function:: setLoggerClass(klass)
1134
1135 Tells the logging system to use the class *klass* when instantiating a logger.
1136 The class should define :meth:`__init__` such that only a name argument is
1137 required, and the :meth:`__init__` should call :meth:`Logger.__init__`. This
1138 function is typically called before any loggers are instantiated by applications
1139 which need to use custom logger behavior.
1140
Georg Brandl1eb40bc2010-12-03 15:30:09 +00001141
Vinay Sajip61561522010-12-03 11:50:38 +00001142.. function:: setLogRecordFactory(factory)
1143
1144 Set a callable which is used to create a :class:`LogRecord`.
1145
1146 :param factory: The factory callable to be used to instantiate a log record.
1147
1148 .. versionadded:: 3.2
Georg Brandl1eb40bc2010-12-03 15:30:09 +00001149 This function has been provided, along with :func:`getLogRecordFactory`, to
1150 allow developers more control over how the :class:`LogRecord` representing
1151 a logging event is constructed.
Vinay Sajip61561522010-12-03 11:50:38 +00001152
Georg Brandl1eb40bc2010-12-03 15:30:09 +00001153 The factory has the following signature:
Vinay Sajip61561522010-12-03 11:50:38 +00001154
Georg Brandl1eb40bc2010-12-03 15:30:09 +00001155 ``factory(name, level, fn, lno, msg, args, exc_info, func=None, sinfo=None, \*\*kwargs)``
Vinay Sajip61561522010-12-03 11:50:38 +00001156
1157 :name: The logger name.
1158 :level: The logging level (numeric).
1159 :fn: The full pathname of the file where the logging call was made.
1160 :lno: The line number in the file where the logging call was made.
1161 :msg: The logging message.
1162 :args: The arguments for the logging message.
1163 :exc_info: An exception tuple, or None.
1164 :func: The name of the function or method which invoked the logging
1165 call.
1166 :sinfo: A stack traceback such as is provided by
1167 :func:`traceback.print_stack`, showing the call hierarchy.
1168 :kwargs: Additional keyword arguments.
Georg Brandl116aa622007-08-15 14:28:22 +00001169
Georg Brandl1eb40bc2010-12-03 15:30:09 +00001170
Georg Brandl116aa622007-08-15 14:28:22 +00001171.. seealso::
1172
1173 :pep:`282` - A Logging System
1174 The proposal which described this feature for inclusion in the Python standard
1175 library.
1176
Christian Heimes255f53b2007-12-08 15:33:56 +00001177 `Original Python logging package <http://www.red-dove.com/python_logging.html>`_
Georg Brandl116aa622007-08-15 14:28:22 +00001178 This is the original source for the :mod:`logging` package. The version of the
1179 package available from this site is suitable for use with Python 1.5.2, 2.1.x
1180 and 2.2.x, which do not include the :mod:`logging` package in the standard
1181 library.
1182
Vinay Sajip4039aff2010-09-11 10:25:28 +00001183.. _logger:
Georg Brandl116aa622007-08-15 14:28:22 +00001184
1185Logger Objects
1186--------------
1187
1188Loggers have the following attributes and methods. Note that Loggers are never
1189instantiated directly, but always through the module-level function
1190``logging.getLogger(name)``.
1191
Vinay Sajip0258ce82010-09-22 20:34:53 +00001192.. class:: Logger
Georg Brandl116aa622007-08-15 14:28:22 +00001193
1194.. attribute:: Logger.propagate
1195
1196 If this evaluates to false, logging messages are not passed by this logger or by
Benjamin Peterson22005fc2010-04-11 16:25:06 +00001197 its child loggers to the handlers of higher level (ancestor) loggers. The
1198 constructor sets this attribute to 1.
Georg Brandl116aa622007-08-15 14:28:22 +00001199
1200
1201.. method:: Logger.setLevel(lvl)
1202
1203 Sets the threshold for this logger to *lvl*. Logging messages which are less
1204 severe than *lvl* will be ignored. When a logger is created, the level is set to
1205 :const:`NOTSET` (which causes all messages to be processed when the logger is
1206 the root logger, or delegation to the parent when the logger is a non-root
1207 logger). Note that the root logger is created with level :const:`WARNING`.
1208
1209 The term "delegation to the parent" means that if a logger has a level of
1210 NOTSET, its chain of ancestor loggers is traversed until either an ancestor with
1211 a level other than NOTSET is found, or the root is reached.
1212
1213 If an ancestor is found with a level other than NOTSET, then that ancestor's
1214 level is treated as the effective level of the logger where the ancestor search
1215 began, and is used to determine how a logging event is handled.
1216
1217 If the root is reached, and it has a level of NOTSET, then all messages will be
1218 processed. Otherwise, the root's level will be used as the effective level.
1219
1220
1221.. method:: Logger.isEnabledFor(lvl)
1222
1223 Indicates if a message of severity *lvl* would be processed by this logger.
1224 This method checks first the module-level level set by
1225 ``logging.disable(lvl)`` and then the logger's effective level as determined
1226 by :meth:`getEffectiveLevel`.
1227
1228
1229.. method:: Logger.getEffectiveLevel()
1230
1231 Indicates the effective level for this logger. If a value other than
1232 :const:`NOTSET` has been set using :meth:`setLevel`, it is returned. Otherwise,
1233 the hierarchy is traversed towards the root until a value other than
1234 :const:`NOTSET` is found, and that value is returned.
1235
1236
Benjamin Peterson22005fc2010-04-11 16:25:06 +00001237.. method:: Logger.getChild(suffix)
1238
1239 Returns a logger which is a descendant to this logger, as determined by the suffix.
1240 Thus, ``logging.getLogger('abc').getChild('def.ghi')`` would return the same
1241 logger as would be returned by ``logging.getLogger('abc.def.ghi')``. This is a
1242 convenience method, useful when the parent logger is named using e.g. ``__name__``
1243 rather than a literal string.
1244
1245 .. versionadded:: 3.2
1246
Georg Brandl67b21b72010-08-17 15:07:14 +00001247
Georg Brandlcd7f32b2009-06-08 09:13:45 +00001248.. method:: Logger.debug(msg, *args, **kwargs)
Georg Brandl116aa622007-08-15 14:28:22 +00001249
1250 Logs a message with level :const:`DEBUG` on this logger. The *msg* is the
1251 message format string, and the *args* are the arguments which are merged into
1252 *msg* using the string formatting operator. (Note that this means that you can
1253 use keywords in the format string, together with a single dictionary argument.)
1254
Vinay Sajip8593ae62010-11-14 21:33:04 +00001255 There are three keyword arguments in *kwargs* which are inspected: *exc_info*
Georg Brandl116aa622007-08-15 14:28:22 +00001256 which, if it does not evaluate as false, causes exception information to be
1257 added to the logging message. If an exception tuple (in the format returned by
1258 :func:`sys.exc_info`) is provided, it is used; otherwise, :func:`sys.exc_info`
1259 is called to get the exception information.
1260
Vinay Sajip8593ae62010-11-14 21:33:04 +00001261 The second optional keyword argument is *stack_info*, which defaults to
1262 False. If specified as True, stack information is added to the logging
1263 message, including the actual logging call. Note that this is not the same
1264 stack information as that displayed through specifying *exc_info*: The
1265 former is stack frames from the bottom of the stack up to the logging call
1266 in the current thread, whereas the latter is information about stack frames
1267 which have been unwound, following an exception, while searching for
1268 exception handlers.
1269
1270 You can specify *stack_info* independently of *exc_info*, e.g. to just show
1271 how you got to a certain point in your code, even when no exceptions were
1272 raised. The stack frames are printed following a header line which says::
1273
1274 Stack (most recent call last):
1275
1276 This mimics the `Traceback (most recent call last):` which is used when
1277 displaying exception frames.
1278
1279 The third keyword argument is *extra* which can be used to pass a
Georg Brandl116aa622007-08-15 14:28:22 +00001280 dictionary which is used to populate the __dict__ of the LogRecord created for
1281 the logging event with user-defined attributes. These custom attributes can then
1282 be used as you like. For example, they could be incorporated into logged
1283 messages. For example::
1284
1285 FORMAT = "%(asctime)-15s %(clientip)s %(user)-8s %(message)s"
1286 logging.basicConfig(format=FORMAT)
Georg Brandl9afde1c2007-11-01 20:32:30 +00001287 d = { 'clientip' : '192.168.0.1', 'user' : 'fbloggs' }
Georg Brandl116aa622007-08-15 14:28:22 +00001288 logger = logging.getLogger("tcpserver")
1289 logger.warning("Protocol problem: %s", "connection reset", extra=d)
1290
1291 would print something like ::
1292
1293 2006-02-08 22:20:02,165 192.168.0.1 fbloggs Protocol problem: connection reset
1294
1295 The keys in the dictionary passed in *extra* should not clash with the keys used
1296 by the logging system. (See the :class:`Formatter` documentation for more
1297 information on which keys are used by the logging system.)
1298
1299 If you choose to use these attributes in logged messages, you need to exercise
1300 some care. In the above example, for instance, the :class:`Formatter` has been
1301 set up with a format string which expects 'clientip' and 'user' in the attribute
1302 dictionary of the LogRecord. If these are missing, the message will not be
1303 logged because a string formatting exception will occur. So in this case, you
1304 always need to pass the *extra* dictionary with these keys.
1305
1306 While this might be annoying, this feature is intended for use in specialized
1307 circumstances, such as multi-threaded servers where the same code executes in
1308 many contexts, and interesting conditions which arise are dependent on this
1309 context (such as remote client IP address and authenticated user name, in the
1310 above example). In such circumstances, it is likely that specialized
1311 :class:`Formatter`\ s would be used with particular :class:`Handler`\ s.
1312
Vinay Sajip8593ae62010-11-14 21:33:04 +00001313 .. versionadded:: 3.2
1314 The *stack_info* parameter was added.
1315
Georg Brandl116aa622007-08-15 14:28:22 +00001316
Georg Brandlcd7f32b2009-06-08 09:13:45 +00001317.. method:: Logger.info(msg, *args, **kwargs)
Georg Brandl116aa622007-08-15 14:28:22 +00001318
1319 Logs a message with level :const:`INFO` on this logger. The arguments are
1320 interpreted as for :meth:`debug`.
1321
1322
Georg Brandlcd7f32b2009-06-08 09:13:45 +00001323.. method:: Logger.warning(msg, *args, **kwargs)
Georg Brandl116aa622007-08-15 14:28:22 +00001324
1325 Logs a message with level :const:`WARNING` on this logger. The arguments are
1326 interpreted as for :meth:`debug`.
1327
1328
Georg Brandlcd7f32b2009-06-08 09:13:45 +00001329.. method:: Logger.error(msg, *args, **kwargs)
Georg Brandl116aa622007-08-15 14:28:22 +00001330
1331 Logs a message with level :const:`ERROR` on this logger. The arguments are
1332 interpreted as for :meth:`debug`.
1333
1334
Georg Brandlcd7f32b2009-06-08 09:13:45 +00001335.. method:: Logger.critical(msg, *args, **kwargs)
Georg Brandl116aa622007-08-15 14:28:22 +00001336
1337 Logs a message with level :const:`CRITICAL` on this logger. The arguments are
1338 interpreted as for :meth:`debug`.
1339
1340
Georg Brandlcd7f32b2009-06-08 09:13:45 +00001341.. method:: Logger.log(lvl, msg, *args, **kwargs)
Georg Brandl116aa622007-08-15 14:28:22 +00001342
1343 Logs a message with integer level *lvl* on this logger. The other arguments are
1344 interpreted as for :meth:`debug`.
1345
1346
Georg Brandlcd7f32b2009-06-08 09:13:45 +00001347.. method:: Logger.exception(msg, *args)
Georg Brandl116aa622007-08-15 14:28:22 +00001348
1349 Logs a message with level :const:`ERROR` on this logger. The arguments are
1350 interpreted as for :meth:`debug`. Exception info is added to the logging
1351 message. This method should only be called from an exception handler.
1352
1353
1354.. method:: Logger.addFilter(filt)
1355
1356 Adds the specified filter *filt* to this logger.
1357
1358
1359.. method:: Logger.removeFilter(filt)
1360
1361 Removes the specified filter *filt* from this logger.
1362
1363
1364.. method:: Logger.filter(record)
1365
1366 Applies this logger's filters to the record and returns a true value if the
1367 record is to be processed.
1368
1369
1370.. method:: Logger.addHandler(hdlr)
1371
1372 Adds the specified handler *hdlr* to this logger.
1373
1374
1375.. method:: Logger.removeHandler(hdlr)
1376
1377 Removes the specified handler *hdlr* from this logger.
1378
1379
Vinay Sajip8593ae62010-11-14 21:33:04 +00001380.. method:: Logger.findCaller(stack_info=False)
Georg Brandl116aa622007-08-15 14:28:22 +00001381
1382 Finds the caller's source filename and line number. Returns the filename, line
Vinay Sajip8593ae62010-11-14 21:33:04 +00001383 number, function name and stack information as a 4-element tuple. The stack
1384 information is returned as *None* unless *stack_info* is *True*.
Georg Brandl116aa622007-08-15 14:28:22 +00001385
Georg Brandl116aa622007-08-15 14:28:22 +00001386
1387.. method:: Logger.handle(record)
1388
1389 Handles a record by passing it to all handlers associated with this logger and
1390 its ancestors (until a false value of *propagate* is found). This method is used
1391 for unpickled records received from a socket, as well as those created locally.
Georg Brandl502d9a52009-07-26 15:02:41 +00001392 Logger-level filtering is applied using :meth:`~Logger.filter`.
Georg Brandl116aa622007-08-15 14:28:22 +00001393
1394
Vinay Sajip8593ae62010-11-14 21:33:04 +00001395.. method:: Logger.makeRecord(name, lvl, fn, lno, msg, args, exc_info, func=None, extra=None, sinfo=None)
Georg Brandl116aa622007-08-15 14:28:22 +00001396
1397 This is a factory method which can be overridden in subclasses to create
1398 specialized :class:`LogRecord` instances.
1399
Vinay Sajip83eadd12010-09-20 10:31:18 +00001400.. method:: Logger.hasHandlers()
1401
1402 Checks to see if this logger has any handlers configured. This is done by
1403 looking for handlers in this logger and its parents in the logger hierarchy.
1404 Returns True if a handler was found, else False. The method stops searching
1405 up the hierarchy whenever a logger with the "propagate" attribute set to
1406 False is found - that will be the last logger which is checked for the
1407 existence of handlers.
1408
Georg Brandl1eb40bc2010-12-03 15:30:09 +00001409 .. versionadded:: 3.2
Vinay Sajip83eadd12010-09-20 10:31:18 +00001410
Vinay Sajipa18b9592010-12-12 13:20:55 +00001411.. _basic-example:
Georg Brandl116aa622007-08-15 14:28:22 +00001412
1413Basic example
1414-------------
1415
Georg Brandl116aa622007-08-15 14:28:22 +00001416The :mod:`logging` package provides a lot of flexibility, and its configuration
1417can appear daunting. This section demonstrates that simple use of the logging
1418package is possible.
1419
1420The simplest example shows logging to the console::
1421
1422 import logging
1423
1424 logging.debug('A debug message')
1425 logging.info('Some information')
1426 logging.warning('A shot across the bows')
1427
1428If you run the above script, you'll see this::
1429
1430 WARNING:root:A shot across the bows
1431
1432Because no particular logger was specified, the system used the root logger. The
1433debug and info messages didn't appear because by default, the root logger is
1434configured to only handle messages with a severity of WARNING or above. The
1435message format is also a configuration default, as is the output destination of
1436the messages - ``sys.stderr``. The severity level, the message format and
1437destination can be easily changed, as shown in the example below::
1438
1439 import logging
1440
1441 logging.basicConfig(level=logging.DEBUG,
1442 format='%(asctime)s %(levelname)s %(message)s',
Benjamin Petersond7c3ed52010-06-27 22:32:30 +00001443 filename='myapp.log',
Georg Brandl116aa622007-08-15 14:28:22 +00001444 filemode='w')
1445 logging.debug('A debug message')
1446 logging.info('Some information')
1447 logging.warning('A shot across the bows')
1448
1449The :meth:`basicConfig` method is used to change the configuration defaults,
Benjamin Petersond7c3ed52010-06-27 22:32:30 +00001450which results in output (written to ``myapp.log``) which should look
Georg Brandl116aa622007-08-15 14:28:22 +00001451something like the following::
1452
1453 2004-07-02 13:00:08,743 DEBUG A debug message
1454 2004-07-02 13:00:08,743 INFO Some information
1455 2004-07-02 13:00:08,743 WARNING A shot across the bows
1456
1457This time, all messages with a severity of DEBUG or above were handled, and the
1458format of the messages was also changed, and output went to the specified file
1459rather than the console.
1460
Georg Brandl81ac1ce2007-08-31 17:17:17 +00001461.. XXX logging should probably be updated for new string formatting!
Georg Brandl4b491312007-08-31 09:22:56 +00001462
1463Formatting uses the old Python string formatting - see section
1464:ref:`old-string-formatting`. The format string takes the following common
Georg Brandl116aa622007-08-15 14:28:22 +00001465specifiers. For a complete list of specifiers, consult the :class:`Formatter`
1466documentation.
1467
1468+-------------------+-----------------------------------------------+
1469| Format | Description |
1470+===================+===============================================+
1471| ``%(name)s`` | Name of the logger (logging channel). |
1472+-------------------+-----------------------------------------------+
1473| ``%(levelname)s`` | Text logging level for the message |
1474| | (``'DEBUG'``, ``'INFO'``, ``'WARNING'``, |
1475| | ``'ERROR'``, ``'CRITICAL'``). |
1476+-------------------+-----------------------------------------------+
1477| ``%(asctime)s`` | Human-readable time when the |
1478| | :class:`LogRecord` was created. By default |
1479| | this is of the form "2003-07-08 16:49:45,896" |
1480| | (the numbers after the comma are millisecond |
1481| | portion of the time). |
1482+-------------------+-----------------------------------------------+
1483| ``%(message)s`` | The logged message. |
1484+-------------------+-----------------------------------------------+
1485
1486To change the date/time format, you can pass an additional keyword parameter,
1487*datefmt*, as in the following::
1488
1489 import logging
1490
1491 logging.basicConfig(level=logging.DEBUG,
1492 format='%(asctime)s %(levelname)-8s %(message)s',
1493 datefmt='%a, %d %b %Y %H:%M:%S',
1494 filename='/temp/myapp.log',
1495 filemode='w')
1496 logging.debug('A debug message')
1497 logging.info('Some information')
1498 logging.warning('A shot across the bows')
1499
1500which would result in output like ::
1501
1502 Fri, 02 Jul 2004 13:06:18 DEBUG A debug message
1503 Fri, 02 Jul 2004 13:06:18 INFO Some information
1504 Fri, 02 Jul 2004 13:06:18 WARNING A shot across the bows
1505
1506The date format string follows the requirements of :func:`strftime` - see the
1507documentation for the :mod:`time` module.
1508
1509If, instead of sending logging output to the console or a file, you'd rather use
1510a file-like object which you have created separately, you can pass it to
1511:func:`basicConfig` using the *stream* keyword argument. Note that if both
1512*stream* and *filename* keyword arguments are passed, the *stream* argument is
1513ignored.
1514
1515Of course, you can put variable information in your output. To do this, simply
1516have the message be a format string and pass in additional arguments containing
1517the variable information, as in the following example::
1518
1519 import logging
1520
1521 logging.basicConfig(level=logging.DEBUG,
1522 format='%(asctime)s %(levelname)-8s %(message)s',
1523 datefmt='%a, %d %b %Y %H:%M:%S',
1524 filename='/temp/myapp.log',
1525 filemode='w')
1526 logging.error('Pack my box with %d dozen %s', 5, 'liquor jugs')
1527
1528which would result in ::
1529
1530 Wed, 21 Jul 2004 15:35:16 ERROR Pack my box with 5 dozen liquor jugs
1531
1532
Vinay Sajipa18b9592010-12-12 13:20:55 +00001533Using file rotation
1534^^^^^^^^^^^^^^^^^^^
1535
1536.. sectionauthor:: Doug Hellmann, Vinay Sajip (changes)
1537.. (see <http://blog.doughellmann.com/2007/05/pymotw-logging.html>)
1538
1539Sometimes you want to let a log file grow to a certain size, then open a new
1540file and log to that. You may want to keep a certain number of these files, and
1541when that many files have been created, rotate the files so that the number of
1542files and the size of the files both remin bounded. For this usage pattern, the
1543logging package provides a :class:`RotatingFileHandler`::
1544
1545 import glob
1546 import logging
1547 import logging.handlers
1548
1549 LOG_FILENAME = 'logging_rotatingfile_example.out'
1550
1551 # Set up a specific logger with our desired output level
1552 my_logger = logging.getLogger('MyLogger')
1553 my_logger.setLevel(logging.DEBUG)
1554
1555 # Add the log message handler to the logger
1556 handler = logging.handlers.RotatingFileHandler(
1557 LOG_FILENAME, maxBytes=20, backupCount=5)
1558
1559 my_logger.addHandler(handler)
1560
1561 # Log some messages
1562 for i in range(20):
1563 my_logger.debug('i = %d' % i)
1564
1565 # See what files are created
1566 logfiles = glob.glob('%s*' % LOG_FILENAME)
1567
1568 for filename in logfiles:
1569 print(filename)
1570
1571The result should be 6 separate files, each with part of the log history for the
1572application::
1573
1574 logging_rotatingfile_example.out
1575 logging_rotatingfile_example.out.1
1576 logging_rotatingfile_example.out.2
1577 logging_rotatingfile_example.out.3
1578 logging_rotatingfile_example.out.4
1579 logging_rotatingfile_example.out.5
1580
1581The most current file is always :file:`logging_rotatingfile_example.out`,
1582and each time it reaches the size limit it is renamed with the suffix
1583``.1``. Each of the existing backup files is renamed to increment the suffix
1584(``.1`` becomes ``.2``, etc.) and the ``.6`` file is erased.
1585
1586Obviously this example sets the log length much much too small as an extreme
1587example. You would want to set *maxBytes* to an appropriate value.
1588
1589
1590The logger, handler, and log message call each specify a level. The log message
1591is only emitted if the handler and logger are configured to emit messages of
1592that level or lower. For example, if a message is ``CRITICAL``, and the logger
1593is set to ``ERROR``, the message is emitted. If a message is a ``WARNING``, and
1594the logger is set to produce only ``ERROR``\s, the message is not emitted::
1595
1596 import logging
1597 import sys
1598
1599 LEVELS = {'debug': logging.DEBUG,
1600 'info': logging.INFO,
1601 'warning': logging.WARNING,
1602 'error': logging.ERROR,
1603 'critical': logging.CRITICAL}
1604
1605 if len(sys.argv) > 1:
1606 level_name = sys.argv[1]
1607 level = LEVELS.get(level_name, logging.NOTSET)
1608 logging.basicConfig(level=level)
1609
1610 logging.debug('This is a debug message')
1611 logging.info('This is an info message')
1612 logging.warning('This is a warning message')
1613 logging.error('This is an error message')
1614 logging.critical('This is a critical error message')
1615
1616Run the script with an argument like 'debug' or 'warning' to see which messages
1617show up at different levels::
1618
1619 $ python logging_level_example.py debug
1620 DEBUG:root:This is a debug message
1621 INFO:root:This is an info message
1622 WARNING:root:This is a warning message
1623 ERROR:root:This is an error message
1624 CRITICAL:root:This is a critical error message
1625
1626 $ python logging_level_example.py info
1627 INFO:root:This is an info message
1628 WARNING:root:This is a warning message
1629 ERROR:root:This is an error message
1630 CRITICAL:root:This is a critical error message
1631
1632You will notice that these log messages all have ``root`` embedded in them. The
1633logging module supports a hierarchy of loggers with different names. An easy
1634way to tell where a specific log message comes from is to use a separate logger
1635object for each of your modules. Each new logger "inherits" the configuration
1636of its parent, and log messages sent to a logger include the name of that
1637logger. Optionally, each logger can be configured differently, so that messages
1638from different modules are handled in different ways. Let's look at a simple
1639example of how to log from different modules so it is easy to trace the source
1640of the message::
1641
1642 import logging
1643
1644 logging.basicConfig(level=logging.WARNING)
1645
1646 logger1 = logging.getLogger('package1.module1')
1647 logger2 = logging.getLogger('package2.module2')
1648
1649 logger1.warning('This message comes from one module')
1650 logger2.warning('And this message comes from another module')
1651
1652And the output::
1653
1654 $ python logging_modules_example.py
1655 WARNING:package1.module1:This message comes from one module
1656 WARNING:package2.module2:And this message comes from another module
1657
1658There are many more options for configuring logging, including different log
1659message formatting options, having messages delivered to multiple destinations,
1660and changing the configuration of a long-running application on the fly using a
1661socket interface. All of these options are covered in depth in the library
1662module documentation.
1663
1664
Georg Brandl116aa622007-08-15 14:28:22 +00001665.. _multiple-destinations:
1666
1667Logging to multiple destinations
1668--------------------------------
1669
1670Let's say you want to log to console and file with different message formats and
1671in differing circumstances. Say you want to log messages with levels of DEBUG
1672and higher to file, and those messages at level INFO and higher to the console.
1673Let's also assume that the file should contain timestamps, but the console
1674messages should not. Here's how you can achieve this::
1675
1676 import logging
1677
1678 # set up logging to file - see previous section for more details
1679 logging.basicConfig(level=logging.DEBUG,
1680 format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
1681 datefmt='%m-%d %H:%M',
1682 filename='/temp/myapp.log',
1683 filemode='w')
1684 # define a Handler which writes INFO messages or higher to the sys.stderr
1685 console = logging.StreamHandler()
1686 console.setLevel(logging.INFO)
1687 # set a format which is simpler for console use
1688 formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
1689 # tell the handler to use this format
1690 console.setFormatter(formatter)
1691 # add the handler to the root logger
1692 logging.getLogger('').addHandler(console)
1693
1694 # Now, we can log to the root logger, or any other logger. First the root...
1695 logging.info('Jackdaws love my big sphinx of quartz.')
1696
1697 # Now, define a couple of other loggers which might represent areas in your
1698 # application:
1699
1700 logger1 = logging.getLogger('myapp.area1')
1701 logger2 = logging.getLogger('myapp.area2')
1702
1703 logger1.debug('Quick zephyrs blow, vexing daft Jim.')
1704 logger1.info('How quickly daft jumping zebras vex.')
1705 logger2.warning('Jail zesty vixen who grabbed pay from quack.')
1706 logger2.error('The five boxing wizards jump quickly.')
1707
1708When you run this, on the console you will see ::
1709
1710 root : INFO Jackdaws love my big sphinx of quartz.
1711 myapp.area1 : INFO How quickly daft jumping zebras vex.
1712 myapp.area2 : WARNING Jail zesty vixen who grabbed pay from quack.
1713 myapp.area2 : ERROR The five boxing wizards jump quickly.
1714
1715and in the file you will see something like ::
1716
1717 10-22 22:19 root INFO Jackdaws love my big sphinx of quartz.
1718 10-22 22:19 myapp.area1 DEBUG Quick zephyrs blow, vexing daft Jim.
1719 10-22 22:19 myapp.area1 INFO How quickly daft jumping zebras vex.
1720 10-22 22:19 myapp.area2 WARNING Jail zesty vixen who grabbed pay from quack.
1721 10-22 22:19 myapp.area2 ERROR The five boxing wizards jump quickly.
1722
1723As you can see, the DEBUG message only shows up in the file. The other messages
1724are sent to both destinations.
1725
1726This example uses console and file handlers, but you can use any number and
1727combination of handlers you choose.
1728
Vinay Sajip3ee22ec2009-08-20 22:05:10 +00001729.. _logging-exceptions:
1730
1731Exceptions raised during logging
1732--------------------------------
1733
1734The logging package is designed to swallow exceptions which occur while logging
1735in production. This is so that errors which occur while handling logging events
1736- such as logging misconfiguration, network or other similar errors - do not
1737cause the application using logging to terminate prematurely.
1738
1739:class:`SystemExit` and :class:`KeyboardInterrupt` exceptions are never
1740swallowed. Other exceptions which occur during the :meth:`emit` method of a
1741:class:`Handler` subclass are passed to its :meth:`handleError` method.
1742
1743The default implementation of :meth:`handleError` in :class:`Handler` checks
Georg Brandlef871f62010-03-12 10:06:40 +00001744to see if a module-level variable, :data:`raiseExceptions`, is set. If set, a
1745traceback is printed to :data:`sys.stderr`. If not set, the exception is swallowed.
Vinay Sajip3ee22ec2009-08-20 22:05:10 +00001746
Georg Brandlef871f62010-03-12 10:06:40 +00001747**Note:** The default value of :data:`raiseExceptions` is ``True``. This is because
Vinay Sajip3ee22ec2009-08-20 22:05:10 +00001748during development, you typically want to be notified of any exceptions that
Georg Brandlef871f62010-03-12 10:06:40 +00001749occur. It's advised that you set :data:`raiseExceptions` to ``False`` for production
Vinay Sajip3ee22ec2009-08-20 22:05:10 +00001750usage.
Georg Brandl116aa622007-08-15 14:28:22 +00001751
Christian Heimes790c8232008-01-07 21:14:23 +00001752.. _context-info:
1753
1754Adding contextual information to your logging output
1755----------------------------------------------------
1756
1757Sometimes you want logging output to contain contextual information in
1758addition to the parameters passed to the logging call. For example, in a
1759networked application, it may be desirable to log client-specific information
1760in the log (e.g. remote client's username, or IP address). Although you could
1761use the *extra* parameter to achieve this, it's not always convenient to pass
1762the information in this way. While it might be tempting to create
1763:class:`Logger` instances on a per-connection basis, this is not a good idea
1764because these instances are not garbage collected. While this is not a problem
1765in practice, when the number of :class:`Logger` instances is dependent on the
1766level of granularity you want to use in logging an application, it could
1767be hard to manage if the number of :class:`Logger` instances becomes
1768effectively unbounded.
1769
Vinay Sajipc31be632010-09-06 22:18:20 +00001770
1771Using LoggerAdapters to impart contextual information
1772^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1773
Christian Heimes04c420f2008-01-18 18:40:46 +00001774An easy way in which you can pass contextual information to be output along
1775with logging event information is to use the :class:`LoggerAdapter` class.
1776This class is designed to look like a :class:`Logger`, so that you can call
1777:meth:`debug`, :meth:`info`, :meth:`warning`, :meth:`error`,
1778:meth:`exception`, :meth:`critical` and :meth:`log`. These methods have the
1779same signatures as their counterparts in :class:`Logger`, so you can use the
1780two types of instances interchangeably.
Christian Heimes790c8232008-01-07 21:14:23 +00001781
Christian Heimes04c420f2008-01-18 18:40:46 +00001782When you create an instance of :class:`LoggerAdapter`, you pass it a
1783:class:`Logger` instance and a dict-like object which contains your contextual
1784information. When you call one of the logging methods on an instance of
1785:class:`LoggerAdapter`, it delegates the call to the underlying instance of
1786:class:`Logger` passed to its constructor, and arranges to pass the contextual
1787information in the delegated call. Here's a snippet from the code of
1788:class:`LoggerAdapter`::
Christian Heimes790c8232008-01-07 21:14:23 +00001789
Christian Heimes04c420f2008-01-18 18:40:46 +00001790 def debug(self, msg, *args, **kwargs):
1791 """
1792 Delegate a debug call to the underlying logger, after adding
1793 contextual information from this adapter instance.
1794 """
1795 msg, kwargs = self.process(msg, kwargs)
1796 self.logger.debug(msg, *args, **kwargs)
Christian Heimes790c8232008-01-07 21:14:23 +00001797
Christian Heimes04c420f2008-01-18 18:40:46 +00001798The :meth:`process` method of :class:`LoggerAdapter` is where the contextual
1799information is added to the logging output. It's passed the message and
1800keyword arguments of the logging call, and it passes back (potentially)
1801modified versions of these to use in the call to the underlying logger. The
1802default implementation of this method leaves the message alone, but inserts
1803an "extra" key in the keyword argument whose value is the dict-like object
1804passed to the constructor. Of course, if you had passed an "extra" keyword
1805argument in the call to the adapter, it will be silently overwritten.
Christian Heimes790c8232008-01-07 21:14:23 +00001806
Christian Heimes04c420f2008-01-18 18:40:46 +00001807The advantage of using "extra" is that the values in the dict-like object are
1808merged into the :class:`LogRecord` instance's __dict__, allowing you to use
1809customized strings with your :class:`Formatter` instances which know about
1810the keys of the dict-like object. If you need a different method, e.g. if you
1811want to prepend or append the contextual information to the message string,
1812you just need to subclass :class:`LoggerAdapter` and override :meth:`process`
1813to do what you need. Here's an example script which uses this class, which
1814also illustrates what dict-like behaviour is needed from an arbitrary
1815"dict-like" object for use in the constructor::
1816
Christian Heimes587c2bf2008-01-19 16:21:02 +00001817 import logging
Georg Brandl86def6c2008-01-21 20:36:10 +00001818
Christian Heimes587c2bf2008-01-19 16:21:02 +00001819 class ConnInfo:
1820 """
1821 An example class which shows how an arbitrary class can be used as
1822 the 'extra' context information repository passed to a LoggerAdapter.
1823 """
Georg Brandl86def6c2008-01-21 20:36:10 +00001824
Christian Heimes587c2bf2008-01-19 16:21:02 +00001825 def __getitem__(self, name):
1826 """
1827 To allow this instance to look like a dict.
1828 """
1829 from random import choice
1830 if name == "ip":
1831 result = choice(["127.0.0.1", "192.168.0.1"])
1832 elif name == "user":
1833 result = choice(["jim", "fred", "sheila"])
1834 else:
1835 result = self.__dict__.get(name, "?")
1836 return result
Georg Brandl86def6c2008-01-21 20:36:10 +00001837
Christian Heimes587c2bf2008-01-19 16:21:02 +00001838 def __iter__(self):
1839 """
1840 To allow iteration over keys, which will be merged into
1841 the LogRecord dict before formatting and output.
1842 """
1843 keys = ["ip", "user"]
1844 keys.extend(self.__dict__.keys())
1845 return keys.__iter__()
Georg Brandl86def6c2008-01-21 20:36:10 +00001846
Christian Heimes587c2bf2008-01-19 16:21:02 +00001847 if __name__ == "__main__":
1848 from random import choice
1849 levels = (logging.DEBUG, logging.INFO, logging.WARNING, logging.ERROR, logging.CRITICAL)
1850 a1 = logging.LoggerAdapter(logging.getLogger("a.b.c"),
1851 { "ip" : "123.231.231.123", "user" : "sheila" })
1852 logging.basicConfig(level=logging.DEBUG,
1853 format="%(asctime)-15s %(name)-5s %(levelname)-8s IP: %(ip)-15s User: %(user)-8s %(message)s")
1854 a1.debug("A debug message")
1855 a1.info("An info message with %s", "some parameters")
1856 a2 = logging.LoggerAdapter(logging.getLogger("d.e.f"), ConnInfo())
1857 for x in range(10):
1858 lvl = choice(levels)
1859 lvlname = logging.getLevelName(lvl)
1860 a2.log(lvl, "A message at %s level with %d %s", lvlname, 2, "parameters")
Christian Heimes04c420f2008-01-18 18:40:46 +00001861
1862When this script is run, the output should look something like this::
1863
Christian Heimes587c2bf2008-01-19 16:21:02 +00001864 2008-01-18 14:49:54,023 a.b.c DEBUG IP: 123.231.231.123 User: sheila A debug message
1865 2008-01-18 14:49:54,023 a.b.c INFO IP: 123.231.231.123 User: sheila An info message with some parameters
1866 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
1867 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
1868 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
1869 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
1870 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
1871 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
1872 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
1873 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
1874 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
1875 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 +00001876
Christian Heimes790c8232008-01-07 21:14:23 +00001877
Vinay Sajipac007992010-09-17 12:45:26 +00001878.. _filters-contextual:
1879
Vinay Sajipc31be632010-09-06 22:18:20 +00001880Using Filters to impart contextual information
1881^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1882
1883You can also add contextual information to log output using a user-defined
1884:class:`Filter`. ``Filter`` instances are allowed to modify the ``LogRecords``
1885passed to them, including adding additional attributes which can then be output
1886using a suitable format string, or if needed a custom :class:`Formatter`.
1887
1888For example in a web application, the request being processed (or at least,
1889the interesting parts of it) can be stored in a threadlocal
1890(:class:`threading.local`) variable, and then accessed from a ``Filter`` to
1891add, say, information from the request - say, the remote IP address and remote
1892user's username - to the ``LogRecord``, using the attribute names 'ip' and
1893'user' as in the ``LoggerAdapter`` example above. In that case, the same format
1894string can be used to get similar output to that shown above. Here's an example
1895script::
1896
1897 import logging
1898 from random import choice
1899
1900 class ContextFilter(logging.Filter):
1901 """
1902 This is a filter which injects contextual information into the log.
1903
1904 Rather than use actual contextual information, we just use random
1905 data in this demo.
1906 """
1907
1908 USERS = ['jim', 'fred', 'sheila']
1909 IPS = ['123.231.231.123', '127.0.0.1', '192.168.0.1']
1910
1911 def filter(self, record):
1912
1913 record.ip = choice(ContextFilter.IPS)
1914 record.user = choice(ContextFilter.USERS)
1915 return True
1916
1917 if __name__ == "__main__":
1918 levels = (logging.DEBUG, logging.INFO, logging.WARNING, logging.ERROR, logging.CRITICAL)
1919 a1 = logging.LoggerAdapter(logging.getLogger("a.b.c"),
1920 { "ip" : "123.231.231.123", "user" : "sheila" })
1921 logging.basicConfig(level=logging.DEBUG,
1922 format="%(asctime)-15s %(name)-5s %(levelname)-8s IP: %(ip)-15s User: %(user)-8s %(message)s")
1923 a1 = logging.getLogger("a.b.c")
1924 a2 = logging.getLogger("d.e.f")
1925
1926 f = ContextFilter()
1927 a1.addFilter(f)
1928 a2.addFilter(f)
1929 a1.debug("A debug message")
1930 a1.info("An info message with %s", "some parameters")
1931 for x in range(10):
1932 lvl = choice(levels)
1933 lvlname = logging.getLevelName(lvl)
1934 a2.log(lvl, "A message at %s level with %d %s", lvlname, 2, "parameters")
1935
1936which, when run, produces something like::
1937
1938 2010-09-06 22:38:15,292 a.b.c DEBUG IP: 123.231.231.123 User: fred A debug message
1939 2010-09-06 22:38:15,300 a.b.c INFO IP: 192.168.0.1 User: sheila An info message with some parameters
1940 2010-09-06 22:38:15,300 d.e.f CRITICAL IP: 127.0.0.1 User: sheila A message at CRITICAL level with 2 parameters
1941 2010-09-06 22:38:15,300 d.e.f ERROR IP: 127.0.0.1 User: jim A message at ERROR level with 2 parameters
1942 2010-09-06 22:38:15,300 d.e.f DEBUG IP: 127.0.0.1 User: sheila A message at DEBUG level with 2 parameters
1943 2010-09-06 22:38:15,300 d.e.f ERROR IP: 123.231.231.123 User: fred A message at ERROR level with 2 parameters
1944 2010-09-06 22:38:15,300 d.e.f CRITICAL IP: 192.168.0.1 User: jim A message at CRITICAL level with 2 parameters
1945 2010-09-06 22:38:15,300 d.e.f CRITICAL IP: 127.0.0.1 User: sheila A message at CRITICAL level with 2 parameters
1946 2010-09-06 22:38:15,300 d.e.f DEBUG IP: 192.168.0.1 User: jim A message at DEBUG level with 2 parameters
1947 2010-09-06 22:38:15,301 d.e.f ERROR IP: 127.0.0.1 User: sheila A message at ERROR level with 2 parameters
1948 2010-09-06 22:38:15,301 d.e.f DEBUG IP: 123.231.231.123 User: fred A message at DEBUG level with 2 parameters
1949 2010-09-06 22:38:15,301 d.e.f INFO IP: 123.231.231.123 User: fred A message at INFO level with 2 parameters
1950
1951
Vinay Sajipd31f3632010-06-29 15:31:15 +00001952.. _multiple-processes:
1953
Vinay Sajipa7471bf2009-08-15 23:23:37 +00001954Logging to a single file from multiple processes
1955------------------------------------------------
1956
1957Although logging is thread-safe, and logging to a single file from multiple
1958threads in a single process *is* supported, logging to a single file from
1959*multiple processes* is *not* supported, because there is no standard way to
1960serialize access to a single file across multiple processes in Python. If you
Vinay Sajip121a1c42010-09-08 10:46:15 +00001961need to log to a single file from multiple processes, one way of doing this is
1962to have all the processes log to a :class:`SocketHandler`, and have a separate
1963process which implements a socket server which reads from the socket and logs
1964to file. (If you prefer, you can dedicate one thread in one of the existing
1965processes to perform this function.) The following section documents this
1966approach in more detail and includes a working socket receiver which can be
1967used as a starting point for you to adapt in your own applications.
Vinay Sajipa7471bf2009-08-15 23:23:37 +00001968
Vinay Sajip5a92b132009-08-15 23:35:08 +00001969If you are using a recent version of Python which includes the
Vinay Sajip121a1c42010-09-08 10:46:15 +00001970:mod:`multiprocessing` module, you could write your own handler which uses the
Vinay Sajip5a92b132009-08-15 23:35:08 +00001971:class:`Lock` class from this module to serialize access to the file from
1972your processes. The existing :class:`FileHandler` and subclasses do not make
1973use of :mod:`multiprocessing` at present, though they may do so in the future.
Vinay Sajip8c6b0a52009-08-17 13:17:47 +00001974Note that at present, the :mod:`multiprocessing` module does not provide
1975working lock functionality on all platforms (see
1976http://bugs.python.org/issue3770).
Vinay Sajip5a92b132009-08-15 23:35:08 +00001977
Vinay Sajip121a1c42010-09-08 10:46:15 +00001978.. currentmodule:: logging.handlers
1979
1980Alternatively, you can use a ``Queue`` and a :class:`QueueHandler` to send
1981all logging events to one of the processes in your multi-process application.
1982The following example script demonstrates how you can do this; in the example
1983a separate listener process listens for events sent by other processes and logs
1984them according to its own logging configuration. Although the example only
1985demonstrates one way of doing it (for example, you may want to use a listener
1986thread rather than a separate listener process - the implementation would be
1987analogous) it does allow for completely different logging configurations for
1988the listener and the other processes in your application, and can be used as
1989the basis for code meeting your own specific requirements::
1990
1991 # You'll need these imports in your own code
1992 import logging
1993 import logging.handlers
1994 import multiprocessing
1995
1996 # Next two import lines for this demo only
1997 from random import choice, random
1998 import time
1999
2000 #
2001 # Because you'll want to define the logging configurations for listener and workers, the
2002 # listener and worker process functions take a configurer parameter which is a callable
2003 # for configuring logging for that process. These functions are also passed the queue,
2004 # which they use for communication.
2005 #
2006 # In practice, you can configure the listener however you want, but note that in this
2007 # simple example, the listener does not apply level or filter logic to received records.
2008 # In practice, you would probably want to do ths logic in the worker processes, to avoid
2009 # sending events which would be filtered out between processes.
2010 #
2011 # The size of the rotated files is made small so you can see the results easily.
2012 def listener_configurer():
2013 root = logging.getLogger()
2014 h = logging.handlers.RotatingFileHandler('/tmp/mptest.log', 'a', 300, 10)
2015 f = logging.Formatter('%(asctime)s %(processName)-10s %(name)s %(levelname)-8s %(message)s')
2016 h.setFormatter(f)
2017 root.addHandler(h)
2018
2019 # This is the listener process top-level loop: wait for logging events
2020 # (LogRecords)on the queue and handle them, quit when you get a None for a
2021 # LogRecord.
2022 def listener_process(queue, configurer):
2023 configurer()
2024 while True:
2025 try:
2026 record = queue.get()
2027 if record is None: # We send this as a sentinel to tell the listener to quit.
2028 break
2029 logger = logging.getLogger(record.name)
2030 logger.handle(record) # No level or filter logic applied - just do it!
2031 except (KeyboardInterrupt, SystemExit):
2032 raise
2033 except:
2034 import sys, traceback
2035 print >> sys.stderr, 'Whoops! Problem:'
2036 traceback.print_exc(file=sys.stderr)
2037
2038 # Arrays used for random selections in this demo
2039
2040 LEVELS = [logging.DEBUG, logging.INFO, logging.WARNING,
2041 logging.ERROR, logging.CRITICAL]
2042
2043 LOGGERS = ['a.b.c', 'd.e.f']
2044
2045 MESSAGES = [
2046 'Random message #1',
2047 'Random message #2',
2048 'Random message #3',
2049 ]
2050
2051 # The worker configuration is done at the start of the worker process run.
2052 # Note that on Windows you can't rely on fork semantics, so each process
2053 # will run the logging configuration code when it starts.
2054 def worker_configurer(queue):
2055 h = logging.handlers.QueueHandler(queue) # Just the one handler needed
2056 root = logging.getLogger()
2057 root.addHandler(h)
2058 root.setLevel(logging.DEBUG) # send all messages, for demo; no other level or filter logic applied.
2059
2060 # This is the worker process top-level loop, which just logs ten events with
2061 # random intervening delays before terminating.
2062 # The print messages are just so you know it's doing something!
2063 def worker_process(queue, configurer):
2064 configurer(queue)
2065 name = multiprocessing.current_process().name
2066 print('Worker started: %s' % name)
2067 for i in range(10):
2068 time.sleep(random())
2069 logger = logging.getLogger(choice(LOGGERS))
2070 level = choice(LEVELS)
2071 message = choice(MESSAGES)
2072 logger.log(level, message)
2073 print('Worker finished: %s' % name)
2074
2075 # Here's where the demo gets orchestrated. Create the queue, create and start
2076 # the listener, create ten workers and start them, wait for them to finish,
2077 # then send a None to the queue to tell the listener to finish.
2078 def main():
2079 queue = multiprocessing.Queue(-1)
2080 listener = multiprocessing.Process(target=listener_process,
2081 args=(queue, listener_configurer))
2082 listener.start()
2083 workers = []
2084 for i in range(10):
2085 worker = multiprocessing.Process(target=worker_process,
2086 args=(queue, worker_configurer))
2087 workers.append(worker)
2088 worker.start()
2089 for w in workers:
2090 w.join()
2091 queue.put_nowait(None)
2092 listener.join()
2093
2094 if __name__ == '__main__':
2095 main()
2096
2097
2098.. currentmodule:: logging
2099
Benjamin Peterson8719ad52009-09-11 22:24:02 +00002100
Georg Brandl116aa622007-08-15 14:28:22 +00002101.. _network-logging:
2102
2103Sending and receiving logging events across a network
2104-----------------------------------------------------
2105
2106Let's say you want to send logging events across a network, and handle them at
2107the receiving end. A simple way of doing this is attaching a
2108:class:`SocketHandler` instance to the root logger at the sending end::
2109
2110 import logging, logging.handlers
2111
2112 rootLogger = logging.getLogger('')
2113 rootLogger.setLevel(logging.DEBUG)
2114 socketHandler = logging.handlers.SocketHandler('localhost',
2115 logging.handlers.DEFAULT_TCP_LOGGING_PORT)
2116 # don't bother with a formatter, since a socket handler sends the event as
2117 # an unformatted pickle
2118 rootLogger.addHandler(socketHandler)
2119
2120 # Now, we can log to the root logger, or any other logger. First the root...
2121 logging.info('Jackdaws love my big sphinx of quartz.')
2122
2123 # Now, define a couple of other loggers which might represent areas in your
2124 # application:
2125
2126 logger1 = logging.getLogger('myapp.area1')
2127 logger2 = logging.getLogger('myapp.area2')
2128
2129 logger1.debug('Quick zephyrs blow, vexing daft Jim.')
2130 logger1.info('How quickly daft jumping zebras vex.')
2131 logger2.warning('Jail zesty vixen who grabbed pay from quack.')
2132 logger2.error('The five boxing wizards jump quickly.')
2133
Alexandre Vassalottice261952008-05-12 02:31:37 +00002134At the receiving end, you can set up a receiver using the :mod:`socketserver`
Georg Brandl116aa622007-08-15 14:28:22 +00002135module. Here is a basic working example::
2136
Georg Brandla35f4b92009-05-31 16:41:59 +00002137 import pickle
Georg Brandl116aa622007-08-15 14:28:22 +00002138 import logging
2139 import logging.handlers
Alexandre Vassalottice261952008-05-12 02:31:37 +00002140 import socketserver
Georg Brandl116aa622007-08-15 14:28:22 +00002141 import struct
2142
2143
Alexandre Vassalottice261952008-05-12 02:31:37 +00002144 class LogRecordStreamHandler(socketserver.StreamRequestHandler):
Georg Brandl116aa622007-08-15 14:28:22 +00002145 """Handler for a streaming logging request.
2146
2147 This basically logs the record using whatever logging policy is
2148 configured locally.
2149 """
2150
2151 def handle(self):
2152 """
2153 Handle multiple requests - each expected to be a 4-byte length,
2154 followed by the LogRecord in pickle format. Logs the record
2155 according to whatever policy is configured locally.
2156 """
Collin Winter46334482007-09-10 00:49:57 +00002157 while True:
Georg Brandl116aa622007-08-15 14:28:22 +00002158 chunk = self.connection.recv(4)
2159 if len(chunk) < 4:
2160 break
2161 slen = struct.unpack(">L", chunk)[0]
2162 chunk = self.connection.recv(slen)
2163 while len(chunk) < slen:
2164 chunk = chunk + self.connection.recv(slen - len(chunk))
2165 obj = self.unPickle(chunk)
2166 record = logging.makeLogRecord(obj)
2167 self.handleLogRecord(record)
2168
2169 def unPickle(self, data):
Georg Brandla35f4b92009-05-31 16:41:59 +00002170 return pickle.loads(data)
Georg Brandl116aa622007-08-15 14:28:22 +00002171
2172 def handleLogRecord(self, record):
2173 # if a name is specified, we use the named logger rather than the one
2174 # implied by the record.
2175 if self.server.logname is not None:
2176 name = self.server.logname
2177 else:
2178 name = record.name
2179 logger = logging.getLogger(name)
2180 # N.B. EVERY record gets logged. This is because Logger.handle
2181 # is normally called AFTER logger-level filtering. If you want
2182 # to do filtering, do it at the client end to save wasting
2183 # cycles and network bandwidth!
2184 logger.handle(record)
2185
Alexandre Vassalottice261952008-05-12 02:31:37 +00002186 class LogRecordSocketReceiver(socketserver.ThreadingTCPServer):
Georg Brandl116aa622007-08-15 14:28:22 +00002187 """simple TCP socket-based logging receiver suitable for testing.
2188 """
2189
2190 allow_reuse_address = 1
2191
2192 def __init__(self, host='localhost',
2193 port=logging.handlers.DEFAULT_TCP_LOGGING_PORT,
2194 handler=LogRecordStreamHandler):
Alexandre Vassalottice261952008-05-12 02:31:37 +00002195 socketserver.ThreadingTCPServer.__init__(self, (host, port), handler)
Georg Brandl116aa622007-08-15 14:28:22 +00002196 self.abort = 0
2197 self.timeout = 1
2198 self.logname = None
2199
2200 def serve_until_stopped(self):
2201 import select
2202 abort = 0
2203 while not abort:
2204 rd, wr, ex = select.select([self.socket.fileno()],
2205 [], [],
2206 self.timeout)
2207 if rd:
2208 self.handle_request()
2209 abort = self.abort
2210
2211 def main():
2212 logging.basicConfig(
2213 format="%(relativeCreated)5d %(name)-15s %(levelname)-8s %(message)s")
2214 tcpserver = LogRecordSocketReceiver()
Georg Brandl6911e3c2007-09-04 07:15:32 +00002215 print("About to start TCP server...")
Georg Brandl116aa622007-08-15 14:28:22 +00002216 tcpserver.serve_until_stopped()
2217
2218 if __name__ == "__main__":
2219 main()
2220
2221First run the server, and then the client. On the client side, nothing is
2222printed on the console; on the server side, you should see something like::
2223
2224 About to start TCP server...
2225 59 root INFO Jackdaws love my big sphinx of quartz.
2226 59 myapp.area1 DEBUG Quick zephyrs blow, vexing daft Jim.
2227 69 myapp.area1 INFO How quickly daft jumping zebras vex.
2228 69 myapp.area2 WARNING Jail zesty vixen who grabbed pay from quack.
2229 69 myapp.area2 ERROR The five boxing wizards jump quickly.
2230
Vinay Sajipc15dfd62010-07-06 15:08:55 +00002231Note that there are some security issues with pickle in some scenarios. If
2232these affect you, you can use an alternative serialization scheme by overriding
2233the :meth:`makePickle` method and implementing your alternative there, as
2234well as adapting the above script to use your alternative serialization.
2235
Vinay Sajip4039aff2010-09-11 10:25:28 +00002236.. _arbitrary-object-messages:
2237
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +00002238Using arbitrary objects as messages
2239-----------------------------------
2240
2241In the preceding sections and examples, it has been assumed that the message
2242passed when logging the event is a string. However, this is not the only
2243possibility. You can pass an arbitrary object as a message, and its
2244:meth:`__str__` method will be called when the logging system needs to convert
2245it to a string representation. In fact, if you want to, you can avoid
2246computing a string representation altogether - for example, the
2247:class:`SocketHandler` emits an event by pickling it and sending it over the
2248wire.
2249
Vinay Sajip55778922010-09-23 09:09:15 +00002250Dealing with handlers that block
2251--------------------------------
2252
2253.. currentmodule:: logging.handlers
2254
2255Sometimes you have to get your logging handlers to do their work without
2256blocking the thread you’re logging from. This is common in Web applications,
2257though of course it also occurs in other scenarios.
2258
2259A common culprit which demonstrates sluggish behaviour is the
2260:class:`SMTPHandler`: sending emails can take a long time, for a
2261number of reasons outside the developer’s control (for example, a poorly
2262performing mail or network infrastructure). But almost any network-based
2263handler can block: Even a :class:`SocketHandler` operation may do a
2264DNS query under the hood which is too slow (and this query can be deep in the
2265socket library code, below the Python layer, and outside your control).
2266
2267One solution is to use a two-part approach. For the first part, attach only a
2268:class:`QueueHandler` to those loggers which are accessed from
2269performance-critical threads. They simply write to their queue, which can be
2270sized to a large enough capacity or initialized with no upper bound to their
2271size. The write to the queue will typically be accepted quickly, though you
2272will probably need to catch the :ref:`queue.Full` exception as a precaution
2273in your code. If you are a library developer who has performance-critical
2274threads in their code, be sure to document this (together with a suggestion to
2275attach only ``QueueHandlers`` to your loggers) for the benefit of other
2276developers who will use your code.
2277
2278The second part of the solution is :class:`QueueListener`, which has been
2279designed as the counterpart to :class:`QueueHandler`. A
2280:class:`QueueListener` is very simple: it’s passed a queue and some handlers,
2281and it fires up an internal thread which listens to its queue for LogRecords
2282sent from ``QueueHandlers`` (or any other source of ``LogRecords``, for that
2283matter). The ``LogRecords`` are removed from the queue and passed to the
2284handlers for processing.
2285
2286The advantage of having a separate :class:`QueueListener` class is that you
2287can use the same instance to service multiple ``QueueHandlers``. This is more
2288resource-friendly than, say, having threaded versions of the existing handler
2289classes, which would eat up one thread per handler for no particular benefit.
2290
2291An example of using these two classes follows (imports omitted)::
2292
2293 que = queue.Queue(-1) # no limit on size
2294 queue_handler = QueueHandler(que)
2295 handler = logging.StreamHandler()
2296 listener = QueueListener(que, handler)
2297 root = logging.getLogger()
2298 root.addHandler(queue_handler)
2299 formatter = logging.Formatter('%(threadName)s: %(message)s')
2300 handler.setFormatter(formatter)
2301 listener.start()
2302 # The log output will display the thread which generated
2303 # the event (the main thread) rather than the internal
2304 # thread which monitors the internal queue. This is what
2305 # you want to happen.
2306 root.warning('Look out!')
2307 listener.stop()
2308
2309which, when run, will produce::
2310
2311 MainThread: Look out!
2312
2313
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +00002314Optimization
2315------------
2316
2317Formatting of message arguments is deferred until it cannot be avoided.
2318However, computing the arguments passed to the logging method can also be
2319expensive, and you may want to avoid doing it if the logger will just throw
2320away your event. To decide what to do, you can call the :meth:`isEnabledFor`
2321method which takes a level argument and returns true if the event would be
2322created by the Logger for that level of call. You can write code like this::
2323
2324 if logger.isEnabledFor(logging.DEBUG):
2325 logger.debug("Message with %s, %s", expensive_func1(),
2326 expensive_func2())
2327
2328so that if the logger's threshold is set above ``DEBUG``, the calls to
2329:func:`expensive_func1` and :func:`expensive_func2` are never made.
2330
2331There are other optimizations which can be made for specific applications which
2332need more precise control over what logging information is collected. Here's a
2333list of things you can do to avoid processing during logging which you don't
2334need:
2335
2336+-----------------------------------------------+----------------------------------------+
2337| What you don't want to collect | How to avoid collecting it |
2338+===============================================+========================================+
2339| Information about where calls were made from. | Set ``logging._srcfile`` to ``None``. |
2340+-----------------------------------------------+----------------------------------------+
2341| Threading information. | Set ``logging.logThreads`` to ``0``. |
2342+-----------------------------------------------+----------------------------------------+
2343| Process information. | Set ``logging.logProcesses`` to ``0``. |
2344+-----------------------------------------------+----------------------------------------+
2345
2346Also note that the core logging module only includes the basic handlers. If
2347you don't import :mod:`logging.handlers` and :mod:`logging.config`, they won't
2348take up any memory.
2349
2350.. _handler:
Georg Brandl116aa622007-08-15 14:28:22 +00002351
2352Handler Objects
2353---------------
2354
2355Handlers have the following attributes and methods. Note that :class:`Handler`
2356is never instantiated directly; this class acts as a base for more useful
2357subclasses. However, the :meth:`__init__` method in subclasses needs to call
2358:meth:`Handler.__init__`.
2359
2360
2361.. method:: Handler.__init__(level=NOTSET)
2362
2363 Initializes the :class:`Handler` instance by setting its level, setting the list
2364 of filters to the empty list and creating a lock (using :meth:`createLock`) for
2365 serializing access to an I/O mechanism.
2366
2367
2368.. method:: Handler.createLock()
2369
2370 Initializes a thread lock which can be used to serialize access to underlying
2371 I/O functionality which may not be threadsafe.
2372
2373
2374.. method:: Handler.acquire()
2375
2376 Acquires the thread lock created with :meth:`createLock`.
2377
2378
2379.. method:: Handler.release()
2380
2381 Releases the thread lock acquired with :meth:`acquire`.
2382
2383
2384.. method:: Handler.setLevel(lvl)
2385
2386 Sets the threshold for this handler to *lvl*. Logging messages which are less
2387 severe than *lvl* will be ignored. When a handler is created, the level is set
2388 to :const:`NOTSET` (which causes all messages to be processed).
2389
2390
2391.. method:: Handler.setFormatter(form)
2392
2393 Sets the :class:`Formatter` for this handler to *form*.
2394
2395
2396.. method:: Handler.addFilter(filt)
2397
2398 Adds the specified filter *filt* to this handler.
2399
2400
2401.. method:: Handler.removeFilter(filt)
2402
2403 Removes the specified filter *filt* from this handler.
2404
2405
2406.. method:: Handler.filter(record)
2407
2408 Applies this handler's filters to the record and returns a true value if the
2409 record is to be processed.
2410
2411
2412.. method:: Handler.flush()
2413
2414 Ensure all logging output has been flushed. This version does nothing and is
2415 intended to be implemented by subclasses.
2416
2417
2418.. method:: Handler.close()
2419
Benjamin Peterson3e4f0552008-09-02 00:31:15 +00002420 Tidy up any resources used by the handler. This version does no output but
2421 removes the handler from an internal list of handlers which is closed when
2422 :func:`shutdown` is called. Subclasses should ensure that this gets called
2423 from overridden :meth:`close` methods.
Georg Brandl116aa622007-08-15 14:28:22 +00002424
2425
2426.. method:: Handler.handle(record)
2427
2428 Conditionally emits the specified logging record, depending on filters which may
2429 have been added to the handler. Wraps the actual emission of the record with
2430 acquisition/release of the I/O thread lock.
2431
2432
2433.. method:: Handler.handleError(record)
2434
2435 This method should be called from handlers when an exception is encountered
2436 during an :meth:`emit` call. By default it does nothing, which means that
2437 exceptions get silently ignored. This is what is mostly wanted for a logging
2438 system - most users will not care about errors in the logging system, they are
2439 more interested in application errors. You could, however, replace this with a
2440 custom handler if you wish. The specified record is the one which was being
2441 processed when the exception occurred.
2442
2443
2444.. method:: Handler.format(record)
2445
2446 Do formatting for a record - if a formatter is set, use it. Otherwise, use the
2447 default formatter for the module.
2448
2449
2450.. method:: Handler.emit(record)
2451
2452 Do whatever it takes to actually log the specified logging record. This version
2453 is intended to be implemented by subclasses and so raises a
2454 :exc:`NotImplementedError`.
2455
2456
Vinay Sajipd31f3632010-06-29 15:31:15 +00002457.. _stream-handler:
2458
Georg Brandl116aa622007-08-15 14:28:22 +00002459StreamHandler
2460^^^^^^^^^^^^^
2461
2462The :class:`StreamHandler` class, located in the core :mod:`logging` package,
2463sends logging output to streams such as *sys.stdout*, *sys.stderr* or any
2464file-like object (or, more precisely, any object which supports :meth:`write`
2465and :meth:`flush` methods).
2466
2467
Benjamin Peterson1baf4652009-12-31 03:11:23 +00002468.. currentmodule:: logging
2469
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +00002470.. class:: StreamHandler(stream=None)
Georg Brandl116aa622007-08-15 14:28:22 +00002471
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +00002472 Returns a new instance of the :class:`StreamHandler` class. If *stream* is
Georg Brandl116aa622007-08-15 14:28:22 +00002473 specified, the instance will use it for logging output; otherwise, *sys.stderr*
2474 will be used.
2475
2476
Benjamin Petersone41251e2008-04-25 01:59:09 +00002477 .. method:: emit(record)
Georg Brandl116aa622007-08-15 14:28:22 +00002478
Benjamin Petersone41251e2008-04-25 01:59:09 +00002479 If a formatter is specified, it is used to format the record. The record
2480 is then written to the stream with a trailing newline. If exception
2481 information is present, it is formatted using
2482 :func:`traceback.print_exception` and appended to the stream.
Georg Brandl116aa622007-08-15 14:28:22 +00002483
2484
Benjamin Petersone41251e2008-04-25 01:59:09 +00002485 .. method:: flush()
Georg Brandl116aa622007-08-15 14:28:22 +00002486
Benjamin Petersone41251e2008-04-25 01:59:09 +00002487 Flushes the stream by calling its :meth:`flush` method. Note that the
2488 :meth:`close` method is inherited from :class:`Handler` and so does
Benjamin Peterson3e4f0552008-09-02 00:31:15 +00002489 no output, so an explicit :meth:`flush` call may be needed at times.
Georg Brandl116aa622007-08-15 14:28:22 +00002490
Vinay Sajip05ed6952010-10-20 20:34:09 +00002491.. versionchanged:: 3.2
2492 The ``StreamHandler`` class now has a ``terminator`` attribute, default
2493 value ``"\n"``, which is used as the terminator when writing a formatted
2494 record to a stream. If you don't want this newline termination, you can
2495 set the handler instance's ``terminator`` attribute to the empty string.
Georg Brandl116aa622007-08-15 14:28:22 +00002496
Vinay Sajipd31f3632010-06-29 15:31:15 +00002497.. _file-handler:
2498
Georg Brandl116aa622007-08-15 14:28:22 +00002499FileHandler
2500^^^^^^^^^^^
2501
2502The :class:`FileHandler` class, located in the core :mod:`logging` package,
2503sends logging output to a disk file. It inherits the output functionality from
2504:class:`StreamHandler`.
2505
2506
Vinay Sajipd31f3632010-06-29 15:31:15 +00002507.. class:: FileHandler(filename, mode='a', encoding=None, delay=False)
Georg Brandl116aa622007-08-15 14:28:22 +00002508
2509 Returns a new instance of the :class:`FileHandler` class. The specified file is
2510 opened and used as the stream for logging. If *mode* is not specified,
2511 :const:`'a'` is used. If *encoding* is not *None*, it is used to open the file
Christian Heimese7a15bb2008-01-24 16:21:45 +00002512 with that encoding. If *delay* is true, then file opening is deferred until the
2513 first call to :meth:`emit`. By default, the file grows indefinitely.
Georg Brandl116aa622007-08-15 14:28:22 +00002514
2515
Benjamin Petersone41251e2008-04-25 01:59:09 +00002516 .. method:: close()
Georg Brandl116aa622007-08-15 14:28:22 +00002517
Benjamin Petersone41251e2008-04-25 01:59:09 +00002518 Closes the file.
Georg Brandl116aa622007-08-15 14:28:22 +00002519
2520
Benjamin Petersone41251e2008-04-25 01:59:09 +00002521 .. method:: emit(record)
Georg Brandl116aa622007-08-15 14:28:22 +00002522
Benjamin Petersone41251e2008-04-25 01:59:09 +00002523 Outputs the record to the file.
Georg Brandl116aa622007-08-15 14:28:22 +00002524
Georg Brandl1eb40bc2010-12-03 15:30:09 +00002525
Vinay Sajipd31f3632010-06-29 15:31:15 +00002526.. _null-handler:
Georg Brandl116aa622007-08-15 14:28:22 +00002527
Vinay Sajipaa672eb2009-01-02 18:53:45 +00002528NullHandler
2529^^^^^^^^^^^
2530
2531.. versionadded:: 3.1
2532
2533The :class:`NullHandler` class, located in the core :mod:`logging` package,
2534does not do any formatting or output. It is essentially a "no-op" handler
2535for use by library developers.
2536
Vinay Sajipaa672eb2009-01-02 18:53:45 +00002537.. class:: NullHandler()
2538
2539 Returns a new instance of the :class:`NullHandler` class.
2540
Vinay Sajipaa672eb2009-01-02 18:53:45 +00002541 .. method:: emit(record)
2542
2543 This method does nothing.
2544
Vinay Sajip76ca3b42010-09-27 13:53:47 +00002545 .. method:: handle(record)
2546
2547 This method does nothing.
2548
2549 .. method:: createLock()
2550
Senthil Kumaran46a48be2010-10-15 13:10:10 +00002551 This method returns ``None`` for the lock, since there is no
Vinay Sajip76ca3b42010-09-27 13:53:47 +00002552 underlying I/O to which access needs to be serialized.
2553
2554
Vinay Sajip26a2d5e2009-01-10 13:37:26 +00002555See :ref:`library-config` for more information on how to use
2556:class:`NullHandler`.
Benjamin Peterson960cf0f2009-01-09 04:11:44 +00002557
Vinay Sajipd31f3632010-06-29 15:31:15 +00002558.. _watched-file-handler:
2559
Georg Brandl116aa622007-08-15 14:28:22 +00002560WatchedFileHandler
2561^^^^^^^^^^^^^^^^^^
2562
Benjamin Peterson058e31e2009-01-16 03:54:08 +00002563.. currentmodule:: logging.handlers
Vinay Sajipaa672eb2009-01-02 18:53:45 +00002564
Georg Brandl116aa622007-08-15 14:28:22 +00002565The :class:`WatchedFileHandler` class, located in the :mod:`logging.handlers`
2566module, is a :class:`FileHandler` which watches the file it is logging to. If
2567the file changes, it is closed and reopened using the file name.
2568
2569A file change can happen because of usage of programs such as *newsyslog* and
2570*logrotate* which perform log file rotation. This handler, intended for use
2571under Unix/Linux, watches the file to see if it has changed since the last emit.
2572(A file is deemed to have changed if its device or inode have changed.) If the
2573file has changed, the old file stream is closed, and the file opened to get a
2574new stream.
2575
2576This handler is not appropriate for use under Windows, because under Windows
2577open log files cannot be moved or renamed - logging opens the files with
2578exclusive locks - and so there is no need for such a handler. Furthermore,
2579*ST_INO* is not supported under Windows; :func:`stat` always returns zero for
2580this value.
2581
2582
Christian Heimese7a15bb2008-01-24 16:21:45 +00002583.. class:: WatchedFileHandler(filename[,mode[, encoding[, delay]]])
Georg Brandl116aa622007-08-15 14:28:22 +00002584
2585 Returns a new instance of the :class:`WatchedFileHandler` class. The specified
2586 file is opened and used as the stream for logging. If *mode* is not specified,
2587 :const:`'a'` is used. If *encoding* is not *None*, it is used to open the file
Christian Heimese7a15bb2008-01-24 16:21:45 +00002588 with that encoding. If *delay* is true, then file opening is deferred until the
2589 first call to :meth:`emit`. By default, the file grows indefinitely.
Georg Brandl116aa622007-08-15 14:28:22 +00002590
2591
Benjamin Petersone41251e2008-04-25 01:59:09 +00002592 .. method:: emit(record)
Georg Brandl116aa622007-08-15 14:28:22 +00002593
Benjamin Petersone41251e2008-04-25 01:59:09 +00002594 Outputs the record to the file, but first checks to see if the file has
2595 changed. If it has, the existing stream is flushed and closed and the
2596 file opened again, before outputting the record to the file.
Georg Brandl116aa622007-08-15 14:28:22 +00002597
Vinay Sajipd31f3632010-06-29 15:31:15 +00002598.. _rotating-file-handler:
Georg Brandl116aa622007-08-15 14:28:22 +00002599
2600RotatingFileHandler
2601^^^^^^^^^^^^^^^^^^^
2602
2603The :class:`RotatingFileHandler` class, located in the :mod:`logging.handlers`
2604module, supports rotation of disk log files.
2605
2606
Georg Brandlcd7f32b2009-06-08 09:13:45 +00002607.. class:: RotatingFileHandler(filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=0)
Georg Brandl116aa622007-08-15 14:28:22 +00002608
2609 Returns a new instance of the :class:`RotatingFileHandler` class. The specified
2610 file is opened and used as the stream for logging. If *mode* is not specified,
Christian Heimese7a15bb2008-01-24 16:21:45 +00002611 ``'a'`` is used. If *encoding* is not *None*, it is used to open the file
2612 with that encoding. If *delay* is true, then file opening is deferred until the
2613 first call to :meth:`emit`. By default, the file grows indefinitely.
Georg Brandl116aa622007-08-15 14:28:22 +00002614
2615 You can use the *maxBytes* and *backupCount* values to allow the file to
2616 :dfn:`rollover` at a predetermined size. When the size is about to be exceeded,
2617 the file is closed and a new file is silently opened for output. Rollover occurs
2618 whenever the current log file is nearly *maxBytes* in length; if *maxBytes* is
2619 zero, rollover never occurs. If *backupCount* is non-zero, the system will save
2620 old log files by appending the extensions ".1", ".2" etc., to the filename. For
2621 example, with a *backupCount* of 5 and a base file name of :file:`app.log`, you
2622 would get :file:`app.log`, :file:`app.log.1`, :file:`app.log.2`, up to
2623 :file:`app.log.5`. The file being written to is always :file:`app.log`. When
2624 this file is filled, it is closed and renamed to :file:`app.log.1`, and if files
2625 :file:`app.log.1`, :file:`app.log.2`, etc. exist, then they are renamed to
2626 :file:`app.log.2`, :file:`app.log.3` etc. respectively.
2627
2628
Benjamin Petersone41251e2008-04-25 01:59:09 +00002629 .. method:: doRollover()
Georg Brandl116aa622007-08-15 14:28:22 +00002630
Benjamin Petersone41251e2008-04-25 01:59:09 +00002631 Does a rollover, as described above.
Georg Brandl116aa622007-08-15 14:28:22 +00002632
2633
Benjamin Petersone41251e2008-04-25 01:59:09 +00002634 .. method:: emit(record)
Georg Brandl116aa622007-08-15 14:28:22 +00002635
Benjamin Petersone41251e2008-04-25 01:59:09 +00002636 Outputs the record to the file, catering for rollover as described
2637 previously.
Georg Brandl116aa622007-08-15 14:28:22 +00002638
Vinay Sajipd31f3632010-06-29 15:31:15 +00002639.. _timed-rotating-file-handler:
Georg Brandl116aa622007-08-15 14:28:22 +00002640
2641TimedRotatingFileHandler
2642^^^^^^^^^^^^^^^^^^^^^^^^
2643
2644The :class:`TimedRotatingFileHandler` class, located in the
2645:mod:`logging.handlers` module, supports rotation of disk log files at certain
2646timed intervals.
2647
2648
Vinay Sajipd31f3632010-06-29 15:31:15 +00002649.. class:: TimedRotatingFileHandler(filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False)
Georg Brandl116aa622007-08-15 14:28:22 +00002650
2651 Returns a new instance of the :class:`TimedRotatingFileHandler` class. The
2652 specified file is opened and used as the stream for logging. On rotating it also
2653 sets the filename suffix. Rotating happens based on the product of *when* and
2654 *interval*.
2655
2656 You can use the *when* to specify the type of *interval*. The list of possible
Georg Brandl0c77a822008-06-10 16:37:50 +00002657 values is below. Note that they are not case sensitive.
Georg Brandl116aa622007-08-15 14:28:22 +00002658
Christian Heimesb558a2e2008-03-02 22:46:37 +00002659 +----------------+-----------------------+
2660 | Value | Type of interval |
2661 +================+=======================+
2662 | ``'S'`` | Seconds |
2663 +----------------+-----------------------+
2664 | ``'M'`` | Minutes |
2665 +----------------+-----------------------+
2666 | ``'H'`` | Hours |
2667 +----------------+-----------------------+
2668 | ``'D'`` | Days |
2669 +----------------+-----------------------+
2670 | ``'W'`` | Week day (0=Monday) |
2671 +----------------+-----------------------+
2672 | ``'midnight'`` | Roll over at midnight |
2673 +----------------+-----------------------+
Georg Brandl116aa622007-08-15 14:28:22 +00002674
Christian Heimesb558a2e2008-03-02 22:46:37 +00002675 The system will save old log files by appending extensions to the filename.
2676 The extensions are date-and-time based, using the strftime format
Benjamin Petersonad9d48d2008-04-02 21:49:44 +00002677 ``%Y-%m-%d_%H-%M-%S`` or a leading portion thereof, depending on the
Georg Brandl3dbca812008-07-23 16:10:53 +00002678 rollover interval.
Benjamin Peterson9451a1c2010-03-13 22:30:34 +00002679
2680 When computing the next rollover time for the first time (when the handler
2681 is created), the last modification time of an existing log file, or else
2682 the current time, is used to compute when the next rotation will occur.
2683
Georg Brandl0c77a822008-06-10 16:37:50 +00002684 If the *utc* argument is true, times in UTC will be used; otherwise
2685 local time is used.
2686
2687 If *backupCount* is nonzero, at most *backupCount* files
Benjamin Petersonad9d48d2008-04-02 21:49:44 +00002688 will be kept, and if more would be created when rollover occurs, the oldest
2689 one is deleted. The deletion logic uses the interval to determine which
2690 files to delete, so changing the interval may leave old files lying around.
Georg Brandl116aa622007-08-15 14:28:22 +00002691
Vinay Sajipd31f3632010-06-29 15:31:15 +00002692 If *delay* is true, then file opening is deferred until the first call to
2693 :meth:`emit`.
2694
Georg Brandl116aa622007-08-15 14:28:22 +00002695
Benjamin Petersone41251e2008-04-25 01:59:09 +00002696 .. method:: doRollover()
Georg Brandl116aa622007-08-15 14:28:22 +00002697
Benjamin Petersone41251e2008-04-25 01:59:09 +00002698 Does a rollover, as described above.
Georg Brandl116aa622007-08-15 14:28:22 +00002699
2700
Benjamin Petersone41251e2008-04-25 01:59:09 +00002701 .. method:: emit(record)
Georg Brandl116aa622007-08-15 14:28:22 +00002702
Benjamin Petersone41251e2008-04-25 01:59:09 +00002703 Outputs the record to the file, catering for rollover as described above.
Georg Brandl116aa622007-08-15 14:28:22 +00002704
2705
Vinay Sajipd31f3632010-06-29 15:31:15 +00002706.. _socket-handler:
2707
Georg Brandl116aa622007-08-15 14:28:22 +00002708SocketHandler
2709^^^^^^^^^^^^^
2710
2711The :class:`SocketHandler` class, located in the :mod:`logging.handlers` module,
2712sends logging output to a network socket. The base class uses a TCP socket.
2713
2714
2715.. class:: SocketHandler(host, port)
2716
2717 Returns a new instance of the :class:`SocketHandler` class intended to
2718 communicate with a remote machine whose address is given by *host* and *port*.
2719
2720
Benjamin Petersone41251e2008-04-25 01:59:09 +00002721 .. method:: close()
Georg Brandl116aa622007-08-15 14:28:22 +00002722
Benjamin Petersone41251e2008-04-25 01:59:09 +00002723 Closes the socket.
Georg Brandl116aa622007-08-15 14:28:22 +00002724
2725
Benjamin Petersone41251e2008-04-25 01:59:09 +00002726 .. method:: emit()
Georg Brandl116aa622007-08-15 14:28:22 +00002727
Benjamin Petersone41251e2008-04-25 01:59:09 +00002728 Pickles the record's attribute dictionary and writes it to the socket in
2729 binary format. If there is an error with the socket, silently drops the
2730 packet. If the connection was previously lost, re-establishes the
2731 connection. To unpickle the record at the receiving end into a
2732 :class:`LogRecord`, use the :func:`makeLogRecord` function.
Georg Brandl116aa622007-08-15 14:28:22 +00002733
2734
Benjamin Petersone41251e2008-04-25 01:59:09 +00002735 .. method:: handleError()
Georg Brandl116aa622007-08-15 14:28:22 +00002736
Benjamin Petersone41251e2008-04-25 01:59:09 +00002737 Handles an error which has occurred during :meth:`emit`. The most likely
2738 cause is a lost connection. Closes the socket so that we can retry on the
2739 next event.
Georg Brandl116aa622007-08-15 14:28:22 +00002740
2741
Benjamin Petersone41251e2008-04-25 01:59:09 +00002742 .. method:: makeSocket()
Georg Brandl116aa622007-08-15 14:28:22 +00002743
Benjamin Petersone41251e2008-04-25 01:59:09 +00002744 This is a factory method which allows subclasses to define the precise
2745 type of socket they want. The default implementation creates a TCP socket
2746 (:const:`socket.SOCK_STREAM`).
Georg Brandl116aa622007-08-15 14:28:22 +00002747
2748
Benjamin Petersone41251e2008-04-25 01:59:09 +00002749 .. method:: makePickle(record)
Georg Brandl116aa622007-08-15 14:28:22 +00002750
Benjamin Petersone41251e2008-04-25 01:59:09 +00002751 Pickles the record's attribute dictionary in binary format with a length
2752 prefix, and returns it ready for transmission across the socket.
Georg Brandl116aa622007-08-15 14:28:22 +00002753
Vinay Sajipd31f3632010-06-29 15:31:15 +00002754 Note that pickles aren't completely secure. If you are concerned about
2755 security, you may want to override this method to implement a more secure
2756 mechanism. For example, you can sign pickles using HMAC and then verify
2757 them on the receiving end, or alternatively you can disable unpickling of
2758 global objects on the receiving end.
Georg Brandl116aa622007-08-15 14:28:22 +00002759
Benjamin Petersone41251e2008-04-25 01:59:09 +00002760 .. method:: send(packet)
Georg Brandl116aa622007-08-15 14:28:22 +00002761
Benjamin Petersone41251e2008-04-25 01:59:09 +00002762 Send a pickled string *packet* to the socket. This function allows for
2763 partial sends which can happen when the network is busy.
Georg Brandl116aa622007-08-15 14:28:22 +00002764
2765
Vinay Sajipd31f3632010-06-29 15:31:15 +00002766.. _datagram-handler:
2767
Georg Brandl116aa622007-08-15 14:28:22 +00002768DatagramHandler
2769^^^^^^^^^^^^^^^
2770
2771The :class:`DatagramHandler` class, located in the :mod:`logging.handlers`
2772module, inherits from :class:`SocketHandler` to support sending logging messages
2773over UDP sockets.
2774
2775
2776.. class:: DatagramHandler(host, port)
2777
2778 Returns a new instance of the :class:`DatagramHandler` class intended to
2779 communicate with a remote machine whose address is given by *host* and *port*.
2780
2781
Benjamin Petersone41251e2008-04-25 01:59:09 +00002782 .. method:: emit()
Georg Brandl116aa622007-08-15 14:28:22 +00002783
Benjamin Petersone41251e2008-04-25 01:59:09 +00002784 Pickles the record's attribute dictionary and writes it to the socket in
2785 binary format. If there is an error with the socket, silently drops the
2786 packet. To unpickle the record at the receiving end into a
2787 :class:`LogRecord`, use the :func:`makeLogRecord` function.
Georg Brandl116aa622007-08-15 14:28:22 +00002788
2789
Benjamin Petersone41251e2008-04-25 01:59:09 +00002790 .. method:: makeSocket()
Georg Brandl116aa622007-08-15 14:28:22 +00002791
Benjamin Petersone41251e2008-04-25 01:59:09 +00002792 The factory method of :class:`SocketHandler` is here overridden to create
2793 a UDP socket (:const:`socket.SOCK_DGRAM`).
Georg Brandl116aa622007-08-15 14:28:22 +00002794
2795
Benjamin Petersone41251e2008-04-25 01:59:09 +00002796 .. method:: send(s)
Georg Brandl116aa622007-08-15 14:28:22 +00002797
Benjamin Petersone41251e2008-04-25 01:59:09 +00002798 Send a pickled string to a socket.
Georg Brandl116aa622007-08-15 14:28:22 +00002799
2800
Vinay Sajipd31f3632010-06-29 15:31:15 +00002801.. _syslog-handler:
2802
Georg Brandl116aa622007-08-15 14:28:22 +00002803SysLogHandler
2804^^^^^^^^^^^^^
2805
2806The :class:`SysLogHandler` class, located in the :mod:`logging.handlers` module,
2807supports sending logging messages to a remote or local Unix syslog.
2808
2809
Vinay Sajipcbabd7e2009-10-10 20:32:36 +00002810.. class:: SysLogHandler(address=('localhost', SYSLOG_UDP_PORT), facility=LOG_USER, socktype=socket.SOCK_DGRAM)
Georg Brandl116aa622007-08-15 14:28:22 +00002811
2812 Returns a new instance of the :class:`SysLogHandler` class intended to
2813 communicate with a remote Unix machine whose address is given by *address* in
2814 the form of a ``(host, port)`` tuple. If *address* is not specified,
Vinay Sajipcbabd7e2009-10-10 20:32:36 +00002815 ``('localhost', 514)`` is used. The address is used to open a socket. An
Georg Brandl116aa622007-08-15 14:28:22 +00002816 alternative to providing a ``(host, port)`` tuple is providing an address as a
2817 string, for example "/dev/log". In this case, a Unix domain socket is used to
2818 send the message to the syslog. If *facility* is not specified,
Vinay Sajipcbabd7e2009-10-10 20:32:36 +00002819 :const:`LOG_USER` is used. The type of socket opened depends on the
2820 *socktype* argument, which defaults to :const:`socket.SOCK_DGRAM` and thus
2821 opens a UDP socket. To open a TCP socket (for use with the newer syslog
2822 daemons such as rsyslog), specify a value of :const:`socket.SOCK_STREAM`.
2823
Vinay Sajip972412d2010-09-23 20:31:24 +00002824 Note that if your server is not listening on UDP port 514,
2825 :class:`SysLogHandler` may appear not to work. In that case, check what
2826 address you should be using for a domain socket - it's system dependent.
2827 For example, on Linux it's usually "/dev/log" but on OS/X it's
2828 "/var/run/syslog". You'll need to check your platform and use the
2829 appropriate address (you may need to do this check at runtime if your
2830 application needs to run on several platforms). On Windows, you pretty
2831 much have to use the UDP option.
2832
Vinay Sajipcbabd7e2009-10-10 20:32:36 +00002833 .. versionchanged:: 3.2
2834 *socktype* was added.
Georg Brandl116aa622007-08-15 14:28:22 +00002835
2836
Benjamin Petersone41251e2008-04-25 01:59:09 +00002837 .. method:: close()
Georg Brandl116aa622007-08-15 14:28:22 +00002838
Benjamin Petersone41251e2008-04-25 01:59:09 +00002839 Closes the socket to the remote host.
Georg Brandl116aa622007-08-15 14:28:22 +00002840
2841
Benjamin Petersone41251e2008-04-25 01:59:09 +00002842 .. method:: emit(record)
Georg Brandl116aa622007-08-15 14:28:22 +00002843
Benjamin Petersone41251e2008-04-25 01:59:09 +00002844 The record is formatted, and then sent to the syslog server. If exception
2845 information is present, it is *not* sent to the server.
Georg Brandl116aa622007-08-15 14:28:22 +00002846
2847
Benjamin Petersone41251e2008-04-25 01:59:09 +00002848 .. method:: encodePriority(facility, priority)
Georg Brandl116aa622007-08-15 14:28:22 +00002849
Benjamin Petersone41251e2008-04-25 01:59:09 +00002850 Encodes the facility and priority into an integer. You can pass in strings
2851 or integers - if strings are passed, internal mapping dictionaries are
2852 used to convert them to integers.
Georg Brandl116aa622007-08-15 14:28:22 +00002853
Benjamin Peterson22005fc2010-04-11 16:25:06 +00002854 The symbolic ``LOG_`` values are defined in :class:`SysLogHandler` and
2855 mirror the values defined in the ``sys/syslog.h`` header file.
Benjamin Peterson08bf91c2010-04-11 16:12:57 +00002856
Georg Brandl88d7dbd2010-04-18 09:50:07 +00002857 **Priorities**
2858
Benjamin Peterson08bf91c2010-04-11 16:12:57 +00002859 +--------------------------+---------------+
2860 | Name (string) | Symbolic value|
2861 +==========================+===============+
2862 | ``alert`` | LOG_ALERT |
2863 +--------------------------+---------------+
2864 | ``crit`` or ``critical`` | LOG_CRIT |
2865 +--------------------------+---------------+
2866 | ``debug`` | LOG_DEBUG |
2867 +--------------------------+---------------+
2868 | ``emerg`` or ``panic`` | LOG_EMERG |
2869 +--------------------------+---------------+
2870 | ``err`` or ``error`` | LOG_ERR |
2871 +--------------------------+---------------+
2872 | ``info`` | LOG_INFO |
2873 +--------------------------+---------------+
2874 | ``notice`` | LOG_NOTICE |
2875 +--------------------------+---------------+
2876 | ``warn`` or ``warning`` | LOG_WARNING |
2877 +--------------------------+---------------+
2878
Georg Brandl88d7dbd2010-04-18 09:50:07 +00002879 **Facilities**
2880
Benjamin Peterson08bf91c2010-04-11 16:12:57 +00002881 +---------------+---------------+
2882 | Name (string) | Symbolic value|
2883 +===============+===============+
2884 | ``auth`` | LOG_AUTH |
2885 +---------------+---------------+
2886 | ``authpriv`` | LOG_AUTHPRIV |
2887 +---------------+---------------+
2888 | ``cron`` | LOG_CRON |
2889 +---------------+---------------+
2890 | ``daemon`` | LOG_DAEMON |
2891 +---------------+---------------+
2892 | ``ftp`` | LOG_FTP |
2893 +---------------+---------------+
2894 | ``kern`` | LOG_KERN |
2895 +---------------+---------------+
2896 | ``lpr`` | LOG_LPR |
2897 +---------------+---------------+
2898 | ``mail`` | LOG_MAIL |
2899 +---------------+---------------+
2900 | ``news`` | LOG_NEWS |
2901 +---------------+---------------+
2902 | ``syslog`` | LOG_SYSLOG |
2903 +---------------+---------------+
2904 | ``user`` | LOG_USER |
2905 +---------------+---------------+
2906 | ``uucp`` | LOG_UUCP |
2907 +---------------+---------------+
2908 | ``local0`` | LOG_LOCAL0 |
2909 +---------------+---------------+
2910 | ``local1`` | LOG_LOCAL1 |
2911 +---------------+---------------+
2912 | ``local2`` | LOG_LOCAL2 |
2913 +---------------+---------------+
2914 | ``local3`` | LOG_LOCAL3 |
2915 +---------------+---------------+
2916 | ``local4`` | LOG_LOCAL4 |
2917 +---------------+---------------+
2918 | ``local5`` | LOG_LOCAL5 |
2919 +---------------+---------------+
2920 | ``local6`` | LOG_LOCAL6 |
2921 +---------------+---------------+
2922 | ``local7`` | LOG_LOCAL7 |
2923 +---------------+---------------+
2924
2925 .. method:: mapPriority(levelname)
2926
2927 Maps a logging level name to a syslog priority name.
2928 You may need to override this if you are using custom levels, or
2929 if the default algorithm is not suitable for your needs. The
2930 default algorithm maps ``DEBUG``, ``INFO``, ``WARNING``, ``ERROR`` and
2931 ``CRITICAL`` to the equivalent syslog names, and all other level
2932 names to "warning".
2933
2934.. _nt-eventlog-handler:
Georg Brandl116aa622007-08-15 14:28:22 +00002935
2936NTEventLogHandler
2937^^^^^^^^^^^^^^^^^
2938
2939The :class:`NTEventLogHandler` class, located in the :mod:`logging.handlers`
2940module, supports sending logging messages to a local Windows NT, Windows 2000 or
2941Windows XP event log. Before you can use it, you need Mark Hammond's Win32
2942extensions for Python installed.
2943
2944
Georg Brandlcd7f32b2009-06-08 09:13:45 +00002945.. class:: NTEventLogHandler(appname, dllname=None, logtype='Application')
Georg Brandl116aa622007-08-15 14:28:22 +00002946
2947 Returns a new instance of the :class:`NTEventLogHandler` class. The *appname* is
2948 used to define the application name as it appears in the event log. An
2949 appropriate registry entry is created using this name. The *dllname* should give
2950 the fully qualified pathname of a .dll or .exe which contains message
2951 definitions to hold in the log (if not specified, ``'win32service.pyd'`` is used
2952 - this is installed with the Win32 extensions and contains some basic
2953 placeholder message definitions. Note that use of these placeholders will make
2954 your event logs big, as the entire message source is held in the log. If you
2955 want slimmer logs, you have to pass in the name of your own .dll or .exe which
2956 contains the message definitions you want to use in the event log). The
2957 *logtype* is one of ``'Application'``, ``'System'`` or ``'Security'``, and
2958 defaults to ``'Application'``.
2959
2960
Benjamin Petersone41251e2008-04-25 01:59:09 +00002961 .. method:: close()
Georg Brandl116aa622007-08-15 14:28:22 +00002962
Benjamin Petersone41251e2008-04-25 01:59:09 +00002963 At this point, you can remove the application name from the registry as a
2964 source of event log entries. However, if you do this, you will not be able
2965 to see the events as you intended in the Event Log Viewer - it needs to be
2966 able to access the registry to get the .dll name. The current version does
Benjamin Peterson3e4f0552008-09-02 00:31:15 +00002967 not do this.
Georg Brandl116aa622007-08-15 14:28:22 +00002968
2969
Benjamin Petersone41251e2008-04-25 01:59:09 +00002970 .. method:: emit(record)
Georg Brandl116aa622007-08-15 14:28:22 +00002971
Benjamin Petersone41251e2008-04-25 01:59:09 +00002972 Determines the message ID, event category and event type, and then logs
2973 the message in the NT event log.
Georg Brandl116aa622007-08-15 14:28:22 +00002974
2975
Benjamin Petersone41251e2008-04-25 01:59:09 +00002976 .. method:: getEventCategory(record)
Georg Brandl116aa622007-08-15 14:28:22 +00002977
Benjamin Petersone41251e2008-04-25 01:59:09 +00002978 Returns the event category for the record. Override this if you want to
2979 specify your own categories. This version returns 0.
Georg Brandl116aa622007-08-15 14:28:22 +00002980
2981
Benjamin Petersone41251e2008-04-25 01:59:09 +00002982 .. method:: getEventType(record)
Georg Brandl116aa622007-08-15 14:28:22 +00002983
Benjamin Petersone41251e2008-04-25 01:59:09 +00002984 Returns the event type for the record. Override this if you want to
2985 specify your own types. This version does a mapping using the handler's
2986 typemap attribute, which is set up in :meth:`__init__` to a dictionary
2987 which contains mappings for :const:`DEBUG`, :const:`INFO`,
2988 :const:`WARNING`, :const:`ERROR` and :const:`CRITICAL`. If you are using
2989 your own levels, you will either need to override this method or place a
2990 suitable dictionary in the handler's *typemap* attribute.
Georg Brandl116aa622007-08-15 14:28:22 +00002991
2992
Benjamin Petersone41251e2008-04-25 01:59:09 +00002993 .. method:: getMessageID(record)
Georg Brandl116aa622007-08-15 14:28:22 +00002994
Benjamin Petersone41251e2008-04-25 01:59:09 +00002995 Returns the message ID for the record. If you are using your own messages,
2996 you could do this by having the *msg* passed to the logger being an ID
2997 rather than a format string. Then, in here, you could use a dictionary
2998 lookup to get the message ID. This version returns 1, which is the base
2999 message ID in :file:`win32service.pyd`.
Georg Brandl116aa622007-08-15 14:28:22 +00003000
Vinay Sajipd31f3632010-06-29 15:31:15 +00003001.. _smtp-handler:
Georg Brandl116aa622007-08-15 14:28:22 +00003002
3003SMTPHandler
3004^^^^^^^^^^^
3005
3006The :class:`SMTPHandler` class, located in the :mod:`logging.handlers` module,
3007supports sending logging messages to an email address via SMTP.
3008
3009
Georg Brandlcd7f32b2009-06-08 09:13:45 +00003010.. class:: SMTPHandler(mailhost, fromaddr, toaddrs, subject, credentials=None)
Georg Brandl116aa622007-08-15 14:28:22 +00003011
3012 Returns a new instance of the :class:`SMTPHandler` class. The instance is
3013 initialized with the from and to addresses and subject line of the email. The
3014 *toaddrs* should be a list of strings. To specify a non-standard SMTP port, use
3015 the (host, port) tuple format for the *mailhost* argument. If you use a string,
3016 the standard SMTP port is used. If your SMTP server requires authentication, you
3017 can specify a (username, password) tuple for the *credentials* argument.
3018
Georg Brandl116aa622007-08-15 14:28:22 +00003019
Benjamin Petersone41251e2008-04-25 01:59:09 +00003020 .. method:: emit(record)
Georg Brandl116aa622007-08-15 14:28:22 +00003021
Benjamin Petersone41251e2008-04-25 01:59:09 +00003022 Formats the record and sends it to the specified addressees.
Georg Brandl116aa622007-08-15 14:28:22 +00003023
3024
Benjamin Petersone41251e2008-04-25 01:59:09 +00003025 .. method:: getSubject(record)
Georg Brandl116aa622007-08-15 14:28:22 +00003026
Benjamin Petersone41251e2008-04-25 01:59:09 +00003027 If you want to specify a subject line which is record-dependent, override
3028 this method.
Georg Brandl116aa622007-08-15 14:28:22 +00003029
Vinay Sajipd31f3632010-06-29 15:31:15 +00003030.. _memory-handler:
Georg Brandl116aa622007-08-15 14:28:22 +00003031
3032MemoryHandler
3033^^^^^^^^^^^^^
3034
3035The :class:`MemoryHandler` class, located in the :mod:`logging.handlers` module,
3036supports buffering of logging records in memory, periodically flushing them to a
3037:dfn:`target` handler. Flushing occurs whenever the buffer is full, or when an
3038event of a certain severity or greater is seen.
3039
3040:class:`MemoryHandler` is a subclass of the more general
3041:class:`BufferingHandler`, which is an abstract class. This buffers logging
3042records in memory. Whenever each record is added to the buffer, a check is made
3043by calling :meth:`shouldFlush` to see if the buffer should be flushed. If it
3044should, then :meth:`flush` is expected to do the needful.
3045
3046
3047.. class:: BufferingHandler(capacity)
3048
3049 Initializes the handler with a buffer of the specified capacity.
3050
3051
Benjamin Petersone41251e2008-04-25 01:59:09 +00003052 .. method:: emit(record)
Georg Brandl116aa622007-08-15 14:28:22 +00003053
Benjamin Petersone41251e2008-04-25 01:59:09 +00003054 Appends the record to the buffer. If :meth:`shouldFlush` returns true,
3055 calls :meth:`flush` to process the buffer.
Georg Brandl116aa622007-08-15 14:28:22 +00003056
3057
Benjamin Petersone41251e2008-04-25 01:59:09 +00003058 .. method:: flush()
Georg Brandl116aa622007-08-15 14:28:22 +00003059
Benjamin Petersone41251e2008-04-25 01:59:09 +00003060 You can override this to implement custom flushing behavior. This version
3061 just zaps the buffer to empty.
Georg Brandl116aa622007-08-15 14:28:22 +00003062
3063
Benjamin Petersone41251e2008-04-25 01:59:09 +00003064 .. method:: shouldFlush(record)
Georg Brandl116aa622007-08-15 14:28:22 +00003065
Benjamin Petersone41251e2008-04-25 01:59:09 +00003066 Returns true if the buffer is up to capacity. This method can be
3067 overridden to implement custom flushing strategies.
Georg Brandl116aa622007-08-15 14:28:22 +00003068
3069
Georg Brandlcd7f32b2009-06-08 09:13:45 +00003070.. class:: MemoryHandler(capacity, flushLevel=ERROR, target=None)
Georg Brandl116aa622007-08-15 14:28:22 +00003071
3072 Returns a new instance of the :class:`MemoryHandler` class. The instance is
3073 initialized with a buffer size of *capacity*. If *flushLevel* is not specified,
3074 :const:`ERROR` is used. If no *target* is specified, the target will need to be
3075 set using :meth:`setTarget` before this handler does anything useful.
3076
3077
Benjamin Petersone41251e2008-04-25 01:59:09 +00003078 .. method:: close()
Georg Brandl116aa622007-08-15 14:28:22 +00003079
Benjamin Petersone41251e2008-04-25 01:59:09 +00003080 Calls :meth:`flush`, sets the target to :const:`None` and clears the
3081 buffer.
Georg Brandl116aa622007-08-15 14:28:22 +00003082
3083
Benjamin Petersone41251e2008-04-25 01:59:09 +00003084 .. method:: flush()
Georg Brandl116aa622007-08-15 14:28:22 +00003085
Benjamin Petersone41251e2008-04-25 01:59:09 +00003086 For a :class:`MemoryHandler`, flushing means just sending the buffered
Vinay Sajipc84f0162010-09-21 11:25:39 +00003087 records to the target, if there is one. The buffer is also cleared when
3088 this happens. Override if you want different behavior.
Georg Brandl116aa622007-08-15 14:28:22 +00003089
3090
Benjamin Petersone41251e2008-04-25 01:59:09 +00003091 .. method:: setTarget(target)
Georg Brandl116aa622007-08-15 14:28:22 +00003092
Benjamin Petersone41251e2008-04-25 01:59:09 +00003093 Sets the target handler for this handler.
Georg Brandl116aa622007-08-15 14:28:22 +00003094
3095
Benjamin Petersone41251e2008-04-25 01:59:09 +00003096 .. method:: shouldFlush(record)
Georg Brandl116aa622007-08-15 14:28:22 +00003097
Benjamin Petersone41251e2008-04-25 01:59:09 +00003098 Checks for buffer full or a record at the *flushLevel* or higher.
Georg Brandl116aa622007-08-15 14:28:22 +00003099
3100
Vinay Sajipd31f3632010-06-29 15:31:15 +00003101.. _http-handler:
3102
Georg Brandl116aa622007-08-15 14:28:22 +00003103HTTPHandler
3104^^^^^^^^^^^
3105
3106The :class:`HTTPHandler` class, located in the :mod:`logging.handlers` module,
3107supports sending logging messages to a Web server, using either ``GET`` or
3108``POST`` semantics.
3109
3110
Vinay Sajip1b5646a2010-09-13 20:37:50 +00003111.. class:: HTTPHandler(host, url, method='GET', secure=False, credentials=None)
Georg Brandl116aa622007-08-15 14:28:22 +00003112
Vinay Sajip1b5646a2010-09-13 20:37:50 +00003113 Returns a new instance of the :class:`HTTPHandler` class. The *host* can be
3114 of the form ``host:port``, should you need to use a specific port number.
3115 If no *method* is specified, ``GET`` is used. If *secure* is True, an HTTPS
3116 connection will be used. If *credentials* is specified, it should be a
3117 2-tuple consisting of userid and password, which will be placed in an HTTP
3118 'Authorization' header using Basic authentication. If you specify
3119 credentials, you should also specify secure=True so that your userid and
3120 password are not passed in cleartext across the wire.
Georg Brandl116aa622007-08-15 14:28:22 +00003121
3122
Benjamin Petersone41251e2008-04-25 01:59:09 +00003123 .. method:: emit(record)
Georg Brandl116aa622007-08-15 14:28:22 +00003124
Senthil Kumaranf0769e82010-08-09 19:53:52 +00003125 Sends the record to the Web server as a percent-encoded dictionary.
Georg Brandl116aa622007-08-15 14:28:22 +00003126
3127
Vinay Sajip121a1c42010-09-08 10:46:15 +00003128.. _queue-handler:
3129
3130
3131QueueHandler
3132^^^^^^^^^^^^
3133
Georg Brandl1eb40bc2010-12-03 15:30:09 +00003134.. versionadded:: 3.2
3135
Vinay Sajip121a1c42010-09-08 10:46:15 +00003136The :class:`QueueHandler` class, located in the :mod:`logging.handlers` module,
3137supports sending logging messages to a queue, such as those implemented in the
3138:mod:`queue` or :mod:`multiprocessing` modules.
3139
Vinay Sajip0637d492010-09-23 08:15:54 +00003140Along with the :class:`QueueListener` class, :class:`QueueHandler` can be used
3141to let handlers do their work on a separate thread from the one which does the
3142logging. This is important in Web applications and also other service
3143applications where threads servicing clients need to respond as quickly as
3144possible, while any potentially slow operations (such as sending an email via
3145:class:`SMTPHandler`) are done on a separate thread.
Vinay Sajip121a1c42010-09-08 10:46:15 +00003146
3147.. class:: QueueHandler(queue)
3148
3149 Returns a new instance of the :class:`QueueHandler` class. The instance is
Vinay Sajip63891ed2010-09-13 20:02:39 +00003150 initialized with the queue to send messages to. The queue can be any queue-
Vinay Sajip0637d492010-09-23 08:15:54 +00003151 like object; it's used as-is by the :meth:`enqueue` method, which needs
Vinay Sajip63891ed2010-09-13 20:02:39 +00003152 to know how to send messages to it.
Vinay Sajip121a1c42010-09-08 10:46:15 +00003153
3154
3155 .. method:: emit(record)
3156
Vinay Sajip0258ce82010-09-22 20:34:53 +00003157 Enqueues the result of preparing the LogRecord.
3158
3159 .. method:: prepare(record)
3160
3161 Prepares a record for queuing. The object returned by this
3162 method is enqueued.
3163
3164 The base implementation formats the record to merge the message
3165 and arguments, and removes unpickleable items from the record
3166 in-place.
3167
3168 You might want to override this method if you want to convert
3169 the record to a dict or JSON string, or send a modified copy
3170 of the record while leaving the original intact.
Vinay Sajip121a1c42010-09-08 10:46:15 +00003171
3172 .. method:: enqueue(record)
3173
3174 Enqueues the record on the queue using ``put_nowait()``; you may
3175 want to override this if you want to use blocking behaviour, or a
3176 timeout, or a customised queue implementation.
3177
3178
Vinay Sajip121a1c42010-09-08 10:46:15 +00003179
Vinay Sajip0637d492010-09-23 08:15:54 +00003180.. queue-listener:
3181
3182QueueListener
3183^^^^^^^^^^^^^
3184
Georg Brandl1eb40bc2010-12-03 15:30:09 +00003185.. versionadded:: 3.2
3186
Vinay Sajip0637d492010-09-23 08:15:54 +00003187The :class:`QueueListener` class, located in the :mod:`logging.handlers`
3188module, supports receiving logging messages from a queue, such as those
3189implemented in the :mod:`queue` or :mod:`multiprocessing` modules. The
3190messages are received from a queue in an internal thread and passed, on
3191the same thread, to one or more handlers for processing.
3192
3193Along with the :class:`QueueHandler` class, :class:`QueueListener` can be used
3194to let handlers do their work on a separate thread from the one which does the
3195logging. This is important in Web applications and also other service
3196applications where threads servicing clients need to respond as quickly as
3197possible, while any potentially slow operations (such as sending an email via
3198:class:`SMTPHandler`) are done on a separate thread.
3199
3200.. class:: QueueListener(queue, *handlers)
3201
3202 Returns a new instance of the :class:`QueueListener` class. The instance is
3203 initialized with the queue to send messages to and a list of handlers which
3204 will handle entries placed on the queue. The queue can be any queue-
3205 like object; it's passed as-is to the :meth:`dequeue` method, which needs
3206 to know how to get messages from it.
3207
3208 .. method:: dequeue(block)
3209
3210 Dequeues a record and return it, optionally blocking.
3211
3212 The base implementation uses ``get()``. You may want to override this
3213 method if you want to use timeouts or work with custom queue
3214 implementations.
3215
3216 .. method:: prepare(record)
3217
3218 Prepare a record for handling.
3219
3220 This implementation just returns the passed-in record. You may want to
3221 override this method if you need to do any custom marshalling or
3222 manipulation of the record before passing it to the handlers.
3223
3224 .. method:: handle(record)
3225
3226 Handle a record.
3227
3228 This just loops through the handlers offering them the record
3229 to handle. The actual object passed to the handlers is that which
3230 is returned from :meth:`prepare`.
3231
3232 .. method:: start()
3233
3234 Starts the listener.
3235
3236 This starts up a background thread to monitor the queue for
3237 LogRecords to process.
3238
3239 .. method:: stop()
3240
3241 Stops the listener.
3242
3243 This asks the thread to terminate, and then waits for it to do so.
3244 Note that if you don't call this before your application exits, there
3245 may be some records still left on the queue, which won't be processed.
3246
Vinay Sajip0637d492010-09-23 08:15:54 +00003247
Vinay Sajip63891ed2010-09-13 20:02:39 +00003248.. _zeromq-handlers:
3249
Vinay Sajip0637d492010-09-23 08:15:54 +00003250Subclassing QueueHandler
3251^^^^^^^^^^^^^^^^^^^^^^^^
3252
Vinay Sajip63891ed2010-09-13 20:02:39 +00003253You can use a :class:`QueueHandler` subclass to send messages to other kinds
3254of queues, for example a ZeroMQ "publish" socket. In the example below,the
3255socket is created separately and passed to the handler (as its 'queue')::
3256
3257 import zmq # using pyzmq, the Python binding for ZeroMQ
3258 import json # for serializing records portably
3259
3260 ctx = zmq.Context()
3261 sock = zmq.Socket(ctx, zmq.PUB) # or zmq.PUSH, or other suitable value
3262 sock.bind('tcp://*:5556') # or wherever
3263
3264 class ZeroMQSocketHandler(QueueHandler):
3265 def enqueue(self, record):
3266 data = json.dumps(record.__dict__)
3267 self.queue.send(data)
3268
Vinay Sajip0055c422010-09-14 09:42:39 +00003269 handler = ZeroMQSocketHandler(sock)
3270
3271
Vinay Sajip63891ed2010-09-13 20:02:39 +00003272Of course there are other ways of organizing this, for example passing in the
3273data needed by the handler to create the socket::
3274
3275 class ZeroMQSocketHandler(QueueHandler):
3276 def __init__(self, uri, socktype=zmq.PUB, ctx=None):
3277 self.ctx = ctx or zmq.Context()
3278 socket = zmq.Socket(self.ctx, socktype)
Vinay Sajip0637d492010-09-23 08:15:54 +00003279 socket.bind(uri)
Vinay Sajip0055c422010-09-14 09:42:39 +00003280 QueueHandler.__init__(self, socket)
Vinay Sajip63891ed2010-09-13 20:02:39 +00003281
3282 def enqueue(self, record):
3283 data = json.dumps(record.__dict__)
3284 self.queue.send(data)
3285
Vinay Sajipde726922010-09-14 06:59:24 +00003286 def close(self):
3287 self.queue.close()
Vinay Sajip121a1c42010-09-08 10:46:15 +00003288
Georg Brandl1eb40bc2010-12-03 15:30:09 +00003289
Vinay Sajip0637d492010-09-23 08:15:54 +00003290Subclassing QueueListener
3291^^^^^^^^^^^^^^^^^^^^^^^^^
3292
3293You can also subclass :class:`QueueListener` to get messages from other kinds
3294of queues, for example a ZeroMQ "subscribe" socket. Here's an example::
3295
3296 class ZeroMQSocketListener(QueueListener):
3297 def __init__(self, uri, *handlers, **kwargs):
3298 self.ctx = kwargs.get('ctx') or zmq.Context()
3299 socket = zmq.Socket(self.ctx, zmq.SUB)
3300 socket.setsockopt(zmq.SUBSCRIBE, '') # subscribe to everything
3301 socket.connect(uri)
3302
3303 def dequeue(self):
3304 msg = self.queue.recv()
3305 return logging.makeLogRecord(json.loads(msg))
3306
Georg Brandl1eb40bc2010-12-03 15:30:09 +00003307
Christian Heimes8b0facf2007-12-04 19:30:01 +00003308.. _formatter-objects:
3309
Georg Brandl116aa622007-08-15 14:28:22 +00003310Formatter Objects
3311-----------------
3312
Benjamin Peterson75edad02009-01-01 15:05:06 +00003313.. currentmodule:: logging
3314
Georg Brandl116aa622007-08-15 14:28:22 +00003315:class:`Formatter`\ s have the following attributes and methods. They are
3316responsible for converting a :class:`LogRecord` to (usually) a string which can
3317be interpreted by either a human or an external system. The base
3318:class:`Formatter` allows a formatting string to be specified. If none is
3319supplied, the default value of ``'%(message)s'`` is used.
3320
3321A Formatter can be initialized with a format string which makes use of knowledge
3322of the :class:`LogRecord` attributes - such as the default value mentioned above
3323making use of the fact that the user's message and arguments are pre-formatted
3324into a :class:`LogRecord`'s *message* attribute. This format string contains
Ezio Melotti0639d5a2009-12-19 23:26:38 +00003325standard Python %-style mapping keys. See section :ref:`old-string-formatting`
Georg Brandl116aa622007-08-15 14:28:22 +00003326for more information on string formatting.
3327
3328Currently, the useful mapping keys in a :class:`LogRecord` are:
3329
3330+-------------------------+-----------------------------------------------+
3331| Format | Description |
3332+=========================+===============================================+
3333| ``%(name)s`` | Name of the logger (logging channel). |
3334+-------------------------+-----------------------------------------------+
3335| ``%(levelno)s`` | Numeric logging level for the message |
3336| | (:const:`DEBUG`, :const:`INFO`, |
3337| | :const:`WARNING`, :const:`ERROR`, |
3338| | :const:`CRITICAL`). |
3339+-------------------------+-----------------------------------------------+
3340| ``%(levelname)s`` | Text logging level for the message |
3341| | (``'DEBUG'``, ``'INFO'``, ``'WARNING'``, |
3342| | ``'ERROR'``, ``'CRITICAL'``). |
3343+-------------------------+-----------------------------------------------+
3344| ``%(pathname)s`` | Full pathname of the source file where the |
3345| | logging call was issued (if available). |
3346+-------------------------+-----------------------------------------------+
3347| ``%(filename)s`` | Filename portion of pathname. |
3348+-------------------------+-----------------------------------------------+
3349| ``%(module)s`` | Module (name portion of filename). |
3350+-------------------------+-----------------------------------------------+
3351| ``%(funcName)s`` | Name of function containing the logging call. |
3352+-------------------------+-----------------------------------------------+
3353| ``%(lineno)d`` | Source line number where the logging call was |
3354| | issued (if available). |
3355+-------------------------+-----------------------------------------------+
3356| ``%(created)f`` | Time when the :class:`LogRecord` was created |
3357| | (as returned by :func:`time.time`). |
3358+-------------------------+-----------------------------------------------+
3359| ``%(relativeCreated)d`` | Time in milliseconds when the LogRecord was |
3360| | created, relative to the time the logging |
3361| | module was loaded. |
3362+-------------------------+-----------------------------------------------+
3363| ``%(asctime)s`` | Human-readable time when the |
3364| | :class:`LogRecord` was created. By default |
3365| | this is of the form "2003-07-08 16:49:45,896" |
3366| | (the numbers after the comma are millisecond |
3367| | portion of the time). |
3368+-------------------------+-----------------------------------------------+
3369| ``%(msecs)d`` | Millisecond portion of the time when the |
3370| | :class:`LogRecord` was created. |
3371+-------------------------+-----------------------------------------------+
3372| ``%(thread)d`` | Thread ID (if available). |
3373+-------------------------+-----------------------------------------------+
3374| ``%(threadName)s`` | Thread name (if available). |
3375+-------------------------+-----------------------------------------------+
3376| ``%(process)d`` | Process ID (if available). |
3377+-------------------------+-----------------------------------------------+
Vinay Sajip121a1c42010-09-08 10:46:15 +00003378| ``%(processName)s`` | Process name (if available). |
3379+-------------------------+-----------------------------------------------+
Georg Brandl116aa622007-08-15 14:28:22 +00003380| ``%(message)s`` | The logged message, computed as ``msg % |
3381| | args``. |
3382+-------------------------+-----------------------------------------------+
3383
Georg Brandl116aa622007-08-15 14:28:22 +00003384
Georg Brandlcd7f32b2009-06-08 09:13:45 +00003385.. class:: Formatter(fmt=None, datefmt=None)
Georg Brandl116aa622007-08-15 14:28:22 +00003386
Georg Brandlcd7f32b2009-06-08 09:13:45 +00003387 Returns a new instance of the :class:`Formatter` class. The instance is
3388 initialized with a format string for the message as a whole, as well as a
3389 format string for the date/time portion of a message. If no *fmt* is
3390 specified, ``'%(message)s'`` is used. If no *datefmt* is specified, the
3391 ISO8601 date format is used.
Georg Brandl116aa622007-08-15 14:28:22 +00003392
Benjamin Petersone41251e2008-04-25 01:59:09 +00003393 .. method:: format(record)
Georg Brandl116aa622007-08-15 14:28:22 +00003394
Benjamin Petersone41251e2008-04-25 01:59:09 +00003395 The record's attribute dictionary is used as the operand to a string
3396 formatting operation. Returns the resulting string. Before formatting the
3397 dictionary, a couple of preparatory steps are carried out. The *message*
3398 attribute of the record is computed using *msg* % *args*. If the
3399 formatting string contains ``'(asctime)'``, :meth:`formatTime` is called
3400 to format the event time. If there is exception information, it is
3401 formatted using :meth:`formatException` and appended to the message. Note
3402 that the formatted exception information is cached in attribute
3403 *exc_text*. This is useful because the exception information can be
3404 pickled and sent across the wire, but you should be careful if you have
3405 more than one :class:`Formatter` subclass which customizes the formatting
3406 of exception information. In this case, you will have to clear the cached
3407 value after a formatter has done its formatting, so that the next
3408 formatter to handle the event doesn't use the cached value but
3409 recalculates it afresh.
Georg Brandl116aa622007-08-15 14:28:22 +00003410
Vinay Sajip8593ae62010-11-14 21:33:04 +00003411 If stack information is available, it's appended after the exception
3412 information, using :meth:`formatStack` to transform it if necessary.
3413
Georg Brandl116aa622007-08-15 14:28:22 +00003414
Georg Brandlcd7f32b2009-06-08 09:13:45 +00003415 .. method:: formatTime(record, datefmt=None)
Georg Brandl116aa622007-08-15 14:28:22 +00003416
Benjamin Petersone41251e2008-04-25 01:59:09 +00003417 This method should be called from :meth:`format` by a formatter which
3418 wants to make use of a formatted time. This method can be overridden in
3419 formatters to provide for any specific requirement, but the basic behavior
3420 is as follows: if *datefmt* (a string) is specified, it is used with
3421 :func:`time.strftime` to format the creation time of the
3422 record. Otherwise, the ISO8601 format is used. The resulting string is
3423 returned.
Georg Brandl116aa622007-08-15 14:28:22 +00003424
3425
Benjamin Petersone41251e2008-04-25 01:59:09 +00003426 .. method:: formatException(exc_info)
Georg Brandl116aa622007-08-15 14:28:22 +00003427
Benjamin Petersone41251e2008-04-25 01:59:09 +00003428 Formats the specified exception information (a standard exception tuple as
3429 returned by :func:`sys.exc_info`) as a string. This default implementation
3430 just uses :func:`traceback.print_exception`. The resulting string is
3431 returned.
Georg Brandl116aa622007-08-15 14:28:22 +00003432
Vinay Sajip8593ae62010-11-14 21:33:04 +00003433 .. method:: formatStack(stack_info)
3434
3435 Formats the specified stack information (a string as returned by
3436 :func:`traceback.print_stack`, but with the last newline removed) as a
3437 string. This default implementation just returns the input value.
3438
Vinay Sajipd31f3632010-06-29 15:31:15 +00003439.. _filter:
Georg Brandl116aa622007-08-15 14:28:22 +00003440
3441Filter Objects
3442--------------
3443
Georg Brandl5c66bca2010-10-29 05:36:28 +00003444``Filters`` can be used by ``Handlers`` and ``Loggers`` for more sophisticated
Vinay Sajipfc082ca2010-10-19 21:13:49 +00003445filtering than is provided by levels. The base filter class only allows events
3446which are below a certain point in the logger hierarchy. For example, a filter
3447initialized with "A.B" will allow events logged by loggers "A.B", "A.B.C",
3448"A.B.C.D", "A.B.D" etc. but not "A.BB", "B.A.B" etc. If initialized with the
3449empty string, all events are passed.
Georg Brandl116aa622007-08-15 14:28:22 +00003450
3451
Georg Brandlcd7f32b2009-06-08 09:13:45 +00003452.. class:: Filter(name='')
Georg Brandl116aa622007-08-15 14:28:22 +00003453
3454 Returns an instance of the :class:`Filter` class. If *name* is specified, it
3455 names a logger which, together with its children, will have its events allowed
Georg Brandlcd7f32b2009-06-08 09:13:45 +00003456 through the filter. If *name* is the empty string, allows every event.
Georg Brandl116aa622007-08-15 14:28:22 +00003457
3458
Benjamin Petersone41251e2008-04-25 01:59:09 +00003459 .. method:: filter(record)
Georg Brandl116aa622007-08-15 14:28:22 +00003460
Benjamin Petersone41251e2008-04-25 01:59:09 +00003461 Is the specified record to be logged? Returns zero for no, nonzero for
3462 yes. If deemed appropriate, the record may be modified in-place by this
3463 method.
Georg Brandl116aa622007-08-15 14:28:22 +00003464
Vinay Sajip81010212010-08-19 19:17:41 +00003465Note that filters attached to handlers are consulted whenever an event is
3466emitted by the handler, whereas filters attached to loggers are consulted
3467whenever an event is logged to the handler (using :meth:`debug`, :meth:`info`,
3468etc.) This means that events which have been generated by descendant loggers
3469will not be filtered by a logger's filter setting, unless the filter has also
3470been applied to those descendant loggers.
3471
Vinay Sajip22246fd2010-10-20 11:40:02 +00003472You don't actually need to subclass ``Filter``: you can pass any instance
3473which has a ``filter`` method with the same semantics.
3474
Vinay Sajipfc082ca2010-10-19 21:13:49 +00003475.. versionchanged:: 3.2
Vinay Sajip05ed6952010-10-20 20:34:09 +00003476 You don't need to create specialized ``Filter`` classes, or use other
3477 classes with a ``filter`` method: you can use a function (or other
3478 callable) as a filter. The filtering logic will check to see if the filter
3479 object has a ``filter`` attribute: if it does, it's assumed to be a
3480 ``Filter`` and its :meth:`~Filter.filter` method is called. Otherwise, it's
3481 assumed to be a callable and called with the record as the single
3482 parameter. The returned value should conform to that returned by
3483 :meth:`~Filter.filter`.
Vinay Sajipfc082ca2010-10-19 21:13:49 +00003484
Vinay Sajipac007992010-09-17 12:45:26 +00003485Other uses for filters
3486^^^^^^^^^^^^^^^^^^^^^^
3487
3488Although filters are used primarily to filter records based on more
3489sophisticated criteria than levels, they get to see every record which is
3490processed by the handler or logger they're attached to: this can be useful if
3491you want to do things like counting how many records were processed by a
3492particular logger or handler, or adding, changing or removing attributes in
3493the LogRecord being processed. Obviously changing the LogRecord needs to be
3494done with some care, but it does allow the injection of contextual information
3495into logs (see :ref:`filters-contextual`).
3496
Vinay Sajipd31f3632010-06-29 15:31:15 +00003497.. _log-record:
Georg Brandl116aa622007-08-15 14:28:22 +00003498
3499LogRecord Objects
3500-----------------
3501
Vinay Sajip4039aff2010-09-11 10:25:28 +00003502:class:`LogRecord` instances are created automatically by the :class:`Logger`
3503every time something is logged, and can be created manually via
3504:func:`makeLogRecord` (for example, from a pickled event received over the
3505wire).
Georg Brandl116aa622007-08-15 14:28:22 +00003506
3507
Vinay Sajipa18b9592010-12-12 13:20:55 +00003508.. class:: LogRecord(name, levelno, pathname, lineno, msg, args, exc_info, func=None, sinfo=None)
Georg Brandl116aa622007-08-15 14:28:22 +00003509
Vinay Sajip4039aff2010-09-11 10:25:28 +00003510 Contains all the information pertinent to the event being logged.
Georg Brandl116aa622007-08-15 14:28:22 +00003511
Vinay Sajip4039aff2010-09-11 10:25:28 +00003512 The primary information is passed in :attr:`msg` and :attr:`args`, which
3513 are combined using ``msg % args`` to create the :attr:`message` field of the
3514 record.
3515
3516 .. attribute:: args
3517
3518 Tuple of arguments to be used in formatting :attr:`msg`.
3519
3520 .. attribute:: exc_info
3521
Senthil Kumaran46a48be2010-10-15 13:10:10 +00003522 Exception tuple (à la :func:`sys.exc_info`) or ``None`` if no exception
Georg Brandl6faee4e2010-09-21 14:48:28 +00003523 information is available.
Vinay Sajip4039aff2010-09-11 10:25:28 +00003524
3525 .. attribute:: func
3526
3527 Name of the function of origin (i.e. in which the logging call was made).
3528
3529 .. attribute:: lineno
3530
3531 Line number in the source file of origin.
3532
Vinay Sajipa18b9592010-12-12 13:20:55 +00003533 .. attribute:: levelno
Vinay Sajip4039aff2010-09-11 10:25:28 +00003534
3535 Numeric logging level.
3536
3537 .. attribute:: message
3538
3539 Bound to the result of :meth:`getMessage` when
3540 :meth:`Formatter.format(record)<Formatter.format>` is invoked.
3541
3542 .. attribute:: msg
3543
3544 User-supplied :ref:`format string<string-formatting>` or arbitrary object
3545 (see :ref:`arbitrary-object-messages`) used in :meth:`getMessage`.
3546
3547 .. attribute:: name
3548
3549 Name of the logger that emitted the record.
3550
3551 .. attribute:: pathname
3552
3553 Absolute pathname of the source file of origin.
Georg Brandl116aa622007-08-15 14:28:22 +00003554
Vinay Sajip8593ae62010-11-14 21:33:04 +00003555 .. attribute:: stack_info
3556
3557 Stack frame information (where available) from the bottom of the stack
3558 in the current thread, up to and including the stack frame of the
3559 logging call which resulted in the creation of this record.
3560
Benjamin Petersone41251e2008-04-25 01:59:09 +00003561 .. method:: getMessage()
Georg Brandl116aa622007-08-15 14:28:22 +00003562
Benjamin Petersone41251e2008-04-25 01:59:09 +00003563 Returns the message for this :class:`LogRecord` instance after merging any
Vinay Sajip4039aff2010-09-11 10:25:28 +00003564 user-supplied arguments with the message. If the user-supplied message
3565 argument to the logging call is not a string, :func:`str` is called on it to
3566 convert it to a string. This allows use of user-defined classes as
3567 messages, whose ``__str__`` method can return the actual format string to
3568 be used.
3569
Vinay Sajip61561522010-12-03 11:50:38 +00003570 .. versionchanged:: 3.2
3571 The creation of a ``LogRecord`` has been made more configurable by
3572 providing a factory which is used to create the record. The factory can be
3573 set using :func:`getLogRecordFactory` and :func:`setLogRecordFactory`
3574 (see this for the factory's signature).
3575
Georg Brandl1eb40bc2010-12-03 15:30:09 +00003576 This functionality can be used to inject your own values into a
3577 LogRecord at creation time. You can use the following pattern::
Vinay Sajip61561522010-12-03 11:50:38 +00003578
Georg Brandl1eb40bc2010-12-03 15:30:09 +00003579 old_factory = logging.getLogRecordFactory()
Vinay Sajip61561522010-12-03 11:50:38 +00003580
Georg Brandl1eb40bc2010-12-03 15:30:09 +00003581 def record_factory(*args, **kwargs):
3582 record = old_factory(*args, **kwargs)
3583 record.custom_attribute = 0xdecafbad
3584 return record
Vinay Sajip61561522010-12-03 11:50:38 +00003585
Georg Brandl1eb40bc2010-12-03 15:30:09 +00003586 logging.setLogRecordFactory(record_factory)
Vinay Sajip61561522010-12-03 11:50:38 +00003587
Georg Brandl1eb40bc2010-12-03 15:30:09 +00003588 With this pattern, multiple factories could be chained, and as long
3589 as they don't overwrite each other's attributes or unintentionally
3590 overwrite the standard attributes listed above, there should be no
3591 surprises.
3592
Vinay Sajip61561522010-12-03 11:50:38 +00003593
Vinay Sajipd31f3632010-06-29 15:31:15 +00003594.. _logger-adapter:
Georg Brandl116aa622007-08-15 14:28:22 +00003595
Christian Heimes04c420f2008-01-18 18:40:46 +00003596LoggerAdapter Objects
3597---------------------
3598
Christian Heimes04c420f2008-01-18 18:40:46 +00003599:class:`LoggerAdapter` instances are used to conveniently pass contextual
Georg Brandl86def6c2008-01-21 20:36:10 +00003600information into logging calls. For a usage example , see the section on
Georg Brandl1eb40bc2010-12-03 15:30:09 +00003601:ref:`adding contextual information to your logging output <context-info>`.
Georg Brandl86def6c2008-01-21 20:36:10 +00003602
Christian Heimes04c420f2008-01-18 18:40:46 +00003603
3604.. class:: LoggerAdapter(logger, extra)
3605
Georg Brandl1eb40bc2010-12-03 15:30:09 +00003606 Returns an instance of :class:`LoggerAdapter` initialized with an
3607 underlying :class:`Logger` instance and a dict-like object.
Christian Heimes04c420f2008-01-18 18:40:46 +00003608
Georg Brandl1eb40bc2010-12-03 15:30:09 +00003609 .. method:: process(msg, kwargs)
Christian Heimes04c420f2008-01-18 18:40:46 +00003610
Georg Brandl1eb40bc2010-12-03 15:30:09 +00003611 Modifies the message and/or keyword arguments passed to a logging call in
3612 order to insert contextual information. This implementation takes the object
3613 passed as *extra* to the constructor and adds it to *kwargs* using key
3614 'extra'. The return value is a (*msg*, *kwargs*) tuple which has the
3615 (possibly modified) versions of the arguments passed in.
Christian Heimes04c420f2008-01-18 18:40:46 +00003616
Vinay Sajipc84f0162010-09-21 11:25:39 +00003617In addition to the above, :class:`LoggerAdapter` supports the following
Christian Heimes04c420f2008-01-18 18:40:46 +00003618methods of :class:`Logger`, i.e. :meth:`debug`, :meth:`info`, :meth:`warning`,
Vinay Sajipc84f0162010-09-21 11:25:39 +00003619:meth:`error`, :meth:`exception`, :meth:`critical`, :meth:`log`,
3620:meth:`isEnabledFor`, :meth:`getEffectiveLevel`, :meth:`setLevel`,
3621:meth:`hasHandlers`. These methods have the same signatures as their
3622counterparts in :class:`Logger`, so you can use the two types of instances
3623interchangeably.
Christian Heimes04c420f2008-01-18 18:40:46 +00003624
Ezio Melotti4d5195b2010-04-20 10:57:44 +00003625.. versionchanged:: 3.2
Vinay Sajipc84f0162010-09-21 11:25:39 +00003626 The :meth:`isEnabledFor`, :meth:`getEffectiveLevel`, :meth:`setLevel` and
3627 :meth:`hasHandlers` methods were added to :class:`LoggerAdapter`. These
3628 methods delegate to the underlying logger.
Benjamin Peterson22005fc2010-04-11 16:25:06 +00003629
Georg Brandl116aa622007-08-15 14:28:22 +00003630
3631Thread Safety
3632-------------
3633
3634The logging module is intended to be thread-safe without any special work
3635needing to be done by its clients. It achieves this though using threading
3636locks; there is one lock to serialize access to the module's shared data, and
3637each handler also creates a lock to serialize access to its underlying I/O.
3638
Benjamin Petersond23f8222009-04-05 19:13:16 +00003639If you are implementing asynchronous signal handlers using the :mod:`signal`
3640module, you may not be able to use logging from within such handlers. This is
3641because lock implementations in the :mod:`threading` module are not always
3642re-entrant, and so cannot be invoked from such signal handlers.
Georg Brandl116aa622007-08-15 14:28:22 +00003643
Benjamin Peterson9451a1c2010-03-13 22:30:34 +00003644
3645Integration with the warnings module
3646------------------------------------
3647
3648The :func:`captureWarnings` function can be used to integrate :mod:`logging`
3649with the :mod:`warnings` module.
3650
3651.. function:: captureWarnings(capture)
3652
3653 This function is used to turn the capture of warnings by logging on and
3654 off.
3655
Senthil Kumaran46a48be2010-10-15 13:10:10 +00003656 If *capture* is ``True``, warnings issued by the :mod:`warnings` module will
3657 be redirected to the logging system. Specifically, a warning will be
Benjamin Peterson9451a1c2010-03-13 22:30:34 +00003658 formatted using :func:`warnings.formatwarning` and the resulting string
3659 logged to a logger named "py.warnings" with a severity of `WARNING`.
3660
Senthil Kumaran46a48be2010-10-15 13:10:10 +00003661 If *capture* is ``False``, the redirection of warnings to the logging system
Benjamin Peterson9451a1c2010-03-13 22:30:34 +00003662 will stop, and warnings will be redirected to their original destinations
3663 (i.e. those in effect before `captureWarnings(True)` was called).
3664
3665
Georg Brandl116aa622007-08-15 14:28:22 +00003666Configuration
3667-------------
3668
3669
3670.. _logging-config-api:
3671
3672Configuration functions
3673^^^^^^^^^^^^^^^^^^^^^^^
3674
Georg Brandl116aa622007-08-15 14:28:22 +00003675The following functions configure the logging module. They are located in the
3676:mod:`logging.config` module. Their use is optional --- you can configure the
3677logging module using these functions or by making calls to the main API (defined
3678in :mod:`logging` itself) and defining handlers which are declared either in
3679:mod:`logging` or :mod:`logging.handlers`.
3680
Benjamin Petersond7c3ed52010-06-27 22:32:30 +00003681.. function:: dictConfig(config)
Georg Brandl116aa622007-08-15 14:28:22 +00003682
Benjamin Petersond7c3ed52010-06-27 22:32:30 +00003683 Takes the logging configuration from a dictionary. The contents of
3684 this dictionary are described in :ref:`logging-config-dictschema`
3685 below.
3686
3687 If an error is encountered during configuration, this function will
3688 raise a :exc:`ValueError`, :exc:`TypeError`, :exc:`AttributeError`
3689 or :exc:`ImportError` with a suitably descriptive message. The
3690 following is a (possibly incomplete) list of conditions which will
3691 raise an error:
3692
3693 * A ``level`` which is not a string or which is a string not
3694 corresponding to an actual logging level.
3695 * A ``propagate`` value which is not a boolean.
3696 * An id which does not have a corresponding destination.
3697 * A non-existent handler id found during an incremental call.
3698 * An invalid logger name.
3699 * Inability to resolve to an internal or external object.
3700
3701 Parsing is performed by the :class:`DictConfigurator` class, whose
3702 constructor is passed the dictionary used for configuration, and
3703 has a :meth:`configure` method. The :mod:`logging.config` module
3704 has a callable attribute :attr:`dictConfigClass`
3705 which is initially set to :class:`DictConfigurator`.
3706 You can replace the value of :attr:`dictConfigClass` with a
3707 suitable implementation of your own.
3708
3709 :func:`dictConfig` calls :attr:`dictConfigClass` passing
3710 the specified dictionary, and then calls the :meth:`configure` method on
3711 the returned object to put the configuration into effect::
3712
3713 def dictConfig(config):
3714 dictConfigClass(config).configure()
3715
3716 For example, a subclass of :class:`DictConfigurator` could call
3717 ``DictConfigurator.__init__()`` in its own :meth:`__init__()`, then
3718 set up custom prefixes which would be usable in the subsequent
3719 :meth:`configure` call. :attr:`dictConfigClass` would be bound to
3720 this new subclass, and then :func:`dictConfig` could be called exactly as
3721 in the default, uncustomized state.
3722
3723.. function:: fileConfig(fname[, defaults])
Georg Brandl116aa622007-08-15 14:28:22 +00003724
Alexandre Vassalotti1d1eaa42008-05-14 22:59:42 +00003725 Reads the logging configuration from a :mod:`configparser`\-format file named
Benjamin Peterson960cf0f2009-01-09 04:11:44 +00003726 *fname*. This function can be called several times from an application,
Benjamin Petersond7c3ed52010-06-27 22:32:30 +00003727 allowing an end user to select from various pre-canned
Alexandre Vassalotti1d1eaa42008-05-14 22:59:42 +00003728 configurations (if the developer provides a mechanism to present the choices
3729 and load the chosen configuration). Defaults to be passed to the ConfigParser
3730 can be specified in the *defaults* argument.
Georg Brandl116aa622007-08-15 14:28:22 +00003731
Georg Brandlcd7f32b2009-06-08 09:13:45 +00003732
3733.. function:: listen(port=DEFAULT_LOGGING_CONFIG_PORT)
Georg Brandl116aa622007-08-15 14:28:22 +00003734
3735 Starts up a socket server on the specified port, and listens for new
3736 configurations. If no port is specified, the module's default
3737 :const:`DEFAULT_LOGGING_CONFIG_PORT` is used. Logging configurations will be
3738 sent as a file suitable for processing by :func:`fileConfig`. Returns a
3739 :class:`Thread` instance on which you can call :meth:`start` to start the
3740 server, and which you can :meth:`join` when appropriate. To stop the server,
Christian Heimes8b0facf2007-12-04 19:30:01 +00003741 call :func:`stopListening`.
3742
3743 To send a configuration to the socket, read in the configuration file and
3744 send it to the socket as a string of bytes preceded by a four-byte length
3745 string packed in binary using ``struct.pack('>L', n)``.
Georg Brandl116aa622007-08-15 14:28:22 +00003746
3747
3748.. function:: stopListening()
3749
Christian Heimes8b0facf2007-12-04 19:30:01 +00003750 Stops the listening server which was created with a call to :func:`listen`.
3751 This is typically called before calling :meth:`join` on the return value from
Georg Brandl116aa622007-08-15 14:28:22 +00003752 :func:`listen`.
3753
3754
Benjamin Petersond7c3ed52010-06-27 22:32:30 +00003755.. _logging-config-dictschema:
3756
3757Configuration dictionary schema
3758^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
3759
3760Describing a logging configuration requires listing the various
3761objects to create and the connections between them; for example, you
3762may create a handler named "console" and then say that the logger
3763named "startup" will send its messages to the "console" handler.
3764These objects aren't limited to those provided by the :mod:`logging`
3765module because you might write your own formatter or handler class.
3766The parameters to these classes may also need to include external
3767objects such as ``sys.stderr``. The syntax for describing these
3768objects and connections is defined in :ref:`logging-config-dict-connections`
3769below.
3770
3771Dictionary Schema Details
3772"""""""""""""""""""""""""
3773
3774The dictionary passed to :func:`dictConfig` must contain the following
3775keys:
3776
Senthil Kumaran46a48be2010-10-15 13:10:10 +00003777* *version* - to be set to an integer value representing the schema
Benjamin Petersond7c3ed52010-06-27 22:32:30 +00003778 version. The only valid value at present is 1, but having this key
3779 allows the schema to evolve while still preserving backwards
3780 compatibility.
3781
3782All other keys are optional, but if present they will be interpreted
3783as described below. In all cases below where a 'configuring dict' is
3784mentioned, it will be checked for the special ``'()'`` key to see if a
3785custom instantiation is required. If so, the mechanism described in
3786:ref:`logging-config-dict-userdef` below is used to create an instance;
3787otherwise, the context is used to determine what to instantiate.
3788
Senthil Kumaran46a48be2010-10-15 13:10:10 +00003789* *formatters* - the corresponding value will be a dict in which each
Benjamin Petersond7c3ed52010-06-27 22:32:30 +00003790 key is a formatter id and each value is a dict describing how to
3791 configure the corresponding Formatter instance.
3792
3793 The configuring dict is searched for keys ``format`` and ``datefmt``
3794 (with defaults of ``None``) and these are used to construct a
3795 :class:`logging.Formatter` instance.
3796
Senthil Kumaran46a48be2010-10-15 13:10:10 +00003797* *filters* - the corresponding value will be a dict in which each key
Benjamin Petersond7c3ed52010-06-27 22:32:30 +00003798 is a filter id and each value is a dict describing how to configure
3799 the corresponding Filter instance.
3800
3801 The configuring dict is searched for the key ``name`` (defaulting to the
3802 empty string) and this is used to construct a :class:`logging.Filter`
3803 instance.
3804
Senthil Kumaran46a48be2010-10-15 13:10:10 +00003805* *handlers* - the corresponding value will be a dict in which each
Benjamin Petersond7c3ed52010-06-27 22:32:30 +00003806 key is a handler id and each value is a dict describing how to
3807 configure the corresponding Handler instance.
3808
3809 The configuring dict is searched for the following keys:
3810
3811 * ``class`` (mandatory). This is the fully qualified name of the
3812 handler class.
3813
3814 * ``level`` (optional). The level of the handler.
3815
3816 * ``formatter`` (optional). The id of the formatter for this
3817 handler.
3818
3819 * ``filters`` (optional). A list of ids of the filters for this
3820 handler.
3821
3822 All *other* keys are passed through as keyword arguments to the
3823 handler's constructor. For example, given the snippet::
3824
3825 handlers:
3826 console:
3827 class : logging.StreamHandler
3828 formatter: brief
3829 level : INFO
3830 filters: [allow_foo]
3831 stream : ext://sys.stdout
3832 file:
3833 class : logging.handlers.RotatingFileHandler
3834 formatter: precise
3835 filename: logconfig.log
3836 maxBytes: 1024
3837 backupCount: 3
3838
3839 the handler with id ``console`` is instantiated as a
3840 :class:`logging.StreamHandler`, using ``sys.stdout`` as the underlying
3841 stream. The handler with id ``file`` is instantiated as a
3842 :class:`logging.handlers.RotatingFileHandler` with the keyword arguments
3843 ``filename='logconfig.log', maxBytes=1024, backupCount=3``.
3844
Senthil Kumaran46a48be2010-10-15 13:10:10 +00003845* *loggers* - the corresponding value will be a dict in which each key
Benjamin Petersond7c3ed52010-06-27 22:32:30 +00003846 is a logger name and each value is a dict describing how to
3847 configure the corresponding Logger instance.
3848
3849 The configuring dict is searched for the following keys:
3850
3851 * ``level`` (optional). The level of the logger.
3852
3853 * ``propagate`` (optional). The propagation setting of the logger.
3854
3855 * ``filters`` (optional). A list of ids of the filters for this
3856 logger.
3857
3858 * ``handlers`` (optional). A list of ids of the handlers for this
3859 logger.
3860
3861 The specified loggers will be configured according to the level,
3862 propagation, filters and handlers specified.
3863
Senthil Kumaran46a48be2010-10-15 13:10:10 +00003864* *root* - this will be the configuration for the root logger.
Benjamin Petersond7c3ed52010-06-27 22:32:30 +00003865 Processing of the configuration will be as for any logger, except
3866 that the ``propagate`` setting will not be applicable.
3867
Senthil Kumaran46a48be2010-10-15 13:10:10 +00003868* *incremental* - whether the configuration is to be interpreted as
Benjamin Petersond7c3ed52010-06-27 22:32:30 +00003869 incremental to the existing configuration. This value defaults to
3870 ``False``, which means that the specified configuration replaces the
3871 existing configuration with the same semantics as used by the
3872 existing :func:`fileConfig` API.
3873
3874 If the specified value is ``True``, the configuration is processed
3875 as described in the section on :ref:`logging-config-dict-incremental`.
3876
Senthil Kumaran46a48be2010-10-15 13:10:10 +00003877* *disable_existing_loggers* - whether any existing loggers are to be
Benjamin Petersond7c3ed52010-06-27 22:32:30 +00003878 disabled. This setting mirrors the parameter of the same name in
3879 :func:`fileConfig`. If absent, this parameter defaults to ``True``.
Senthil Kumaran46a48be2010-10-15 13:10:10 +00003880 This value is ignored if *incremental* is ``True``.
Benjamin Petersond7c3ed52010-06-27 22:32:30 +00003881
3882.. _logging-config-dict-incremental:
3883
3884Incremental Configuration
3885"""""""""""""""""""""""""
3886
3887It is difficult to provide complete flexibility for incremental
3888configuration. For example, because objects such as filters
3889and formatters are anonymous, once a configuration is set up, it is
3890not possible to refer to such anonymous objects when augmenting a
3891configuration.
3892
3893Furthermore, there is not a compelling case for arbitrarily altering
3894the object graph of loggers, handlers, filters, formatters at
3895run-time, once a configuration is set up; the verbosity of loggers and
3896handlers can be controlled just by setting levels (and, in the case of
3897loggers, propagation flags). Changing the object graph arbitrarily in
3898a safe way is problematic in a multi-threaded environment; while not
3899impossible, the benefits are not worth the complexity it adds to the
3900implementation.
3901
3902Thus, when the ``incremental`` key of a configuration dict is present
3903and is ``True``, the system will completely ignore any ``formatters`` and
3904``filters`` entries, and process only the ``level``
3905settings in the ``handlers`` entries, and the ``level`` and
3906``propagate`` settings in the ``loggers`` and ``root`` entries.
3907
3908Using a value in the configuration dict lets configurations to be sent
3909over the wire as pickled dicts to a socket listener. Thus, the logging
3910verbosity of a long-running application can be altered over time with
3911no need to stop and restart the application.
3912
3913.. _logging-config-dict-connections:
3914
3915Object connections
3916""""""""""""""""""
3917
3918The schema describes a set of logging objects - loggers,
3919handlers, formatters, filters - which are connected to each other in
3920an object graph. Thus, the schema needs to represent connections
3921between the objects. For example, say that, once configured, a
3922particular logger has attached to it a particular handler. For the
3923purposes of this discussion, we can say that the logger represents the
3924source, and the handler the destination, of a connection between the
3925two. Of course in the configured objects this is represented by the
3926logger holding a reference to the handler. In the configuration dict,
3927this is done by giving each destination object an id which identifies
3928it unambiguously, and then using the id in the source object's
3929configuration to indicate that a connection exists between the source
3930and the destination object with that id.
3931
3932So, for example, consider the following YAML snippet::
3933
3934 formatters:
3935 brief:
3936 # configuration for formatter with id 'brief' goes here
3937 precise:
3938 # configuration for formatter with id 'precise' goes here
3939 handlers:
3940 h1: #This is an id
3941 # configuration of handler with id 'h1' goes here
3942 formatter: brief
3943 h2: #This is another id
3944 # configuration of handler with id 'h2' goes here
3945 formatter: precise
3946 loggers:
3947 foo.bar.baz:
3948 # other configuration for logger 'foo.bar.baz'
3949 handlers: [h1, h2]
3950
3951(Note: YAML used here because it's a little more readable than the
3952equivalent Python source form for the dictionary.)
3953
3954The ids for loggers are the logger names which would be used
3955programmatically to obtain a reference to those loggers, e.g.
3956``foo.bar.baz``. The ids for Formatters and Filters can be any string
3957value (such as ``brief``, ``precise`` above) and they are transient,
3958in that they are only meaningful for processing the configuration
3959dictionary and used to determine connections between objects, and are
3960not persisted anywhere when the configuration call is complete.
3961
3962The above snippet indicates that logger named ``foo.bar.baz`` should
3963have two handlers attached to it, which are described by the handler
3964ids ``h1`` and ``h2``. The formatter for ``h1`` is that described by id
3965``brief``, and the formatter for ``h2`` is that described by id
3966``precise``.
3967
3968
3969.. _logging-config-dict-userdef:
3970
3971User-defined objects
3972""""""""""""""""""""
3973
3974The schema supports user-defined objects for handlers, filters and
3975formatters. (Loggers do not need to have different types for
3976different instances, so there is no support in this configuration
3977schema for user-defined logger classes.)
3978
3979Objects to be configured are described by dictionaries
3980which detail their configuration. In some places, the logging system
3981will be able to infer from the context how an object is to be
3982instantiated, but when a user-defined object is to be instantiated,
3983the system will not know how to do this. In order to provide complete
3984flexibility for user-defined object instantiation, the user needs
3985to provide a 'factory' - a callable which is called with a
3986configuration dictionary and which returns the instantiated object.
3987This is signalled by an absolute import path to the factory being
3988made available under the special key ``'()'``. Here's a concrete
3989example::
3990
3991 formatters:
3992 brief:
3993 format: '%(message)s'
3994 default:
3995 format: '%(asctime)s %(levelname)-8s %(name)-15s %(message)s'
3996 datefmt: '%Y-%m-%d %H:%M:%S'
3997 custom:
3998 (): my.package.customFormatterFactory
3999 bar: baz
4000 spam: 99.9
4001 answer: 42
4002
4003The above YAML snippet defines three formatters. The first, with id
4004``brief``, is a standard :class:`logging.Formatter` instance with the
4005specified format string. The second, with id ``default``, has a
4006longer format and also defines the time format explicitly, and will
4007result in a :class:`logging.Formatter` initialized with those two format
4008strings. Shown in Python source form, the ``brief`` and ``default``
4009formatters have configuration sub-dictionaries::
4010
4011 {
4012 'format' : '%(message)s'
4013 }
4014
4015and::
4016
4017 {
4018 'format' : '%(asctime)s %(levelname)-8s %(name)-15s %(message)s',
4019 'datefmt' : '%Y-%m-%d %H:%M:%S'
4020 }
4021
4022respectively, and as these dictionaries do not contain the special key
4023``'()'``, the instantiation is inferred from the context: as a result,
4024standard :class:`logging.Formatter` instances are created. The
4025configuration sub-dictionary for the third formatter, with id
4026``custom``, is::
4027
4028 {
4029 '()' : 'my.package.customFormatterFactory',
4030 'bar' : 'baz',
4031 'spam' : 99.9,
4032 'answer' : 42
4033 }
4034
4035and this contains the special key ``'()'``, which means that
4036user-defined instantiation is wanted. In this case, the specified
4037factory callable will be used. If it is an actual callable it will be
4038used directly - otherwise, if you specify a string (as in the example)
4039the actual callable will be located using normal import mechanisms.
4040The callable will be called with the **remaining** items in the
4041configuration sub-dictionary as keyword arguments. In the above
4042example, the formatter with id ``custom`` will be assumed to be
4043returned by the call::
4044
4045 my.package.customFormatterFactory(bar='baz', spam=99.9, answer=42)
4046
4047The key ``'()'`` has been used as the special key because it is not a
4048valid keyword parameter name, and so will not clash with the names of
4049the keyword arguments used in the call. The ``'()'`` also serves as a
4050mnemonic that the corresponding value is a callable.
4051
4052
4053.. _logging-config-dict-externalobj:
4054
4055Access to external objects
4056""""""""""""""""""""""""""
4057
4058There are times where a configuration needs to refer to objects
4059external to the configuration, for example ``sys.stderr``. If the
4060configuration dict is constructed using Python code, this is
4061straightforward, but a problem arises when the configuration is
4062provided via a text file (e.g. JSON, YAML). In a text file, there is
4063no standard way to distinguish ``sys.stderr`` from the literal string
4064``'sys.stderr'``. To facilitate this distinction, the configuration
4065system looks for certain special prefixes in string values and
4066treat them specially. For example, if the literal string
4067``'ext://sys.stderr'`` is provided as a value in the configuration,
4068then the ``ext://`` will be stripped off and the remainder of the
4069value processed using normal import mechanisms.
4070
4071The handling of such prefixes is done in a way analogous to protocol
4072handling: there is a generic mechanism to look for prefixes which
4073match the regular expression ``^(?P<prefix>[a-z]+)://(?P<suffix>.*)$``
4074whereby, if the ``prefix`` is recognised, the ``suffix`` is processed
4075in a prefix-dependent manner and the result of the processing replaces
4076the string value. If the prefix is not recognised, then the string
4077value will be left as-is.
4078
4079
4080.. _logging-config-dict-internalobj:
4081
4082Access to internal objects
4083""""""""""""""""""""""""""
4084
4085As well as external objects, there is sometimes also a need to refer
4086to objects in the configuration. This will be done implicitly by the
4087configuration system for things that it knows about. For example, the
4088string value ``'DEBUG'`` for a ``level`` in a logger or handler will
4089automatically be converted to the value ``logging.DEBUG``, and the
4090``handlers``, ``filters`` and ``formatter`` entries will take an
4091object id and resolve to the appropriate destination object.
4092
4093However, a more generic mechanism is needed for user-defined
4094objects which are not known to the :mod:`logging` module. For
4095example, consider :class:`logging.handlers.MemoryHandler`, which takes
4096a ``target`` argument which is another handler to delegate to. Since
4097the system already knows about this class, then in the configuration,
4098the given ``target`` just needs to be the object id of the relevant
4099target handler, and the system will resolve to the handler from the
4100id. If, however, a user defines a ``my.package.MyHandler`` which has
4101an ``alternate`` handler, the configuration system would not know that
4102the ``alternate`` referred to a handler. To cater for this, a generic
4103resolution system allows the user to specify::
4104
4105 handlers:
4106 file:
4107 # configuration of file handler goes here
4108
4109 custom:
4110 (): my.package.MyHandler
4111 alternate: cfg://handlers.file
4112
4113The literal string ``'cfg://handlers.file'`` will be resolved in an
4114analogous way to strings with the ``ext://`` prefix, but looking
4115in the configuration itself rather than the import namespace. The
4116mechanism allows access by dot or by index, in a similar way to
4117that provided by ``str.format``. Thus, given the following snippet::
4118
4119 handlers:
4120 email:
4121 class: logging.handlers.SMTPHandler
4122 mailhost: localhost
4123 fromaddr: my_app@domain.tld
4124 toaddrs:
4125 - support_team@domain.tld
4126 - dev_team@domain.tld
4127 subject: Houston, we have a problem.
4128
4129in the configuration, the string ``'cfg://handlers'`` would resolve to
4130the dict with key ``handlers``, the string ``'cfg://handlers.email``
4131would resolve to the dict with key ``email`` in the ``handlers`` dict,
4132and so on. The string ``'cfg://handlers.email.toaddrs[1]`` would
4133resolve to ``'dev_team.domain.tld'`` and the string
4134``'cfg://handlers.email.toaddrs[0]'`` would resolve to the value
4135``'support_team@domain.tld'``. The ``subject`` value could be accessed
4136using either ``'cfg://handlers.email.subject'`` or, equivalently,
4137``'cfg://handlers.email[subject]'``. The latter form only needs to be
4138used if the key contains spaces or non-alphanumeric characters. If an
4139index value consists only of decimal digits, access will be attempted
4140using the corresponding integer value, falling back to the string
4141value if needed.
4142
4143Given a string ``cfg://handlers.myhandler.mykey.123``, this will
4144resolve to ``config_dict['handlers']['myhandler']['mykey']['123']``.
4145If the string is specified as ``cfg://handlers.myhandler.mykey[123]``,
4146the system will attempt to retrieve the value from
4147``config_dict['handlers']['myhandler']['mykey'][123]``, and fall back
4148to ``config_dict['handlers']['myhandler']['mykey']['123']`` if that
4149fails.
4150
Georg Brandl116aa622007-08-15 14:28:22 +00004151.. _logging-config-fileformat:
4152
4153Configuration file format
4154^^^^^^^^^^^^^^^^^^^^^^^^^
4155
Benjamin Peterson960cf0f2009-01-09 04:11:44 +00004156The configuration file format understood by :func:`fileConfig` is based on
4157:mod:`configparser` functionality. The file must contain sections called
4158``[loggers]``, ``[handlers]`` and ``[formatters]`` which identify by name the
4159entities of each type which are defined in the file. For each such entity, there
4160is a separate section which identifies how that entity is configured. Thus, for
4161a logger named ``log01`` in the ``[loggers]`` section, the relevant
4162configuration details are held in a section ``[logger_log01]``. Similarly, a
4163handler called ``hand01`` in the ``[handlers]`` section will have its
4164configuration held in a section called ``[handler_hand01]``, while a formatter
4165called ``form01`` in the ``[formatters]`` section will have its configuration
4166specified in a section called ``[formatter_form01]``. The root logger
4167configuration must be specified in a section called ``[logger_root]``.
Georg Brandl116aa622007-08-15 14:28:22 +00004168
4169Examples of these sections in the file are given below. ::
4170
4171 [loggers]
4172 keys=root,log02,log03,log04,log05,log06,log07
4173
4174 [handlers]
4175 keys=hand01,hand02,hand03,hand04,hand05,hand06,hand07,hand08,hand09
4176
4177 [formatters]
4178 keys=form01,form02,form03,form04,form05,form06,form07,form08,form09
4179
4180The root logger must specify a level and a list of handlers. An example of a
4181root logger section is given below. ::
4182
4183 [logger_root]
4184 level=NOTSET
4185 handlers=hand01
4186
4187The ``level`` entry can be one of ``DEBUG, INFO, WARNING, ERROR, CRITICAL`` or
4188``NOTSET``. For the root logger only, ``NOTSET`` means that all messages will be
4189logged. Level values are :func:`eval`\ uated in the context of the ``logging``
4190package's namespace.
4191
4192The ``handlers`` entry is a comma-separated list of handler names, which must
4193appear in the ``[handlers]`` section. These names must appear in the
4194``[handlers]`` section and have corresponding sections in the configuration
4195file.
4196
4197For loggers other than the root logger, some additional information is required.
4198This is illustrated by the following example. ::
4199
4200 [logger_parser]
4201 level=DEBUG
4202 handlers=hand01
4203 propagate=1
4204 qualname=compiler.parser
4205
4206The ``level`` and ``handlers`` entries are interpreted as for the root logger,
4207except that if a non-root logger's level is specified as ``NOTSET``, the system
4208consults loggers higher up the hierarchy to determine the effective level of the
4209logger. The ``propagate`` entry is set to 1 to indicate that messages must
4210propagate to handlers higher up the logger hierarchy from this logger, or 0 to
4211indicate that messages are **not** propagated to handlers up the hierarchy. The
4212``qualname`` entry is the hierarchical channel name of the logger, that is to
4213say the name used by the application to get the logger.
4214
4215Sections which specify handler configuration are exemplified by the following.
4216::
4217
4218 [handler_hand01]
4219 class=StreamHandler
4220 level=NOTSET
4221 formatter=form01
4222 args=(sys.stdout,)
4223
4224The ``class`` entry indicates the handler's class (as determined by :func:`eval`
4225in the ``logging`` package's namespace). The ``level`` is interpreted as for
4226loggers, and ``NOTSET`` is taken to mean "log everything".
4227
4228The ``formatter`` entry indicates the key name of the formatter for this
4229handler. If blank, a default formatter (``logging._defaultFormatter``) is used.
4230If a name is specified, it must appear in the ``[formatters]`` section and have
4231a corresponding section in the configuration file.
4232
4233The ``args`` entry, when :func:`eval`\ uated in the context of the ``logging``
4234package's namespace, is the list of arguments to the constructor for the handler
4235class. Refer to the constructors for the relevant handlers, or to the examples
4236below, to see how typical entries are constructed. ::
4237
4238 [handler_hand02]
4239 class=FileHandler
4240 level=DEBUG
4241 formatter=form02
4242 args=('python.log', 'w')
4243
4244 [handler_hand03]
4245 class=handlers.SocketHandler
4246 level=INFO
4247 formatter=form03
4248 args=('localhost', handlers.DEFAULT_TCP_LOGGING_PORT)
4249
4250 [handler_hand04]
4251 class=handlers.DatagramHandler
4252 level=WARN
4253 formatter=form04
4254 args=('localhost', handlers.DEFAULT_UDP_LOGGING_PORT)
4255
4256 [handler_hand05]
4257 class=handlers.SysLogHandler
4258 level=ERROR
4259 formatter=form05
4260 args=(('localhost', handlers.SYSLOG_UDP_PORT), handlers.SysLogHandler.LOG_USER)
4261
4262 [handler_hand06]
4263 class=handlers.NTEventLogHandler
4264 level=CRITICAL
4265 formatter=form06
4266 args=('Python Application', '', 'Application')
4267
4268 [handler_hand07]
4269 class=handlers.SMTPHandler
4270 level=WARN
4271 formatter=form07
4272 args=('localhost', 'from@abc', ['user1@abc', 'user2@xyz'], 'Logger Subject')
4273
4274 [handler_hand08]
4275 class=handlers.MemoryHandler
4276 level=NOTSET
4277 formatter=form08
4278 target=
4279 args=(10, ERROR)
4280
4281 [handler_hand09]
4282 class=handlers.HTTPHandler
4283 level=NOTSET
4284 formatter=form09
4285 args=('localhost:9022', '/log', 'GET')
4286
4287Sections which specify formatter configuration are typified by the following. ::
4288
4289 [formatter_form01]
4290 format=F1 %(asctime)s %(levelname)s %(message)s
4291 datefmt=
4292 class=logging.Formatter
4293
4294The ``format`` entry is the overall format string, and the ``datefmt`` entry is
Christian Heimes5b5e81c2007-12-31 16:14:33 +00004295the :func:`strftime`\ -compatible date/time format string. If empty, the
4296package substitutes ISO8601 format date/times, which is almost equivalent to
4297specifying the date format string ``"%Y-%m-%d %H:%M:%S"``. The ISO8601 format
4298also specifies milliseconds, which are appended to the result of using the above
4299format string, with a comma separator. An example time in ISO8601 format is
4300``2003-01-23 00:29:50,411``.
Georg Brandl116aa622007-08-15 14:28:22 +00004301
4302The ``class`` entry is optional. It indicates the name of the formatter's class
4303(as a dotted module and class name.) This option is useful for instantiating a
4304:class:`Formatter` subclass. Subclasses of :class:`Formatter` can present
4305exception tracebacks in an expanded or condensed format.
4306
Christian Heimes8b0facf2007-12-04 19:30:01 +00004307
4308Configuration server example
4309^^^^^^^^^^^^^^^^^^^^^^^^^^^^
4310
4311Here is an example of a module using the logging configuration server::
4312
4313 import logging
4314 import logging.config
4315 import time
4316 import os
4317
4318 # read initial config file
4319 logging.config.fileConfig("logging.conf")
4320
4321 # create and start listener on port 9999
4322 t = logging.config.listen(9999)
4323 t.start()
4324
4325 logger = logging.getLogger("simpleExample")
4326
4327 try:
4328 # loop through logging calls to see the difference
4329 # new configurations make, until Ctrl+C is pressed
4330 while True:
4331 logger.debug("debug message")
4332 logger.info("info message")
4333 logger.warn("warn message")
4334 logger.error("error message")
4335 logger.critical("critical message")
4336 time.sleep(5)
4337 except KeyboardInterrupt:
4338 # cleanup
4339 logging.config.stopListening()
4340 t.join()
4341
4342And here is a script that takes a filename and sends that file to the server,
4343properly preceded with the binary-encoded length, as the new logging
4344configuration::
4345
4346 #!/usr/bin/env python
4347 import socket, sys, struct
4348
4349 data_to_send = open(sys.argv[1], "r").read()
4350
4351 HOST = 'localhost'
4352 PORT = 9999
4353 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Georg Brandlf6945182008-02-01 11:56:49 +00004354 print("connecting...")
Christian Heimes8b0facf2007-12-04 19:30:01 +00004355 s.connect((HOST, PORT))
Georg Brandlf6945182008-02-01 11:56:49 +00004356 print("sending config...")
Christian Heimes8b0facf2007-12-04 19:30:01 +00004357 s.send(struct.pack(">L", len(data_to_send)))
4358 s.send(data_to_send)
4359 s.close()
Georg Brandlf6945182008-02-01 11:56:49 +00004360 print("complete")
Christian Heimes8b0facf2007-12-04 19:30:01 +00004361
4362
4363More examples
4364-------------
4365
4366Multiple handlers and formatters
4367^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
4368
4369Loggers are plain Python objects. The :func:`addHandler` method has no minimum
4370or maximum quota for the number of handlers you may add. Sometimes it will be
4371beneficial for an application to log all messages of all severities to a text
4372file while simultaneously logging errors or above to the console. To set this
4373up, simply configure the appropriate handlers. The logging calls in the
4374application code will remain unchanged. Here is a slight modification to the
4375previous simple module-based configuration example::
4376
4377 import logging
4378
4379 logger = logging.getLogger("simple_example")
4380 logger.setLevel(logging.DEBUG)
4381 # create file handler which logs even debug messages
4382 fh = logging.FileHandler("spam.log")
4383 fh.setLevel(logging.DEBUG)
4384 # create console handler with a higher log level
4385 ch = logging.StreamHandler()
4386 ch.setLevel(logging.ERROR)
4387 # create formatter and add it to the handlers
4388 formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
4389 ch.setFormatter(formatter)
4390 fh.setFormatter(formatter)
4391 # add the handlers to logger
4392 logger.addHandler(ch)
4393 logger.addHandler(fh)
4394
4395 # "application" code
4396 logger.debug("debug message")
4397 logger.info("info message")
4398 logger.warn("warn message")
4399 logger.error("error message")
4400 logger.critical("critical message")
4401
4402Notice that the "application" code does not care about multiple handlers. All
4403that changed was the addition and configuration of a new handler named *fh*.
4404
4405The ability to create new handlers with higher- or lower-severity filters can be
4406very helpful when writing and testing an application. Instead of using many
4407``print`` statements for debugging, use ``logger.debug``: Unlike the print
4408statements, which you will have to delete or comment out later, the logger.debug
4409statements can remain intact in the source code and remain dormant until you
4410need them again. At that time, the only change that needs to happen is to
4411modify the severity level of the logger and/or handler to debug.
4412
4413
4414Using logging in multiple modules
4415^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
4416
4417It was mentioned above that multiple calls to
4418``logging.getLogger('someLogger')`` return a reference to the same logger
4419object. This is true not only within the same module, but also across modules
4420as long as it is in the same Python interpreter process. It is true for
4421references to the same object; additionally, application code can define and
4422configure a parent logger in one module and create (but not configure) a child
4423logger in a separate module, and all logger calls to the child will pass up to
4424the parent. Here is a main module::
4425
4426 import logging
4427 import auxiliary_module
4428
4429 # create logger with "spam_application"
4430 logger = logging.getLogger("spam_application")
4431 logger.setLevel(logging.DEBUG)
4432 # create file handler which logs even debug messages
4433 fh = logging.FileHandler("spam.log")
4434 fh.setLevel(logging.DEBUG)
4435 # create console handler with a higher log level
4436 ch = logging.StreamHandler()
4437 ch.setLevel(logging.ERROR)
4438 # create formatter and add it to the handlers
4439 formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
4440 fh.setFormatter(formatter)
4441 ch.setFormatter(formatter)
4442 # add the handlers to the logger
4443 logger.addHandler(fh)
4444 logger.addHandler(ch)
4445
4446 logger.info("creating an instance of auxiliary_module.Auxiliary")
4447 a = auxiliary_module.Auxiliary()
4448 logger.info("created an instance of auxiliary_module.Auxiliary")
4449 logger.info("calling auxiliary_module.Auxiliary.do_something")
4450 a.do_something()
4451 logger.info("finished auxiliary_module.Auxiliary.do_something")
4452 logger.info("calling auxiliary_module.some_function()")
4453 auxiliary_module.some_function()
4454 logger.info("done with auxiliary_module.some_function()")
4455
4456Here is the auxiliary module::
4457
4458 import logging
4459
4460 # create logger
4461 module_logger = logging.getLogger("spam_application.auxiliary")
4462
4463 class Auxiliary:
4464 def __init__(self):
4465 self.logger = logging.getLogger("spam_application.auxiliary.Auxiliary")
4466 self.logger.info("creating an instance of Auxiliary")
4467 def do_something(self):
4468 self.logger.info("doing something")
4469 a = 1 + 1
4470 self.logger.info("done doing something")
4471
4472 def some_function():
4473 module_logger.info("received a call to \"some_function\"")
4474
4475The output looks like this::
4476
Christian Heimes043d6f62008-01-07 17:19:16 +00004477 2005-03-23 23:47:11,663 - spam_application - INFO -
Christian Heimes8b0facf2007-12-04 19:30:01 +00004478 creating an instance of auxiliary_module.Auxiliary
Christian Heimes043d6f62008-01-07 17:19:16 +00004479 2005-03-23 23:47:11,665 - spam_application.auxiliary.Auxiliary - INFO -
Christian Heimes8b0facf2007-12-04 19:30:01 +00004480 creating an instance of Auxiliary
Christian Heimes043d6f62008-01-07 17:19:16 +00004481 2005-03-23 23:47:11,665 - spam_application - INFO -
Christian Heimes8b0facf2007-12-04 19:30:01 +00004482 created an instance of auxiliary_module.Auxiliary
Christian Heimes043d6f62008-01-07 17:19:16 +00004483 2005-03-23 23:47:11,668 - spam_application - INFO -
Christian Heimes8b0facf2007-12-04 19:30:01 +00004484 calling auxiliary_module.Auxiliary.do_something
Christian Heimes043d6f62008-01-07 17:19:16 +00004485 2005-03-23 23:47:11,668 - spam_application.auxiliary.Auxiliary - INFO -
Christian Heimes8b0facf2007-12-04 19:30:01 +00004486 doing something
Christian Heimes043d6f62008-01-07 17:19:16 +00004487 2005-03-23 23:47:11,669 - spam_application.auxiliary.Auxiliary - INFO -
Christian Heimes8b0facf2007-12-04 19:30:01 +00004488 done doing something
Christian Heimes043d6f62008-01-07 17:19:16 +00004489 2005-03-23 23:47:11,670 - spam_application - INFO -
Christian Heimes8b0facf2007-12-04 19:30:01 +00004490 finished auxiliary_module.Auxiliary.do_something
Christian Heimes043d6f62008-01-07 17:19:16 +00004491 2005-03-23 23:47:11,671 - spam_application - INFO -
Christian Heimes8b0facf2007-12-04 19:30:01 +00004492 calling auxiliary_module.some_function()
Christian Heimes043d6f62008-01-07 17:19:16 +00004493 2005-03-23 23:47:11,672 - spam_application.auxiliary - INFO -
Christian Heimes8b0facf2007-12-04 19:30:01 +00004494 received a call to "some_function"
Christian Heimes043d6f62008-01-07 17:19:16 +00004495 2005-03-23 23:47:11,673 - spam_application - INFO -
Christian Heimes8b0facf2007-12-04 19:30:01 +00004496 done with auxiliary_module.some_function()
4497