Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
340a4bb2
Commit
340a4bb2
authored
Mar 22, 2013
by
Vinay Sajip
Browse files
Options
Browse Files
Download
Plain Diff
Issue #17508: Merged fix from 3.2.
parents
8f35c891
3f885b54
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
61 additions
and
6 deletions
+61
-6
Lib/logging/config.py
Lib/logging/config.py
+24
-4
Lib/test/test_logging.py
Lib/test/test_logging.py
+37
-2
No files found.
Lib/logging/config.py
View file @
340a4bb2
# Copyright 2001-201
0
by Vinay Sajip. All Rights Reserved.
# Copyright 2001-201
3
by Vinay Sajip. All Rights Reserved.
#
# Permission to use, copy, modify, and distribute this software and its
# documentation for any purpose and without fee is hereby granted,
...
...
@@ -19,7 +19,7 @@ Configuration functions for the logging package for Python. The core package
is based on PEP 282 and comments thereto in comp.lang.python, and influenced
by Apache's log4j system.
Copyright (C) 2001-201
0
Vinay Sajip. All Rights Reserved.
Copyright (C) 2001-201
3
Vinay Sajip. All Rights Reserved.
To use, simply 'import logging' and log away!
"""
...
...
@@ -561,7 +561,21 @@ class DictConfigurator(BaseConfigurator):
# As handlers can refer to other handlers, sort the keys
# to allow a deterministic order of configuration
handlers = config.get('handlers', EMPTY_DICT)
deferred = []
for name in sorted(handlers):
try:
handler = self.configure_handler(handlers[name])
handler.name = name
handlers[name] = handler
except Exception as e:
if 'target not configured yet' in str(e):
deferred.append(name)
else:
raise ValueError('Unable to configure handler '
'%r: %s' % (name, e))
# Now do any that were deferred
for name in deferred:
try:
handler = self.configure_handler(handlers[name])
handler.name = name
...
...
@@ -569,6 +583,7 @@ class DictConfigurator(BaseConfigurator):
except Exception as e:
raise ValueError('Unable to configure handler '
'%r: %s' % (name, e))
# Next, do loggers - they refer to handlers and filters
#we don't want to lose the existing loggers,
...
...
@@ -691,12 +706,17 @@ class DictConfigurator(BaseConfigurator):
c = self.resolve(c)
factory = c
else:
klass = self.resolve(config.pop('class'))
cname = config.pop('class')
klass = self.resolve(cname)
#Special case for handler which refers to another handler
if issubclass(klass, logging.handlers.MemoryHandler) and
\
'target' in config:
try:
config['target'] = self.config['handlers'][config['target']]
th = self.config['handlers'][config['target']]
if not isinstance(th, logging.Handler):
config['class'] = cname # restore for deferred configuration
raise TypeError('target not configured yet')
config['target'] = th
except Exception as e:
raise ValueError('Unable to set target handler '
'%r: %s' % (config['target'], e))
...
...
Lib/test/test_logging.py
View file @
340a4bb2
#!/usr/bin/env python
#
# Copyright 2001-201
2
by Vinay Sajip. All Rights Reserved.
# Copyright 2001-201
3
by Vinay Sajip. All Rights Reserved.
#
# Permission to use, copy, modify, and distribute this software and its
# documentation for any purpose and without fee is hereby granted,
...
...
@@ -18,7 +18,7 @@
"""Test harness for the logging module. Run all tests.
Copyright (C) 2001-201
2
Vinay Sajip. All Rights Reserved.
Copyright (C) 2001-201
3
Vinay Sajip. All Rights Reserved.
"""
import
logging
...
...
@@ -2364,6 +2364,36 @@ class ConfigDictTest(BaseTest):
},
}
out_of_order = {
"
version
": 1,
"
formatters
": {
"
mySimpleFormatter
": {
"
format
": "
%
(
asctime
)
s
(
%
(
name
)
s
)
%
(
levelname
)
s
:
%
(
message
)
s
"
}
},
"
handlers
": {
"
fileGlobal
": {
"
class
": "
logging
.
StreamHandler
",
"
level
": "
DEBUG
",
"
formatter
": "
mySimpleFormatter
"
},
"
bufferGlobal
": {
"
class
": "
logging
.
handlers
.
MemoryHandler
",
"
capacity
": 5,
"
formatter
": "
mySimpleFormatter
",
"
target
": "
fileGlobal
",
"
level
": "
DEBUG
"
}
},
"
loggers
": {
"
mymodule
": {
"
level
": "
DEBUG
",
"
handlers
": ["
bufferGlobal
"],
"
propagate
": "
true
"
}
}
}
def apply_config(self, conf):
logging.config.dictConfig(conf)
...
...
@@ -2664,6 +2694,11 @@ class ConfigDictTest(BaseTest):
# Original logger output is empty.
self.assert_log_lines([])
def test_out_of_order(self):
self.apply_config(self.out_of_order)
handler = logging.getLogger('mymodule').handlers[0]
self.assertIsInstance(handler.target, logging.Handler)
def test_baseconfig(self):
d = {
'atuple': (1, 2, 3),
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment