| import logging |
| import sys |
| from logging.handlers import RotatingFileHandler |
| from pathlib import Path |
|
|
|
|
| def setup_logger( |
| logger_name: str = "app", |
| log_file: str = "app.log", |
| level: int = logging.INFO, |
| log_format: str = "%(asctime)s - %(name)s - %(levelname)s - %(message)s", |
| max_bytes: int = 5_242_880, |
| backup_count: int = 3 |
| ) -> logging.Logger: |
| """ |
| Configure and return a logger with both file and console handlers. |
| |
| Args: |
| logger_name: Name of the logger |
| log_file: Path to the log file |
| level: Logging level |
| log_format: Format string for log messages |
| max_bytes: Maximum size of log file before rotation |
| backup_count: Number of backup files to keep |
| |
| Returns: |
| logging.Logger: Configured logger instance |
| """ |
| |
| logger = logging.getLogger(logger_name) |
| logger.setLevel(level) |
|
|
| |
| formatter = logging.Formatter(log_format) |
|
|
| |
| log_path = Path(log_file) |
| log_path.parent.mkdir(parents=True, exist_ok=True) |
|
|
| |
| file_handler = RotatingFileHandler( |
| log_file, |
| maxBytes=max_bytes, |
| backupCount=backup_count, |
| encoding='utf-8' |
| ) |
| file_handler.setFormatter(formatter) |
| file_handler.setLevel(level) |
|
|
| |
| console_handler = logging.StreamHandler(sys.stdout) |
| console_handler.setFormatter(formatter) |
| console_handler.setLevel(level) |
|
|
| |
| if not logger.handlers: |
| logger.addHandler(file_handler) |
| logger.addHandler(console_handler) |
|
|
| return logger |
|
|
|
|
| |
| if __name__ == "__main__": |
| |
| logger = setup_logger() |
| logger.info("Basic logger initialized") |
|
|
| |
| custom_logger = setup_logger( |
| logger_name="custom_app", |
| log_file="logs/custom.log", |
| level=logging.DEBUG, |
| log_format="%(asctime)s [%(levelname)s] %(name)s: %(message)s", |
| max_bytes=1_048_576, |
| backup_count=5 |
| ) |
| custom_logger.debug("Custom logger initialized") |
| custom_logger.info("This is an info message") |
| custom_logger.warning("This is a warning message") |
| custom_logger.error("This is an error message") |