| 29 | } |
| 30 | |
| 31 | def format(self, record: logging.LogRecord) -> str: |
| 32 | level_color = self.level_colors.get(record.levelno, "white") |
| 33 | level_name = record.levelname.replace("WARNING", "WARN") |
| 34 | |
| 35 | # Calculate the prefix length for indentation |
| 36 | prefix = f"{self.emoji}{level_name} [{record.name}] " |
| 37 | indent = " " * len(prefix) |
| 38 | |
| 39 | text = Text() |
| 40 | text.append(self.emoji, style="white") |
| 41 | text.append(f"{level_name} ", style=level_color) |
| 42 | text.append(f"[{record.name}] ", style="dim") |
| 43 | |
| 44 | # Handle multiline messages by indenting continuation lines |
| 45 | message = record.getMessage() |
| 46 | lines = message.split("\n") |
| 47 | text.append(lines[0], style="white") |
| 48 | |
| 49 | for line in lines[1:]: |
| 50 | text.append("\n") |
| 51 | text.append(indent, style="dim") |
| 52 | text.append(line, style="white") |
| 53 | |
| 54 | if record.exc_info: |
| 55 | text.append("\n") |
| 56 | exception_lines = self.formatException(record.exc_info).split("\n") |
| 57 | for i, exc_line in enumerate(exception_lines): |
| 58 | if i > 0: |
| 59 | text.append("\n") |
| 60 | text.append(indent, style="dim") |
| 61 | text.append(exc_line, style="red") |
| 62 | |
| 63 | with self.console.capture() as capture: |
| 64 | self.console.print(text) |
| 65 | return capture.get().rstrip() |
| 66 | |
| 67 | |
| 68 | def add_file_handler(logger: logging.Logger, log_path: Path) -> logging.FileHandler: |