|
1 |
| -# Copyright 2001-2010 by Vinay Sajip. All Rights Reserved. |
| 1 | +# Copyright 2001-2013 by Vinay Sajip. All Rights Reserved. |
2 | 2 | #
|
3 | 3 | # Permission to use, copy, modify, and distribute this software and its
|
4 | 4 | # documentation for any purpose and without fee is hereby granted,
|
|
19 | 19 | is based on PEP 282 and comments thereto in comp.lang.python, and influenced
|
20 | 20 | by Apache's log4j system.
|
21 | 21 |
|
22 |
| -Copyright (C) 2001-2010 Vinay Sajip. All Rights Reserved. |
| 22 | +Copyright (C) 2001-2013 Vinay Sajip. All Rights Reserved. |
23 | 23 |
|
24 | 24 | To use, simply 'import logging' and log away!
|
25 | 25 | """
|
@@ -561,14 +561,29 @@ def configure(self):
|
561 | 561 | # As handlers can refer to other handlers, sort the keys
|
562 | 562 | # to allow a deterministic order of configuration
|
563 | 563 | handlers = config.get('handlers', EMPTY_DICT)
|
| 564 | + deferred = [] |
564 | 565 | for name in sorted(handlers):
|
| 566 | + try: |
| 567 | + handler = self.configure_handler(handlers[name]) |
| 568 | + handler.name = name |
| 569 | + handlers[name] = handler |
| 570 | + except Exception as e: |
| 571 | + if 'target not configured yet' in str(e): |
| 572 | + deferred.append(name) |
| 573 | + else: |
| 574 | + raise ValueError('Unable to configure handler ' |
| 575 | + '%r: %s' % (name, e)) |
| 576 | + |
| 577 | + # Now do any that were deferred |
| 578 | + for name in deferred: |
565 | 579 | try:
|
566 | 580 | handler = self.configure_handler(handlers[name])
|
567 | 581 | handler.name = name
|
568 | 582 | handlers[name] = handler
|
569 | 583 | except Exception as e:
|
570 | 584 | raise ValueError('Unable to configure handler '
|
571 | 585 | '%r: %s' % (name, e))
|
| 586 | + |
572 | 587 | # Next, do loggers - they refer to handlers and filters
|
573 | 588 |
|
574 | 589 | #we don't want to lose the existing loggers,
|
@@ -691,12 +706,17 @@ def configure_handler(self, config):
|
691 | 706 | c = self.resolve(c)
|
692 | 707 | factory = c
|
693 | 708 | else:
|
694 |
| - klass = self.resolve(config.pop('class')) |
| 709 | + cname = config.pop('class') |
| 710 | + klass = self.resolve(cname) |
695 | 711 | #Special case for handler which refers to another handler
|
696 | 712 | if issubclass(klass, logging.handlers.MemoryHandler) and\
|
697 | 713 | 'target' in config:
|
698 | 714 | try:
|
699 |
| - config['target'] = self.config['handlers'][config['target']] |
| 715 | + th = self.config['handlers'][config['target']] |
| 716 | + if not isinstance(th, logging.Handler): |
| 717 | + config['class'] = cname # restore for deferred configuration |
| 718 | + raise TypeError('target not configured yet') |
| 719 | + config['target'] = th |
700 | 720 | except Exception as e:
|
701 | 721 | raise ValueError('Unable to set target handler '
|
702 | 722 | '%r: %s' % (config['target'], e))
|
|
0 commit comments