Source code for smah.logs.logs
import os
import logging
import sys
from typing import TextIO, Optional
from datetime import datetime
from smah.settings.settings import Settings
from logging.handlers import RotatingFileHandler
# Constants
DEFAULT_LOG_LEVEL = logging.DEBUG
DEFAULT_CONSOLE_LOG_LEVEL = logging.WARN
DEFAULT_MAX_BYTES = 10 ** 6
DEFAULT_BACKUP_COUNT = 3
DEFAULT_LOG_DIR = os.path.expanduser("~/.smah/logs")
[docs]
def configure(
log_level: int = DEFAULT_LOG_LEVEL,
console_log_level: Optional[int] = DEFAULT_CONSOLE_LOG_LEVEL,
log_file: Optional[str] = None,
max_bytes: int = DEFAULT_MAX_BYTES,
backup_count: int = DEFAULT_BACKUP_COUNT,
console_out: TextIO = sys.stderr
) -> None:
"""
Configure logging settings.
Args:
log_level (int): The logging level.
log_file (Optional[str]): The path to the log file.
max_bytes (int): Maximum size of the log file before rotation.
backup_count (int): Number of backup files to keep.
console_out (TextIO): The output stream for logging.
"""
console_log_level = console_log_level or log_level
if log_file is None:
log_file = os.path.join(DEFAULT_LOG_DIR, f"smah.{datetime.now().strftime('%Y%m%d_%H%M%S')}.log")
try:
os.makedirs(os.path.dirname(log_file), exist_ok=True)
except OSError as e:
logging.error("Failed to create log directory: %s", e)
raise
logging.basicConfig(
level=log_level,
format='%(asctime)s [%(levelname)s] %(pathname)s:%(lineno)d %(message)s',
handlers=[
RotatingFileHandler(
log_file,
maxBytes=max_bytes,
backupCount=backup_count
),
logging.StreamHandler(console_out)
]
)
for handler in logging.getLogger().handlers:
if isinstance(handler, logging.StreamHandler):
handler.setLevel(console_log_level)
elif isinstance(handler, RotatingFileHandler):
handler.setLevel(log_level)
logging.info("Logging Configured")