77 lines
2.8 KiB
Python
77 lines
2.8 KiB
Python
import logging
|
|
import os
|
|
from logging.handlers import RotatingFileHandler
|
|
|
|
|
|
class LoggerConfig:
|
|
"""A class to configure logging for the Flask application."""
|
|
|
|
LOG_DIR = "logs" # Define the log directory
|
|
|
|
@staticmethod
|
|
def init_logger(app, production_mode=False):
|
|
"""
|
|
Initializes separate log files for INFO, ERROR, and WARNING levels.
|
|
|
|
Args:
|
|
app: Flask application instance
|
|
production_mode (bool): If True, disables console output and only logs to files
|
|
"""
|
|
# Ensure the logs directory exists
|
|
if not os.path.exists(LoggerConfig.LOG_DIR):
|
|
os.makedirs(LoggerConfig.LOG_DIR)
|
|
|
|
# Remove default handlers to prevent duplicate logging
|
|
for handler in app.logger.handlers[:]:
|
|
app.logger.removeHandler(handler)
|
|
|
|
# Disable propagation to root logger to prevent console output in production
|
|
if production_mode:
|
|
app.logger.propagate = False
|
|
|
|
# Create separate loggers
|
|
info_handler = LoggerConfig._setup_logger(
|
|
"info_logger", "info.log", logging.INFO, logging.WARNING
|
|
)
|
|
error_handler = LoggerConfig._setup_logger(
|
|
"error_logger", "error.log", logging.ERROR, logging.CRITICAL
|
|
)
|
|
warning_handler = LoggerConfig._setup_logger(
|
|
"warning_logger", "warning.log", logging.WARNING, logging.WARNING
|
|
)
|
|
|
|
# Attach handlers to Flask app logger
|
|
app.logger.addHandler(info_handler)
|
|
app.logger.addHandler(error_handler)
|
|
app.logger.addHandler(warning_handler)
|
|
app.logger.setLevel(logging.DEBUG) # Set lowest level to capture all logs
|
|
|
|
# Add console handler only in development mode
|
|
if not production_mode:
|
|
console_handler = logging.StreamHandler()
|
|
console_handler.setLevel(logging.DEBUG)
|
|
console_formatter = logging.Formatter(
|
|
"%(asctime)s - %(levelname)s - %(message)s"
|
|
)
|
|
console_handler.setFormatter(console_formatter)
|
|
app.logger.addHandler(console_handler)
|
|
|
|
app.logger.info("Logger has been initialized for Flask application.")
|
|
|
|
@staticmethod
|
|
def _setup_logger(name, filename, level, max_level):
|
|
"""Helper method to configure loggers for specific levels."""
|
|
logger = logging.getLogger(name)
|
|
logger.setLevel(level)
|
|
|
|
log_file_path = os.path.join(LoggerConfig.LOG_DIR, filename)
|
|
log_handler = RotatingFileHandler(log_file_path, maxBytes=100000, backupCount=3)
|
|
log_handler.setLevel(level)
|
|
|
|
log_formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s")
|
|
log_handler.setFormatter(log_formatter)
|
|
log_handler.addFilter(lambda record: level <= record.levelno <= max_level)
|
|
|
|
logger.addHandler(log_handler)
|
|
return log_handler
|