|
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