annotate Lib/logging/config.py @ 79675:c0a2294de787 2.7

Issue #16199: Backport 2to3 typo fix from 3.2.
author Chris Jerdonek <chris.jerdonek@gmail.com>
date Thu, 11 Oct 2012 16:15:46 -0700
parents 8726ad774cf0
children 8ae1c28445f8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
58692
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
1 # Copyright 2001-2010 by Vinay Sajip. All Rights Reserved.
26183
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
2 #
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
3 # Permission to use, copy, modify, and distribute this software and its
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
4 # documentation for any purpose and without fee is hereby granted,
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
5 # provided that the above copyright notice appear in all copies and that
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
6 # both that copyright notice and this permission notice appear in
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
7 # supporting documentation, and that the name of Vinay Sajip
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
8 # not be used in advertising or publicity pertaining to distribution
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
9 # of the software without specific, written prior permission.
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
10 # VINAY SAJIP DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
11 # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
12 # VINAY SAJIP BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
13 # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
14 # IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
15 # OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
16
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
17 """
31597
05e1c27c0a74 Minor documentation changes
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 31561
diff changeset
18 Configuration functions for the logging package for Python. The core package
05e1c27c0a74 Minor documentation changes
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 31561
diff changeset
19 is based on PEP 282 and comments thereto in comp.lang.python, and influenced
05e1c27c0a74 Minor documentation changes
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 31561
diff changeset
20 by Apache's log4j system.
26183
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
21
58692
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
22 Copyright (C) 2001-2010 Vinay Sajip. All Rights Reserved.
26183
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
23
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
24 To use, simply 'import logging' and log away!
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
25 """
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
26
58692
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
27 import sys, logging, logging.handlers, socket, struct, os, traceback, re
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
28 import types, cStringIO
34613
a4d13974f6eb Handle errors in imports of thread, threading
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 33555
diff changeset
29
a4d13974f6eb Handle errors in imports of thread, threading
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 33555
diff changeset
30 try:
a4d13974f6eb Handle errors in imports of thread, threading
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 33555
diff changeset
31 import thread
a4d13974f6eb Handle errors in imports of thread, threading
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 33555
diff changeset
32 import threading
a4d13974f6eb Handle errors in imports of thread, threading
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 33555
diff changeset
33 except ImportError:
a4d13974f6eb Handle errors in imports of thread, threading
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 33555
diff changeset
34 thread = None
26183
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
35
47241
ba1fa511b72d socketserver renaming reversal part 3: move the module into the right
Georg Brandl <georg@python.org>
parents: 47009
diff changeset
36 from SocketServer import ThreadingTCPServer, StreamRequestHandler
26183
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
37
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
38
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
39 DEFAULT_LOGGING_CONFIG_PORT = 9030
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
40
31561
6dd38e4586ff Copyright year change.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 28136
diff changeset
41 if sys.platform == "win32":
6dd38e4586ff Copyright year change.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 28136
diff changeset
42 RESET_ERROR = 10054 #WSAECONNRESET
6dd38e4586ff Copyright year change.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 28136
diff changeset
43 else:
6dd38e4586ff Copyright year change.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 28136
diff changeset
44 RESET_ERROR = 104 #ECONNRESET
6dd38e4586ff Copyright year change.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 28136
diff changeset
45
26183
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
46 #
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
47 # The following code implements a socket listener for on-the-fly
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
48 # reconfiguration of logging.
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
49 #
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
50 # _listener holds the server object doing the listening
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
51 _listener = None
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
52
56441
6d092a51e187 Issue #7086: Added TCP support to SysLogHandler and tidied up some anachronisms in the code.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 48980
diff changeset
53 def fileConfig(fname, defaults=None, disable_existing_loggers=True):
26183
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
54 """
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
55 Read the logging configuration from a ConfigParser-format file.
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
56
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
57 This can be called several times from an application, allowing an end user
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
58 the ability to select from various pre-canned configurations (if the
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
59 developer provides a mechanism to present the choices and load the chosen
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
60 configuration).
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
61 """
47252
e534ee0a4cd0 ConfigParser renaming reversal part 3: move module into place and adapt imports.
Georg Brandl <georg@python.org>
parents: 47241
diff changeset
62 import ConfigParser
26183
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
63
47252
e534ee0a4cd0 ConfigParser renaming reversal part 3: move module into place and adapt imports.
Georg Brandl <georg@python.org>
parents: 47241
diff changeset
64 cp = ConfigParser.ConfigParser(defaults)
58805
87cd893cb8ba Issue #7869: logging: improved format-time diagnostics and removed some 1.5.2 support code.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 58757
diff changeset
65 if hasattr(fname, 'readline'):
26183
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
66 cp.readfp(fname)
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
67 else:
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
68 cp.read(fname)
36309
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
69
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
70 formatters = _create_formatters(cp)
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
71
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
72 # critical section
26183
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
73 logging._acquireLock()
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
74 try:
36309
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
75 logging._handlers.clear()
39462
68bed5348454 Repair logging test spew caused by rev. 51206.
Georg Brandl <georg@python.org>
parents: 38966
diff changeset
76 del logging._handlerList[:]
36309
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
77 # Handlers add themselves to logging._handlers
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
78 handlers = _install_handlers(cp, formatters)
47774
b418dd39f798 Bug #3136: fileConfig()'s disabling of old loggers is now conditional via an optional disable_existing_loggers parameter, but the default value is such that the old behaviour is preserved.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 47252
diff changeset
79 _install_loggers(cp, handlers, disable_existing_loggers)
26183
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
80 finally:
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
81 logging._releaseLock()
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
82
36309
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
83
36348
eb4a47b81942 Added the ability to specify a class attribute in Formatter configuration. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 36309
diff changeset
84 def _resolve(name):
eb4a47b81942 Added the ability to specify a class attribute in Formatter configuration. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 36309
diff changeset
85 """Resolve a dotted name to a global object."""
56441
6d092a51e187 Issue #7086: Added TCP support to SysLogHandler and tidied up some anachronisms in the code.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 48980
diff changeset
86 name = name.split('.')
36348
eb4a47b81942 Added the ability to specify a class attribute in Formatter configuration. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 36309
diff changeset
87 used = name.pop(0)
eb4a47b81942 Added the ability to specify a class attribute in Formatter configuration. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 36309
diff changeset
88 found = __import__(used)
eb4a47b81942 Added the ability to specify a class attribute in Formatter configuration. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 36309
diff changeset
89 for n in name:
eb4a47b81942 Added the ability to specify a class attribute in Formatter configuration. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 36309
diff changeset
90 used = used + '.' + n
eb4a47b81942 Added the ability to specify a class attribute in Formatter configuration. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 36309
diff changeset
91 try:
eb4a47b81942 Added the ability to specify a class attribute in Formatter configuration. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 36309
diff changeset
92 found = getattr(found, n)
eb4a47b81942 Added the ability to specify a class attribute in Formatter configuration. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 36309
diff changeset
93 except AttributeError:
eb4a47b81942 Added the ability to specify a class attribute in Formatter configuration. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 36309
diff changeset
94 __import__(used)
eb4a47b81942 Added the ability to specify a class attribute in Formatter configuration. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 36309
diff changeset
95 found = getattr(found, n)
eb4a47b81942 Added the ability to specify a class attribute in Formatter configuration. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 36309
diff changeset
96 return found
eb4a47b81942 Added the ability to specify a class attribute in Formatter configuration. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 36309
diff changeset
97
48980
5fd39b84fc29 Issue #3726: Allowed spaces in separators in logging configuration files.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 48153
diff changeset
98 def _strip_spaces(alist):
56441
6d092a51e187 Issue #7086: Added TCP support to SysLogHandler and tidied up some anachronisms in the code.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 48980
diff changeset
99 return map(lambda x: x.strip(), alist)
36348
eb4a47b81942 Added the ability to specify a class attribute in Formatter configuration. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 36309
diff changeset
100
63111
45ed0cf2c386 Fixed #9310: backported logging fix from 2.7.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 48980
diff changeset
101 def _encoded(s):
45ed0cf2c386 Fixed #9310: backported logging fix from 2.7.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 48980
diff changeset
102 return s if isinstance(s, str) else s.encode('utf-8')
45ed0cf2c386 Fixed #9310: backported logging fix from 2.7.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 48980
diff changeset
103
36309
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
104 def _create_formatters(cp):
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
105 """Create and return formatters"""
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
106 flist = cp.get("formatters", "keys")
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
107 if not len(flist):
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
108 return {}
56441
6d092a51e187 Issue #7086: Added TCP support to SysLogHandler and tidied up some anachronisms in the code.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 48980
diff changeset
109 flist = flist.split(",")
48980
5fd39b84fc29 Issue #3726: Allowed spaces in separators in logging configuration files.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 48153
diff changeset
110 flist = _strip_spaces(flist)
36309
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
111 formatters = {}
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
112 for form in flist:
48980
5fd39b84fc29 Issue #3726: Allowed spaces in separators in logging configuration files.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 48153
diff changeset
113 sectname = "formatter_%s" % form
36309
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
114 opts = cp.options(sectname)
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
115 if "format" in opts:
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
116 fs = cp.get(sectname, "format", 1)
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
117 else:
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
118 fs = None
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
119 if "datefmt" in opts:
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
120 dfs = cp.get(sectname, "datefmt", 1)
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
121 else:
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
122 dfs = None
36348
eb4a47b81942 Added the ability to specify a class attribute in Formatter configuration. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 36309
diff changeset
123 c = logging.Formatter
eb4a47b81942 Added the ability to specify a class attribute in Formatter configuration. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 36309
diff changeset
124 if "class" in opts:
eb4a47b81942 Added the ability to specify a class attribute in Formatter configuration. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 36309
diff changeset
125 class_name = cp.get(sectname, "class")
eb4a47b81942 Added the ability to specify a class attribute in Formatter configuration. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 36309
diff changeset
126 if class_name:
eb4a47b81942 Added the ability to specify a class attribute in Formatter configuration. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 36309
diff changeset
127 c = _resolve(class_name)
eb4a47b81942 Added the ability to specify a class attribute in Formatter configuration. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 36309
diff changeset
128 f = c(fs, dfs)
36309
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
129 formatters[form] = f
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
130 return formatters
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
131
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
132
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
133 def _install_handlers(cp, formatters):
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
134 """Install and return handlers"""
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
135 hlist = cp.get("handlers", "keys")
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
136 if not len(hlist):
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
137 return {}
56441
6d092a51e187 Issue #7086: Added TCP support to SysLogHandler and tidied up some anachronisms in the code.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 48980
diff changeset
138 hlist = hlist.split(",")
48980
5fd39b84fc29 Issue #3726: Allowed spaces in separators in logging configuration files.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 48153
diff changeset
139 hlist = _strip_spaces(hlist)
36309
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
140 handlers = {}
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
141 fixups = [] #for inter-handler references
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
142 for hand in hlist:
48980
5fd39b84fc29 Issue #3726: Allowed spaces in separators in logging configuration files.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 48153
diff changeset
143 sectname = "handler_%s" % hand
36309
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
144 klass = cp.get(sectname, "class")
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
145 opts = cp.options(sectname)
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
146 if "formatter" in opts:
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
147 fmt = cp.get(sectname, "formatter")
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
148 else:
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
149 fmt = ""
48009
0eae9b25a2ed Issue #3389: Allow resolving dotted names for handlers in logging configuration files. Thanks to Philip Jenvey for the patch.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 47854
diff changeset
150 try:
0eae9b25a2ed Issue #3389: Allow resolving dotted names for handlers in logging configuration files. Thanks to Philip Jenvey for the patch.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 47854
diff changeset
151 klass = eval(klass, vars(logging))
0eae9b25a2ed Issue #3389: Allow resolving dotted names for handlers in logging configuration files. Thanks to Philip Jenvey for the patch.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 47854
diff changeset
152 except (AttributeError, NameError):
0eae9b25a2ed Issue #3389: Allow resolving dotted names for handlers in logging configuration files. Thanks to Philip Jenvey for the patch.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 47854
diff changeset
153 klass = _resolve(klass)
36309
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
154 args = cp.get(sectname, "args")
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
155 args = eval(args, vars(logging))
48153
c77ac8bdd3fe Remove dict.has_key() and apply() usage from the logging package to silence
Brett Cannon <bcannon@gmail.com>
parents: 48009
diff changeset
156 h = klass(*args)
36309
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
157 if "level" in opts:
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
158 level = cp.get(sectname, "level")
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
159 h.setLevel(logging._levelNames[level])
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
160 if len(fmt):
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
161 h.setFormatter(formatters[fmt])
47854
73cbcde75e05 Removed out-of-date comment in _install_handlers and
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 47774
diff changeset
162 if issubclass(klass, logging.handlers.MemoryHandler):
36309
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
163 if "target" in opts:
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
164 target = cp.get(sectname,"target")
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
165 else:
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
166 target = ""
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
167 if len(target): #the target handler may not be loaded yet, so keep for later...
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
168 fixups.append((h, target))
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
169 handlers[hand] = h
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
170 #now all handlers are loaded, fixup inter-handler references...
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
171 for h, t in fixups:
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
172 h.setTarget(handlers[t])
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
173 return handlers
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
174
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
175
47774
b418dd39f798 Bug #3136: fileConfig()'s disabling of old loggers is now conditional via an optional disable_existing_loggers parameter, but the default value is such that the old behaviour is preserved.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 47252
diff changeset
176 def _install_loggers(cp, handlers, disable_existing_loggers):
36309
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
177 """Create and install loggers"""
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
178
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
179 # configure the root first
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
180 llist = cp.get("loggers", "keys")
56441
6d092a51e187 Issue #7086: Added TCP support to SysLogHandler and tidied up some anachronisms in the code.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 48980
diff changeset
181 llist = llist.split(",")
6d092a51e187 Issue #7086: Added TCP support to SysLogHandler and tidied up some anachronisms in the code.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 48980
diff changeset
182 llist = list(map(lambda x: x.strip(), llist))
36309
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
183 llist.remove("root")
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
184 sectname = "logger_root"
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
185 root = logging.root
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
186 log = root
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
187 opts = cp.options(sectname)
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
188 if "level" in opts:
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
189 level = cp.get(sectname, "level")
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
190 log.setLevel(logging._levelNames[level])
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
191 for h in root.handlers[:]:
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
192 root.removeHandler(h)
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
193 hlist = cp.get(sectname, "handlers")
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
194 if len(hlist):
56441
6d092a51e187 Issue #7086: Added TCP support to SysLogHandler and tidied up some anachronisms in the code.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 48980
diff changeset
195 hlist = hlist.split(",")
48980
5fd39b84fc29 Issue #3726: Allowed spaces in separators in logging configuration files.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 48153
diff changeset
196 hlist = _strip_spaces(hlist)
36309
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
197 for hand in hlist:
48980
5fd39b84fc29 Issue #3726: Allowed spaces in separators in logging configuration files.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 48153
diff changeset
198 log.addHandler(handlers[hand])
36309
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
199
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
200 #and now the others...
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
201 #we don't want to lose the existing loggers,
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
202 #since other threads may have pointers to them.
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
203 #existing is set to contain all existing loggers,
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
204 #and as we go through the new configuration we
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
205 #remove any which are configured. At the end,
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
206 #what's left in existing is the set of loggers
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
207 #which were in the previous configuration but
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
208 #which are not in the new configuration.
56441
6d092a51e187 Issue #7086: Added TCP support to SysLogHandler and tidied up some anachronisms in the code.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 48980
diff changeset
209 existing = list(root.manager.loggerDict.keys())
43816
487f3737eaef Fixed a bug reported (in private email, by Robert Crida) in logging configuration whereby child loggers of a logger named in a configuration file, which are not themselves named in the configuration, are disabled when the configuration is applied.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 40447
diff changeset
210 #The list needs to be sorted so that we can
487f3737eaef Fixed a bug reported (in private email, by Robert Crida) in logging configuration whereby child loggers of a logger named in a configuration file, which are not themselves named in the configuration, are disabled when the configuration is applied.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 40447
diff changeset
211 #avoid disabling child loggers of explicitly
487f3737eaef Fixed a bug reported (in private email, by Robert Crida) in logging configuration whereby child loggers of a logger named in a configuration file, which are not themselves named in the configuration, are disabled when the configuration is applied.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 40447
diff changeset
212 #named loggers. With a sorted list it is easier
487f3737eaef Fixed a bug reported (in private email, by Robert Crida) in logging configuration whereby child loggers of a logger named in a configuration file, which are not themselves named in the configuration, are disabled when the configuration is applied.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 40447
diff changeset
213 #to find the child loggers.
73414
8726ad774cf0 Closes #13356. Thanks to Florent Xicluna for the patch.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 68420
diff changeset
214 existing.sort()
43816
487f3737eaef Fixed a bug reported (in private email, by Robert Crida) in logging configuration whereby child loggers of a logger named in a configuration file, which are not themselves named in the configuration, are disabled when the configuration is applied.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 40447
diff changeset
215 #We'll keep the list of existing loggers
487f3737eaef Fixed a bug reported (in private email, by Robert Crida) in logging configuration whereby child loggers of a logger named in a configuration file, which are not themselves named in the configuration, are disabled when the configuration is applied.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 40447
diff changeset
216 #which are children of named loggers here...
487f3737eaef Fixed a bug reported (in private email, by Robert Crida) in logging configuration whereby child loggers of a logger named in a configuration file, which are not themselves named in the configuration, are disabled when the configuration is applied.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 40447
diff changeset
217 child_loggers = []
36309
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
218 #now set up the new ones...
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
219 for log in llist:
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
220 sectname = "logger_%s" % log
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
221 qn = cp.get(sectname, "qualname")
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
222 opts = cp.options(sectname)
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
223 if "propagate" in opts:
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
224 propagate = cp.getint(sectname, "propagate")
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
225 else:
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
226 propagate = 1
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
227 logger = logging.getLogger(qn)
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
228 if qn in existing:
68315
b9d76846bb1c Issue #11424: Fix bug in determining child loggers.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 63111
diff changeset
229 i = existing.index(qn) + 1 # start with the entry after qn
43816
487f3737eaef Fixed a bug reported (in private email, by Robert Crida) in logging configuration whereby child loggers of a logger named in a configuration file, which are not themselves named in the configuration, are disabled when the configuration is applied.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 40447
diff changeset
230 prefixed = qn + "."
487f3737eaef Fixed a bug reported (in private email, by Robert Crida) in logging configuration whereby child loggers of a logger named in a configuration file, which are not themselves named in the configuration, are disabled when the configuration is applied.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 40447
diff changeset
231 pflen = len(prefixed)
487f3737eaef Fixed a bug reported (in private email, by Robert Crida) in logging configuration whereby child loggers of a logger named in a configuration file, which are not themselves named in the configuration, are disabled when the configuration is applied.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 40447
diff changeset
232 num_existing = len(existing)
68315
b9d76846bb1c Issue #11424: Fix bug in determining child loggers.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 63111
diff changeset
233 while i < num_existing:
b9d76846bb1c Issue #11424: Fix bug in determining child loggers.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 63111
diff changeset
234 if existing[i][:pflen] == prefixed:
b9d76846bb1c Issue #11424: Fix bug in determining child loggers.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 63111
diff changeset
235 child_loggers.append(existing[i])
b9d76846bb1c Issue #11424: Fix bug in determining child loggers.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 63111
diff changeset
236 i += 1
36309
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
237 existing.remove(qn)
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
238 if "level" in opts:
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
239 level = cp.get(sectname, "level")
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
240 logger.setLevel(logging._levelNames[level])
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
241 for h in logger.handlers[:]:
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
242 logger.removeHandler(h)
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
243 logger.propagate = propagate
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
244 logger.disabled = 0
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
245 hlist = cp.get(sectname, "handlers")
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
246 if len(hlist):
56441
6d092a51e187 Issue #7086: Added TCP support to SysLogHandler and tidied up some anachronisms in the code.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 48980
diff changeset
247 hlist = hlist.split(",")
48980
5fd39b84fc29 Issue #3726: Allowed spaces in separators in logging configuration files.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 48153
diff changeset
248 hlist = _strip_spaces(hlist)
36309
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
249 for hand in hlist:
48980
5fd39b84fc29 Issue #3726: Allowed spaces in separators in logging configuration files.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 48153
diff changeset
250 logger.addHandler(handlers[hand])
36309
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
251
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
252 #Disable any old loggers. There's no point deleting
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
253 #them as other threads may continue to hold references
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
254 #and by disabling them, you stop them doing any logging.
43816
487f3737eaef Fixed a bug reported (in private email, by Robert Crida) in logging configuration whereby child loggers of a logger named in a configuration file, which are not themselves named in the configuration, are disabled when the configuration is applied.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 40447
diff changeset
255 #However, don't disable children of named loggers, as that's
487f3737eaef Fixed a bug reported (in private email, by Robert Crida) in logging configuration whereby child loggers of a logger named in a configuration file, which are not themselves named in the configuration, are disabled when the configuration is applied.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 40447
diff changeset
256 #probably not what was intended by the user.
36309
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
257 for log in existing:
43816
487f3737eaef Fixed a bug reported (in private email, by Robert Crida) in logging configuration whereby child loggers of a logger named in a configuration file, which are not themselves named in the configuration, are disabled when the configuration is applied.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 40447
diff changeset
258 logger = root.manager.loggerDict[log]
487f3737eaef Fixed a bug reported (in private email, by Robert Crida) in logging configuration whereby child loggers of a logger named in a configuration file, which are not themselves named in the configuration, are disabled when the configuration is applied.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 40447
diff changeset
259 if log in child_loggers:
487f3737eaef Fixed a bug reported (in private email, by Robert Crida) in logging configuration whereby child loggers of a logger named in a configuration file, which are not themselves named in the configuration, are disabled when the configuration is applied.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 40447
diff changeset
260 logger.level = logging.NOTSET
487f3737eaef Fixed a bug reported (in private email, by Robert Crida) in logging configuration whereby child loggers of a logger named in a configuration file, which are not themselves named in the configuration, are disabled when the configuration is applied.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 40447
diff changeset
261 logger.handlers = []
487f3737eaef Fixed a bug reported (in private email, by Robert Crida) in logging configuration whereby child loggers of a logger named in a configuration file, which are not themselves named in the configuration, are disabled when the configuration is applied.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 40447
diff changeset
262 logger.propagate = 1
47774
b418dd39f798 Bug #3136: fileConfig()'s disabling of old loggers is now conditional via an optional disable_existing_loggers parameter, but the default value is such that the old behaviour is preserved.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 47252
diff changeset
263 elif disable_existing_loggers:
43816
487f3737eaef Fixed a bug reported (in private email, by Robert Crida) in logging configuration whereby child loggers of a logger named in a configuration file, which are not themselves named in the configuration, are disabled when the configuration is applied.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 40447
diff changeset
264 logger.disabled = 1
36309
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
265
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
266
58692
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
267
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
268 IDENTIFIER = re.compile('^[a-z_][a-z0-9_]*$', re.I)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
269
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
270
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
271 def valid_ident(s):
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
272 m = IDENTIFIER.match(s)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
273 if not m:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
274 raise ValueError('Not a valid Python identifier: %r' % s)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
275 return True
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
276
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
277
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
278 # The ConvertingXXX classes are wrappers around standard Python containers,
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
279 # and they serve to convert any suitable values in the container. The
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
280 # conversion converts base dicts, lists and tuples to their wrapped
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
281 # equivalents, whereas strings which match a conversion format are converted
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
282 # appropriately.
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
283 #
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
284 # Each wrapper should have a configurator attribute holding the actual
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
285 # configurator to use for conversion.
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
286
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
287 class ConvertingDict(dict):
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
288 """A converting dictionary wrapper."""
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
289
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
290 def __getitem__(self, key):
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
291 value = dict.__getitem__(self, key)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
292 result = self.configurator.convert(value)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
293 #If the converted value is different, save for next time
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
294 if value is not result:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
295 self[key] = result
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
296 if type(result) in (ConvertingDict, ConvertingList,
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
297 ConvertingTuple):
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
298 result.parent = self
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
299 result.key = key
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
300 return result
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
301
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
302 def get(self, key, default=None):
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
303 value = dict.get(self, key, default)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
304 result = self.configurator.convert(value)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
305 #If the converted value is different, save for next time
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
306 if value is not result:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
307 self[key] = result
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
308 if type(result) in (ConvertingDict, ConvertingList,
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
309 ConvertingTuple):
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
310 result.parent = self
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
311 result.key = key
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
312 return result
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
313
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
314 def pop(self, key, default=None):
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
315 value = dict.pop(self, key, default)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
316 result = self.configurator.convert(value)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
317 if value is not result:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
318 if type(result) in (ConvertingDict, ConvertingList,
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
319 ConvertingTuple):
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
320 result.parent = self
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
321 result.key = key
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
322 return result
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
323
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
324 class ConvertingList(list):
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
325 """A converting list wrapper."""
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
326 def __getitem__(self, key):
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
327 value = list.__getitem__(self, key)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
328 result = self.configurator.convert(value)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
329 #If the converted value is different, save for next time
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
330 if value is not result:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
331 self[key] = result
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
332 if type(result) in (ConvertingDict, ConvertingList,
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
333 ConvertingTuple):
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
334 result.parent = self
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
335 result.key = key
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
336 return result
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
337
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
338 def pop(self, idx=-1):
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
339 value = list.pop(self, idx)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
340 result = self.configurator.convert(value)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
341 if value is not result:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
342 if type(result) in (ConvertingDict, ConvertingList,
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
343 ConvertingTuple):
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
344 result.parent = self
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
345 return result
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
346
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
347 class ConvertingTuple(tuple):
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
348 """A converting tuple wrapper."""
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
349 def __getitem__(self, key):
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
350 value = tuple.__getitem__(self, key)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
351 result = self.configurator.convert(value)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
352 if value is not result:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
353 if type(result) in (ConvertingDict, ConvertingList,
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
354 ConvertingTuple):
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
355 result.parent = self
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
356 result.key = key
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
357 return result
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
358
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
359 class BaseConfigurator(object):
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
360 """
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
361 The configurator base class which defines some useful defaults.
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
362 """
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
363
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
364 CONVERT_PATTERN = re.compile(r'^(?P<prefix>[a-z]+)://(?P<suffix>.*)$')
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
365
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
366 WORD_PATTERN = re.compile(r'^\s*(\w+)\s*')
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
367 DOT_PATTERN = re.compile(r'^\.\s*(\w+)\s*')
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
368 INDEX_PATTERN = re.compile(r'^\[\s*(\w+)\s*\]\s*')
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
369 DIGIT_PATTERN = re.compile(r'^\d+$')
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
370
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
371 value_converters = {
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
372 'ext' : 'ext_convert',
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
373 'cfg' : 'cfg_convert',
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
374 }
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
375
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
376 # We might want to use a different one, e.g. importlib
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
377 importer = __import__
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
378
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
379 def __init__(self, config):
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
380 self.config = ConvertingDict(config)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
381 self.config.configurator = self
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
382
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
383 def resolve(self, s):
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
384 """
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
385 Resolve strings to objects using standard import and attribute
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
386 syntax.
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
387 """
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
388 name = s.split('.')
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
389 used = name.pop(0)
62028
ea43b406450f Logging: improved error reporting for BaseConfigurator.resolve().
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 61172
diff changeset
390 try:
ea43b406450f Logging: improved error reporting for BaseConfigurator.resolve().
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 61172
diff changeset
391 found = self.importer(used)
ea43b406450f Logging: improved error reporting for BaseConfigurator.resolve().
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 61172
diff changeset
392 for frag in name:
ea43b406450f Logging: improved error reporting for BaseConfigurator.resolve().
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 61172
diff changeset
393 used += '.' + frag
ea43b406450f Logging: improved error reporting for BaseConfigurator.resolve().
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 61172
diff changeset
394 try:
ea43b406450f Logging: improved error reporting for BaseConfigurator.resolve().
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 61172
diff changeset
395 found = getattr(found, frag)
ea43b406450f Logging: improved error reporting for BaseConfigurator.resolve().
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 61172
diff changeset
396 except AttributeError:
ea43b406450f Logging: improved error reporting for BaseConfigurator.resolve().
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 61172
diff changeset
397 self.importer(used)
ea43b406450f Logging: improved error reporting for BaseConfigurator.resolve().
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 61172
diff changeset
398 found = getattr(found, frag)
ea43b406450f Logging: improved error reporting for BaseConfigurator.resolve().
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 61172
diff changeset
399 return found
ea43b406450f Logging: improved error reporting for BaseConfigurator.resolve().
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 61172
diff changeset
400 except ImportError:
ea43b406450f Logging: improved error reporting for BaseConfigurator.resolve().
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 61172
diff changeset
401 e, tb = sys.exc_info()[1:]
ea43b406450f Logging: improved error reporting for BaseConfigurator.resolve().
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 61172
diff changeset
402 v = ValueError('Cannot resolve %r: %s' % (s, e))
ea43b406450f Logging: improved error reporting for BaseConfigurator.resolve().
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 61172
diff changeset
403 v.__cause__, v.__traceback__ = e, tb
ea43b406450f Logging: improved error reporting for BaseConfigurator.resolve().
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 61172
diff changeset
404 raise v
58692
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
405
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
406 def ext_convert(self, value):
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
407 """Default converter for the ext:// protocol."""
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
408 return self.resolve(value)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
409
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
410 def cfg_convert(self, value):
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
411 """Default converter for the cfg:// protocol."""
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
412 rest = value
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
413 m = self.WORD_PATTERN.match(rest)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
414 if m is None:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
415 raise ValueError("Unable to convert %r" % value)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
416 else:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
417 rest = rest[m.end():]
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
418 d = self.config[m.groups()[0]]
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
419 #print d, rest
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
420 while rest:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
421 m = self.DOT_PATTERN.match(rest)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
422 if m:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
423 d = d[m.groups()[0]]
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
424 else:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
425 m = self.INDEX_PATTERN.match(rest)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
426 if m:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
427 idx = m.groups()[0]
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
428 if not self.DIGIT_PATTERN.match(idx):
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
429 d = d[idx]
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
430 else:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
431 try:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
432 n = int(idx) # try as number first (most likely)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
433 d = d[n]
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
434 except TypeError:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
435 d = d[idx]
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
436 if m:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
437 rest = rest[m.end():]
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
438 else:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
439 raise ValueError('Unable to convert '
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
440 '%r at %r' % (value, rest))
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
441 #rest should be empty
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
442 return d
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
443
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
444 def convert(self, value):
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
445 """
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
446 Convert values to an appropriate type. dicts, lists and tuples are
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
447 replaced by their converting alternatives. Strings are checked to
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
448 see if they have a conversion format and are converted if they do.
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
449 """
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
450 if not isinstance(value, ConvertingDict) and isinstance(value, dict):
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
451 value = ConvertingDict(value)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
452 value.configurator = self
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
453 elif not isinstance(value, ConvertingList) and isinstance(value, list):
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
454 value = ConvertingList(value)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
455 value.configurator = self
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
456 elif not isinstance(value, ConvertingTuple) and\
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
457 isinstance(value, tuple):
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
458 value = ConvertingTuple(value)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
459 value.configurator = self
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
460 elif isinstance(value, basestring): # str for py3k
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
461 m = self.CONVERT_PATTERN.match(value)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
462 if m:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
463 d = m.groupdict()
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
464 prefix = d['prefix']
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
465 converter = self.value_converters.get(prefix, None)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
466 if converter:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
467 suffix = d['suffix']
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
468 converter = getattr(self, converter)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
469 value = converter(suffix)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
470 return value
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
471
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
472 def configure_custom(self, config):
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
473 """Configure an object with a user-supplied factory."""
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
474 c = config.pop('()')
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
475 if not hasattr(c, '__call__') and hasattr(types, 'ClassType') and type(c) != types.ClassType:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
476 c = self.resolve(c)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
477 props = config.pop('.', None)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
478 # Check for valid identifiers
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
479 kwargs = dict([(k, config[k]) for k in config if valid_ident(k)])
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
480 result = c(**kwargs)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
481 if props:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
482 for name, value in props.items():
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
483 setattr(result, name, value)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
484 return result
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
485
59405
d0bbbf3c55f5 Added checks for tuples in dictConfig.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 59402
diff changeset
486 def as_tuple(self, value):
d0bbbf3c55f5 Added checks for tuples in dictConfig.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 59402
diff changeset
487 """Utility function which converts lists to tuples."""
d0bbbf3c55f5 Added checks for tuples in dictConfig.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 59402
diff changeset
488 if isinstance(value, list):
d0bbbf3c55f5 Added checks for tuples in dictConfig.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 59402
diff changeset
489 value = tuple(value)
d0bbbf3c55f5 Added checks for tuples in dictConfig.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 59402
diff changeset
490 return value
d0bbbf3c55f5 Added checks for tuples in dictConfig.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 59402
diff changeset
491
58692
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
492 class DictConfigurator(BaseConfigurator):
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
493 """
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
494 Configure logging using a dictionary-like object to describe the
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
495 configuration.
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
496 """
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
497
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
498 def configure(self):
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
499 """Do the configuration."""
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
500
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
501 config = self.config
59402
120d6ccf26b0 Added schema version test in dictConfig.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 58832
diff changeset
502 if 'version' not in config:
120d6ccf26b0 Added schema version test in dictConfig.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 58832
diff changeset
503 raise ValueError("dictionary doesn't specify a version")
120d6ccf26b0 Added schema version test in dictConfig.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 58832
diff changeset
504 if config['version'] != 1:
120d6ccf26b0 Added schema version test in dictConfig.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 58832
diff changeset
505 raise ValueError("Unsupported version: %s" % config['version'])
58692
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
506 incremental = config.pop('incremental', False)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
507 EMPTY_DICT = {}
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
508 logging._acquireLock()
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
509 try:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
510 if incremental:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
511 handlers = config.get('handlers', EMPTY_DICT)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
512 for name in handlers:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
513 if name not in logging._handlers:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
514 raise ValueError('No handler found with '
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
515 'name %r' % name)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
516 else:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
517 try:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
518 handler = logging._handlers[name]
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
519 handler_config = handlers[name]
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
520 level = handler_config.get('level', None)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
521 if level:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
522 handler.setLevel(logging._checkLevel(level))
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
523 except StandardError, e:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
524 raise ValueError('Unable to configure handler '
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
525 '%r: %s' % (name, e))
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
526 loggers = config.get('loggers', EMPTY_DICT)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
527 for name in loggers:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
528 try:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
529 self.configure_logger(name, loggers[name], True)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
530 except StandardError, e:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
531 raise ValueError('Unable to configure logger '
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
532 '%r: %s' % (name, e))
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
533 root = config.get('root', None)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
534 if root:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
535 try:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
536 self.configure_root(root, True)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
537 except StandardError, e:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
538 raise ValueError('Unable to configure root '
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
539 'logger: %s' % e)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
540 else:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
541 disable_existing = config.pop('disable_existing_loggers', True)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
542
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
543 logging._handlers.clear()
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
544 del logging._handlerList[:]
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
545
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
546 # Do formatters first - they don't refer to anything else
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
547 formatters = config.get('formatters', EMPTY_DICT)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
548 for name in formatters:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
549 try:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
550 formatters[name] = self.configure_formatter(
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
551 formatters[name])
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
552 except StandardError, e:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
553 raise ValueError('Unable to configure '
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
554 'formatter %r: %s' % (name, e))
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
555 # Next, do filters - they don't refer to anything else, either
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
556 filters = config.get('filters', EMPTY_DICT)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
557 for name in filters:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
558 try:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
559 filters[name] = self.configure_filter(filters[name])
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
560 except StandardError, e:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
561 raise ValueError('Unable to configure '
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
562 'filter %r: %s' % (name, e))
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
563
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
564 # Next, do handlers - they refer to formatters and filters
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
565 # As handlers can refer to other handlers, sort the keys
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
566 # to allow a deterministic order of configuration
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
567 handlers = config.get('handlers', EMPTY_DICT)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
568 for name in sorted(handlers):
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
569 try:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
570 handler = self.configure_handler(handlers[name])
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
571 handler.name = name
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
572 handlers[name] = handler
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
573 except StandardError, e:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
574 raise ValueError('Unable to configure handler '
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
575 '%r: %s' % (name, e))
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
576 # Next, do loggers - they refer to handlers and filters
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
577
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
578 #we don't want to lose the existing loggers,
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
579 #since other threads may have pointers to them.
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
580 #existing is set to contain all existing loggers,
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
581 #and as we go through the new configuration we
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
582 #remove any which are configured. At the end,
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
583 #what's left in existing is the set of loggers
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
584 #which were in the previous configuration but
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
585 #which are not in the new configuration.
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
586 root = logging.root
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
587 existing = root.manager.loggerDict.keys()
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
588 #The list needs to be sorted so that we can
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
589 #avoid disabling child loggers of explicitly
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
590 #named loggers. With a sorted list it is easier
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
591 #to find the child loggers.
73414
8726ad774cf0 Closes #13356. Thanks to Florent Xicluna for the patch.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 68420
diff changeset
592 existing.sort()
58692
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
593 #We'll keep the list of existing loggers
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
594 #which are children of named loggers here...
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
595 child_loggers = []
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
596 #now set up the new ones...
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
597 loggers = config.get('loggers', EMPTY_DICT)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
598 for name in loggers:
73414
8726ad774cf0 Closes #13356. Thanks to Florent Xicluna for the patch.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 68420
diff changeset
599 name = _encoded(name)
58692
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
600 if name in existing:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
601 i = existing.index(name)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
602 prefixed = name + "."
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
603 pflen = len(prefixed)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
604 num_existing = len(existing)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
605 i = i + 1 # look at the entry after name
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
606 while (i < num_existing) and\
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
607 (existing[i][:pflen] == prefixed):
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
608 child_loggers.append(existing[i])
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
609 i = i + 1
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
610 existing.remove(name)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
611 try:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
612 self.configure_logger(name, loggers[name])
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
613 except StandardError, e:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
614 raise ValueError('Unable to configure logger '
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
615 '%r: %s' % (name, e))
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
616
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
617 #Disable any old loggers. There's no point deleting
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
618 #them as other threads may continue to hold references
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
619 #and by disabling them, you stop them doing any logging.
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
620 #However, don't disable children of named loggers, as that's
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
621 #probably not what was intended by the user.
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
622 for log in existing:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
623 logger = root.manager.loggerDict[log]
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
624 if log in child_loggers:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
625 logger.level = logging.NOTSET
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
626 logger.handlers = []
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
627 logger.propagate = True
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
628 elif disable_existing:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
629 logger.disabled = True
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
630
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
631 # And finally, do the root logger
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
632 root = config.get('root', None)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
633 if root:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
634 try:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
635 self.configure_root(root)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
636 except StandardError, e:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
637 raise ValueError('Unable to configure root '
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
638 'logger: %s' % e)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
639 finally:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
640 logging._releaseLock()
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
641
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
642 def configure_formatter(self, config):
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
643 """Configure a formatter from a dictionary."""
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
644 if '()' in config:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
645 factory = config['()'] # for use in exception handler
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
646 try:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
647 result = self.configure_custom(config)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
648 except TypeError, te:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
649 if "'format'" not in str(te):
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
650 raise
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
651 #Name of parameter changed from fmt to format.
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
652 #Retry with old name.
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
653 #This is so that code can be used with older Python versions
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
654 #(e.g. by Django)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
655 config['fmt'] = config.pop('format')
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
656 config['()'] = factory
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
657 result = self.configure_custom(config)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
658 else:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
659 fmt = config.get('format', None)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
660 dfmt = config.get('datefmt', None)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
661 result = logging.Formatter(fmt, dfmt)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
662 return result
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
663
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
664 def configure_filter(self, config):
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
665 """Configure a filter from a dictionary."""
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
666 if '()' in config:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
667 result = self.configure_custom(config)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
668 else:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
669 name = config.get('name', '')
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
670 result = logging.Filter(name)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
671 return result
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
672
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
673 def add_filters(self, filterer, filters):
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
674 """Add filters to a filterer from a list of names."""
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
675 for f in filters:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
676 try:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
677 filterer.addFilter(self.config['filters'][f])
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
678 except StandardError, e:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
679 raise ValueError('Unable to add filter %r: %s' % (f, e))
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
680
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
681 def configure_handler(self, config):
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
682 """Configure a handler from a dictionary."""
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
683 formatter = config.pop('formatter', None)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
684 if formatter:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
685 try:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
686 formatter = self.config['formatters'][formatter]
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
687 except StandardError, e:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
688 raise ValueError('Unable to set formatter '
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
689 '%r: %s' % (formatter, e))
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
690 level = config.pop('level', None)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
691 filters = config.pop('filters', None)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
692 if '()' in config:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
693 c = config.pop('()')
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
694 if not hasattr(c, '__call__') and hasattr(types, 'ClassType') and type(c) != types.ClassType:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
695 c = self.resolve(c)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
696 factory = c
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
697 else:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
698 klass = self.resolve(config.pop('class'))
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
699 #Special case for handler which refers to another handler
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
700 if issubclass(klass, logging.handlers.MemoryHandler) and\
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
701 'target' in config:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
702 try:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
703 config['target'] = self.config['handlers'][config['target']]
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
704 except StandardError, e:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
705 raise ValueError('Unable to set target handler '
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
706 '%r: %s' % (config['target'], e))
59405
d0bbbf3c55f5 Added checks for tuples in dictConfig.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 59402
diff changeset
707 elif issubclass(klass, logging.handlers.SMTPHandler) and\
d0bbbf3c55f5 Added checks for tuples in dictConfig.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 59402
diff changeset
708 'mailhost' in config:
d0bbbf3c55f5 Added checks for tuples in dictConfig.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 59402
diff changeset
709 config['mailhost'] = self.as_tuple(config['mailhost'])
d0bbbf3c55f5 Added checks for tuples in dictConfig.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 59402
diff changeset
710 elif issubclass(klass, logging.handlers.SysLogHandler) and\
d0bbbf3c55f5 Added checks for tuples in dictConfig.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 59402
diff changeset
711 'address' in config:
d0bbbf3c55f5 Added checks for tuples in dictConfig.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 59402
diff changeset
712 config['address'] = self.as_tuple(config['address'])
58692
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
713 factory = klass
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
714 kwargs = dict([(k, config[k]) for k in config if valid_ident(k)])
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
715 try:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
716 result = factory(**kwargs)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
717 except TypeError, te:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
718 if "'stream'" not in str(te):
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
719 raise
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
720 #The argument name changed from strm to stream
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
721 #Retry with old name.
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
722 #This is so that code can be used with older Python versions
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
723 #(e.g. by Django)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
724 kwargs['strm'] = kwargs.pop('stream')
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
725 result = factory(**kwargs)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
726 if formatter:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
727 result.setFormatter(formatter)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
728 if level is not None:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
729 result.setLevel(logging._checkLevel(level))
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
730 if filters:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
731 self.add_filters(result, filters)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
732 return result
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
733
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
734 def add_handlers(self, logger, handlers):
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
735 """Add handlers to a logger from a list of names."""
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
736 for h in handlers:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
737 try:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
738 logger.addHandler(self.config['handlers'][h])
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
739 except StandardError, e:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
740 raise ValueError('Unable to add handler %r: %s' % (h, e))
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
741
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
742 def common_logger_config(self, logger, config, incremental=False):
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
743 """
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
744 Perform configuration which is common to root and non-root loggers.
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
745 """
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
746 level = config.get('level', None)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
747 if level is not None:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
748 logger.setLevel(logging._checkLevel(level))
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
749 if not incremental:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
750 #Remove any existing handlers
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
751 for h in logger.handlers[:]:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
752 logger.removeHandler(h)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
753 handlers = config.get('handlers', None)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
754 if handlers:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
755 self.add_handlers(logger, handlers)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
756 filters = config.get('filters', None)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
757 if filters:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
758 self.add_filters(logger, filters)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
759
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
760 def configure_logger(self, name, config, incremental=False):
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
761 """Configure a non-root logger from a dictionary."""
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
762 logger = logging.getLogger(name)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
763 self.common_logger_config(logger, config, incremental)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
764 propagate = config.get('propagate', None)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
765 if propagate is not None:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
766 logger.propagate = propagate
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
767
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
768 def configure_root(self, config, incremental=False):
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
769 """Configure a root logger from a dictionary."""
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
770 root = logging.getLogger()
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
771 self.common_logger_config(root, config, incremental)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
772
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
773 dictConfigClass = DictConfigurator
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
774
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
775 def dictConfig(config):
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
776 """Configure logging using a dictionary."""
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
777 dictConfigClass(config).configure()
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
778
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
779
26183
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
780 def listen(port=DEFAULT_LOGGING_CONFIG_PORT):
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
781 """
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
782 Start up a socket server on the specified port, and listen for new
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
783 configurations.
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
784
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
785 These will be sent as a file suitable for processing by fileConfig().
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
786 Returns a Thread object on which you can call start() to start the server,
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
787 and which you can join() when appropriate. To stop the server, call
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
788 stopListening().
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
789 """
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
790 if not thread:
56441
6d092a51e187 Issue #7086: Added TCP support to SysLogHandler and tidied up some anachronisms in the code.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 48980
diff changeset
791 raise NotImplementedError("listen() needs threading to work")
26183
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
792
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
793 class ConfigStreamHandler(StreamRequestHandler):
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
794 """
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
795 Handler for a logging configuration request.
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
796
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
797 It expects a completely new logging configuration and uses fileConfig
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
798 to install it.
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
799 """
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
800 def handle(self):
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
801 """
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
802 Handle a request.
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
803
35024
fcf010c370cb Documentation clarified re. config socket listener protocol
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 34746
diff changeset
804 Each request is expected to be a 4-byte length, packed using
fcf010c370cb Documentation clarified re. config socket listener protocol
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 34746
diff changeset
805 struct.pack(">L", n), followed by the config file.
fcf010c370cb Documentation clarified re. config socket listener protocol
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 34746
diff changeset
806 Uses fileConfig() to do the grunt work.
26183
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
807 """
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
808 import tempfile
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
809 try:
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
810 conn = self.connection
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
811 chunk = conn.recv(4)
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
812 if len(chunk) == 4:
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
813 slen = struct.unpack(">L", chunk)[0]
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
814 chunk = self.connection.recv(slen)
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
815 while len(chunk) < slen:
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
816 chunk = chunk + conn.recv(slen - len(chunk))
36309
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
817 try:
58692
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
818 import json
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
819 d =json.loads(chunk)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
820 assert isinstance(d, dict)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
821 dictConfig(d)
36309
4dba61e49037 Refactoring for fileConfig. Contributed by Shane Hathaway.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 35024
diff changeset
822 except:
58692
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
823 #Apply new configuration.
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
824
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
825 file = cStringIO.StringIO(chunk)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
826 try:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
827 fileConfig(file)
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
828 except (KeyboardInterrupt, SystemExit):
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
829 raise
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
830 except:
f441422f6f55 Logging: Implemented PEP 391.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 56441
diff changeset
831 traceback.print_exc()
58832
dbf03eb7c12e logging: gingerly re-enabling skipped tests after improving thread sync code in configurator.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 58805
diff changeset
832 if self.server.ready:
dbf03eb7c12e logging: gingerly re-enabling skipped tests after improving thread sync code in configurator.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 58805
diff changeset
833 self.server.ready.set()
26183
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
834 except socket.error, e:
56441
6d092a51e187 Issue #7086: Added TCP support to SysLogHandler and tidied up some anachronisms in the code.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 48980
diff changeset
835 if not isinstance(e.args, tuple):
26183
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
836 raise
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
837 else:
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
838 errcode = e.args[0]
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
839 if errcode != RESET_ERROR:
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
840 raise
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
841
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
842 class ConfigSocketReceiver(ThreadingTCPServer):
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
843 """
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
844 A simple TCP socket-based logging config receiver.
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
845 """
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
846
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
847 allow_reuse_address = 1
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
848
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
849 def __init__(self, host='localhost', port=DEFAULT_LOGGING_CONFIG_PORT,
58832
dbf03eb7c12e logging: gingerly re-enabling skipped tests after improving thread sync code in configurator.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 58805
diff changeset
850 handler=None, ready=None):
26183
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
851 ThreadingTCPServer.__init__(self, (host, port), handler)
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
852 logging._acquireLock()
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
853 self.abort = 0
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
854 logging._releaseLock()
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
855 self.timeout = 1
58832
dbf03eb7c12e logging: gingerly re-enabling skipped tests after improving thread sync code in configurator.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 58805
diff changeset
856 self.ready = ready
26183
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
857
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
858 def serve_until_stopped(self):
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
859 import select
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
860 abort = 0
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
861 while not abort:
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
862 rd, wr, ex = select.select([self.socket.fileno()],
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
863 [], [],
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
864 self.timeout)
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
865 if rd:
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
866 self.handle_request()
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
867 logging._acquireLock()
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
868 abort = self.abort
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
869 logging._releaseLock()
65803
7608dcaf786d Merged revisions 86019 via svnmerge from
Brian Curtin <brian.curtin@gmail.com>
parents: 64943
diff changeset
870 self.socket.close()
26183
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
871
58757
609fa18b24bf make waiting for the server to start robust
Benjamin Peterson <benjamin@python.org>
parents: 58694
diff changeset
872 class Server(threading.Thread):
609fa18b24bf make waiting for the server to start robust
Benjamin Peterson <benjamin@python.org>
parents: 58694
diff changeset
873
609fa18b24bf make waiting for the server to start robust
Benjamin Peterson <benjamin@python.org>
parents: 58694
diff changeset
874 def __init__(self, rcvr, hdlr, port):
609fa18b24bf make waiting for the server to start robust
Benjamin Peterson <benjamin@python.org>
parents: 58694
diff changeset
875 super(Server, self).__init__()
609fa18b24bf make waiting for the server to start robust
Benjamin Peterson <benjamin@python.org>
parents: 58694
diff changeset
876 self.rcvr = rcvr
609fa18b24bf make waiting for the server to start robust
Benjamin Peterson <benjamin@python.org>
parents: 58694
diff changeset
877 self.hdlr = hdlr
609fa18b24bf make waiting for the server to start robust
Benjamin Peterson <benjamin@python.org>
parents: 58694
diff changeset
878 self.port = port
609fa18b24bf make waiting for the server to start robust
Benjamin Peterson <benjamin@python.org>
parents: 58694
diff changeset
879 self.ready = threading.Event()
26183
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
880
58757
609fa18b24bf make waiting for the server to start robust
Benjamin Peterson <benjamin@python.org>
parents: 58694
diff changeset
881 def run(self):
58832
dbf03eb7c12e logging: gingerly re-enabling skipped tests after improving thread sync code in configurator.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 58805
diff changeset
882 server = self.rcvr(port=self.port, handler=self.hdlr,
dbf03eb7c12e logging: gingerly re-enabling skipped tests after improving thread sync code in configurator.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 58805
diff changeset
883 ready=self.ready)
61172
56d831e6f508 Issue #8576: logging updated to remove usage of find_unused_port().
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 59901
diff changeset
884 if self.port == 0:
56d831e6f508 Issue #8576: logging updated to remove usage of find_unused_port().
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 59901
diff changeset
885 self.port = server.server_address[1]
58757
609fa18b24bf make waiting for the server to start robust
Benjamin Peterson <benjamin@python.org>
parents: 58694
diff changeset
886 self.ready.set()
609fa18b24bf make waiting for the server to start robust
Benjamin Peterson <benjamin@python.org>
parents: 58694
diff changeset
887 global _listener
609fa18b24bf make waiting for the server to start robust
Benjamin Peterson <benjamin@python.org>
parents: 58694
diff changeset
888 logging._acquireLock()
609fa18b24bf make waiting for the server to start robust
Benjamin Peterson <benjamin@python.org>
parents: 58694
diff changeset
889 _listener = server
609fa18b24bf make waiting for the server to start robust
Benjamin Peterson <benjamin@python.org>
parents: 58694
diff changeset
890 logging._releaseLock()
609fa18b24bf make waiting for the server to start robust
Benjamin Peterson <benjamin@python.org>
parents: 58694
diff changeset
891 server.serve_until_stopped()
609fa18b24bf make waiting for the server to start robust
Benjamin Peterson <benjamin@python.org>
parents: 58694
diff changeset
892
609fa18b24bf make waiting for the server to start robust
Benjamin Peterson <benjamin@python.org>
parents: 58694
diff changeset
893 return Server(ConfigSocketReceiver, ConfigStreamHandler, port)
26183
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
894
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
895 def stopListening():
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
896 """
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
897 Stop the listening server which was created with a call to listen().
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
898 """
26258
b19443bdf447 SF Patch #638825
Neal Norwitz <nnorwitz@gmail.com>
parents: 26218
diff changeset
899 global _listener
64943
63ba7a4e7c10 Issue #9947: logging: Fixed locking bug in stopListening.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 62028
diff changeset
900 logging._acquireLock()
63ba7a4e7c10 Issue #9947: logging: Fixed locking bug in stopListening.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 62028
diff changeset
901 try:
63ba7a4e7c10 Issue #9947: logging: Fixed locking bug in stopListening.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 62028
diff changeset
902 if _listener:
63ba7a4e7c10 Issue #9947: logging: Fixed locking bug in stopListening.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 62028
diff changeset
903 _listener.abort = 1
63ba7a4e7c10 Issue #9947: logging: Fixed locking bug in stopListening.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 62028
diff changeset
904 _listener = None
63ba7a4e7c10 Issue #9947: logging: Fixed locking bug in stopListening.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 62028
diff changeset
905 finally:
26183
f72b1f8684a2 Adding Vinay Sajip's logging package.
Guido van Rossum <guido@python.org>
parents:
diff changeset
906 logging._releaseLock()