| import logging |
| import logging.handlers |
| from pathlib import Path |
|
|
| LOG_DIR = Path("logs") |
| LOG_DIR.mkdir(exist_ok=True) |
|
|
| LOG_FILE = LOG_DIR / "advisor.log" |
|
|
| LOG_FORMAT = ( |
| "%(asctime)s | %(levelname)s | %(name)s | " |
| "%(funcName)s:%(lineno)d | %(message)s" |
| ) |
|
|
| DATE_FORMAT = "%Y-%m-%d %H:%M:%S" |
|
|
|
|
| def setup_logging(log_level=logging.INFO): |
| """Global logging configuration""" |
|
|
| root_logger = logging.getLogger() |
| root_logger.setLevel(log_level) |
|
|
| |
| if root_logger.handlers: |
| return |
|
|
| formatter = logging.Formatter(LOG_FORMAT, DATE_FORMAT) |
|
|
| |
| file_handler = logging.handlers.RotatingFileHandler( |
| LOG_FILE, |
| maxBytes=10 * 1024 * 1024, |
| backupCount=5, |
| encoding="utf-8", |
| ) |
| file_handler.setFormatter(formatter) |
| file_handler.setLevel(log_level) |
|
|
| |
| console_handler = logging.StreamHandler() |
| console_handler.setFormatter(formatter) |
| console_handler.setLevel(log_level) |
|
|
| root_logger.addHandler(file_handler) |
| root_logger.addHandler(console_handler) |
|
|
|
|
| def get_logger(name: str) -> logging.Logger: |
| """Get a named logger""" |
| return logging.getLogger(name) |
|
|