| """ |
| logger.py |
| --------- |
| Logging setup for training and evaluation runs. |
| """ |
|
|
| import logging |
| import sys |
| from pathlib import Path |
| from typing import Optional |
|
|
|
|
| def setup_logger( |
| name: str, |
| log_file: Optional[str] = None, |
| level: int = logging.INFO, |
| ) -> logging.Logger: |
| """ |
| Create and configure a logger. |
| |
| Args: |
| name: logger name |
| log_file: optional path to write logs to file |
| level: logging level |
| |
| Returns: |
| Configured logger |
| """ |
| logger = logging.getLogger(name) |
| logger.setLevel(level) |
|
|
| |
| if logger.handlers: |
| return logger |
|
|
| formatter = logging.Formatter( |
| fmt = "[%(asctime)s] [%(name)s] [%(levelname)s] %(message)s", |
| datefmt = "%Y-%m-%d %H:%M:%S", |
| ) |
|
|
| |
| console_handler = logging.StreamHandler(sys.stdout) |
| console_handler.setLevel(level) |
| console_handler.setFormatter(formatter) |
| logger.addHandler(console_handler) |
|
|
| |
| if log_file is not None: |
| Path(log_file).parent.mkdir(parents=True, exist_ok=True) |
| file_handler = logging.FileHandler(log_file) |
| file_handler.setLevel(level) |
| file_handler.setFormatter(formatter) |
| logger.addHandler(file_handler) |
|
|
| return logger |
|
|