|
29 | 29 | logger = logging.getLogger("modelopt.onnx.autocast") |
30 | 30 |
|
31 | 31 |
|
32 | | -def configure_logging(level=logging.INFO, log_file=None): |
| 32 | +def configure_logging(level=None, log_file=None): |
33 | 33 | """Configure logging for all AutoCast components. |
34 | 34 |
|
| 35 | + If logging level is provided, it will be used regardless of parent logger log level. |
| 36 | + Otherwise, inherits from parent logger if exists, or fallback to default: logging.INFO. |
| 37 | +
|
35 | 38 | Args: |
36 | 39 | level: The logging level to use. Can be a string (e.g., "DEBUG", "INFO") or |
37 | | - a logging constant (e.g., logging.DEBUG). Default: logging.INFO. |
| 40 | + a logging constant (e.g., logging.DEBUG) default: None. |
38 | 41 | log_file: Optional path to a log file. If provided, logs will be written to this file |
39 | 42 | in addition to stdout (default: None). |
40 | 43 | """ |
41 | 44 | # Check if parent logger (modelopt.onnx) already has handlers configured |
42 | 45 | parent_logger = logging.getLogger("modelopt.onnx") |
43 | 46 | parent_has_handlers = len(parent_logger.handlers) > 0 |
44 | 47 |
|
45 | | - # If parent is configured and no explicit level provided, inherit parent's level |
46 | | - if parent_has_handlers and level == logging.INFO: |
47 | | - level = parent_logger.level |
| 48 | + # Determine the logging level to use |
| 49 | + if level is None: |
| 50 | + # No explicit level provided - inherit from parent or use default |
| 51 | + if parent_has_handlers: |
| 52 | + level = parent_logger.level |
| 53 | + else: |
| 54 | + level = logging.INFO |
| 55 | + # else: use the provided level as-is |
48 | 56 |
|
49 | 57 | # Set level for the autocast logger (accepts both string and int) |
50 | 58 | logger.setLevel(level) |
51 | 59 |
|
| 60 | + # If parent has handlers (standalone mode), also update parent's level |
| 61 | + # so the parent's console handler respects the autocast log level |
| 62 | + if parent_has_handlers: |
| 63 | + parent_logger.setLevel(level) |
| 64 | + |
52 | 65 | # Remove any existing handlers to ensure clean configuration |
53 | 66 | for handler in logger.handlers[:]: |
54 | 67 | logger.removeHandler(handler) |
@@ -82,7 +95,8 @@ def configure_logging(level=logging.INFO, log_file=None): |
82 | 95 | console_handler = logging.StreamHandler(sys.stdout) |
83 | 96 | console_handler.setFormatter(formatter) |
84 | 97 | logger.addHandler(console_handler) |
85 | | - logger.propagate = False |
| 98 | + # Always propagate to support pytest's caplog fixture in tests |
| 99 | + logger.propagate = True |
86 | 100 |
|
87 | 101 | # Ensure all child loggers inherit the level setting |
88 | 102 | for name in logging.root.manager.loggerDict: |
|
0 commit comments