|
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 | """ |
@@ -564,14 +564,29 @@ def configure(self): |
564 | 564 | # As handlers can refer to other handlers, sort the keys |
565 | 565 | # to allow a deterministic order of configuration |
566 | 566 | handlers = config.get('handlers', EMPTY_DICT) |
| 567 | + deferred = [] |
567 | 568 | for name in sorted(handlers): |
| 569 | + try: |
| 570 | + handler = self.configure_handler(handlers[name]) |
| 571 | + handler.name = name |
| 572 | + handlers[name] = handler |
| 573 | + except Exception as e: |
| 574 | + if 'target not configured yet' in str(e): |
| 575 | + deferred.append(name) |
| 576 | + else: |
| 577 | + raise ValueError('Unable to configure handler ' |
| 578 | + '%r: %s' % (name, e)) |
| 579 | + |
| 580 | + # Now do any that were deferred |
| 581 | + for name in deferred: |
568 | 582 | try: |
569 | 583 | handler = self.configure_handler(handlers[name]) |
570 | 584 | handler.name = name |
571 | 585 | handlers[name] = handler |
572 | 586 | except Exception as e: |
573 | 587 | raise ValueError('Unable to configure handler ' |
574 | 588 | '%r: %s' % (name, e)) |
| 589 | + |
575 | 590 | # Next, do loggers - they refer to handlers and filters |
576 | 591 |
|
577 | 592 | #we don't want to lose the existing loggers, |
@@ -694,12 +709,17 @@ def configure_handler(self, config): |
694 | 709 | c = self.resolve(c) |
695 | 710 | factory = c |
696 | 711 | else: |
697 | | - klass = self.resolve(config.pop('class')) |
| 712 | + cname = config.pop('class') |
| 713 | + klass = self.resolve(cname) |
698 | 714 | #Special case for handler which refers to another handler |
699 | 715 | if issubclass(klass, logging.handlers.MemoryHandler) and\ |
700 | 716 | 'target' in config: |
701 | 717 | try: |
702 | | - config['target'] = self.config['handlers'][config['target']] |
| 718 | + th = self.config['handlers'][config['target']] |
| 719 | + if not isinstance(th, logging.Handler): |
| 720 | + config['class'] = cname # restore for deferred configuration |
| 721 | + raise TypeError('target not configured yet') |
| 722 | + config['target'] = th |
703 | 723 | except Exception as e: |
704 | 724 | raise ValueError('Unable to set target handler ' |
705 | 725 | '%r: %s' % (config['target'], e)) |
|
0 commit comments