|
|
|
|
|
import os |
|
|
import logging |
|
|
from pathlib import Path |
|
|
|
|
|
def setup_logging( |
|
|
logger_name, |
|
|
log_level=logging.INFO, |
|
|
console=True, |
|
|
log_filename=None |
|
|
): |
|
|
""" |
|
|
Configure logging for a module or application. |
|
|
|
|
|
This function provides a flexible logging setup that automatically |
|
|
manages log file creation and configuration. |
|
|
|
|
|
Args: |
|
|
logger_name (str): Name of the logger. Used to generate log filename |
|
|
if no specific filename is provided. |
|
|
log_level (int, optional): Logging level. |
|
|
Defaults to logging.INFO. |
|
|
Can use standard logging levels like: |
|
|
- logging.DEBUG |
|
|
- logging.INFO |
|
|
- logging.WARNING |
|
|
- logging.ERROR |
|
|
- logging.CRITICAL |
|
|
console (bool, optional): Whether to enable console logging. |
|
|
Defaults to True. |
|
|
log_filename (str or Path, optional): Custom log filename. |
|
|
If None, uses logger_name to generate filename. |
|
|
|
|
|
Returns: |
|
|
logging.Logger: Configured logger instance with file and/or console handlers. |
|
|
""" |
|
|
|
|
|
log_dir = Path("./data/logs") |
|
|
log_dir.mkdir(parents=True, exist_ok=True) |
|
|
|
|
|
|
|
|
logger = logging.getLogger(logger_name) |
|
|
logger.setLevel(log_level) |
|
|
|
|
|
|
|
|
if logger.handlers: |
|
|
logger.handlers.clear() |
|
|
|
|
|
|
|
|
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') |
|
|
|
|
|
|
|
|
if log_filename: |
|
|
|
|
|
log_filename = Path(log_filename) |
|
|
log_file = log_dir / log_filename.name |
|
|
else: |
|
|
|
|
|
log_file = log_dir / f"{logger_name.lower()}.log" |
|
|
|
|
|
|
|
|
file_handler = logging.FileHandler(log_file) |
|
|
file_handler.setFormatter(formatter) |
|
|
logger.addHandler(file_handler) |
|
|
|
|
|
|
|
|
if console: |
|
|
console_handler = logging.StreamHandler() |
|
|
console_handler.setFormatter(formatter) |
|
|
logger.addHandler(console_handler) |
|
|
|
|
|
|
|
|
print(f"Logging configuration:") |
|
|
print(f" Logger name: {logger_name}") |
|
|
print(f" Log level: {logging.getLevelName(log_level)}") |
|
|
print(f" Log file: {log_file}") |
|
|
|
|
|
logger.info(f"Logging configured for {logger_name}") |
|
|
|
|
|
return logger |