Mercurial > cpython-lru_cache-weakref
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 |
| 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 | 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() |
