Configure stderr + rotating file logging. File handler creation is best-effort: if the log directory cannot be created or the file cannot be opened, logging falls back to stderr only.
(level: int)
| 804 | |
| 805 | |
| 806 | def _setup_logging(level: int) -> None: |
| 807 | """Configure stderr + rotating file logging. |
| 808 | |
| 809 | File handler creation is best-effort: if the log directory cannot be |
| 810 | created or the file cannot be opened, logging falls back to stderr only. |
| 811 | """ |
| 812 | handlers: list[logging.Handler] = [logging.StreamHandler()] |
| 813 | |
| 814 | try: |
| 815 | log_path = get_log_path() |
| 816 | log_path.parent.mkdir(parents=True, exist_ok=True) |
| 817 | file_handler = RotatingFileHandler( |
| 818 | log_path, |
| 819 | maxBytes=LOG_MAX_BYTES, |
| 820 | backupCount=LOG_BACKUP_COUNT, |
| 821 | delay=True, |
| 822 | ) |
| 823 | file_handler.setFormatter(logging.Formatter(LOG_FORMAT)) |
| 824 | handlers.append(file_handler) |
| 825 | except OSError as e: |
| 826 | # Fall back to stderr-only; warn after basicConfig sets up the handler |
| 827 | logging.basicConfig(level=level, format=LOG_FORMAT, handlers=handlers, force=True) |
| 828 | logger.warning(f"Failed to set up file logging: {e}") |
| 829 | return |
| 830 | |
| 831 | logging.basicConfig(level=level, format=LOG_FORMAT, handlers=handlers, force=True) |
| 832 | |
| 833 | |
| 834 | def main() -> None: |