import logging | |
import os | |
import sys | |
from datetime import datetime | |
def setup_logger(name="ankigen", log_level=logging.INFO): | |
"""Set up and return a logger with file and console handlers""" | |
# Create logger | |
logger = logging.getLogger(name) | |
logger.setLevel(log_level) | |
# Remove existing handlers if any | |
# This ensures that if setup_logger is called multiple times for the same logger name, | |
# it doesn't accumulate handlers. | |
if logger.hasHandlers(): | |
logger.handlers.clear() | |
# Create formatter | |
formatter = logging.Formatter( | |
"%(asctime)s - %(name)s - %(levelname)s - %(module)s:%(lineno)d - %(message)s" | |
) | |
# Create console handler | |
console_handler = logging.StreamHandler(sys.stdout) | |
console_handler.setFormatter(formatter) | |
logger.addHandler(console_handler) | |
# Create file handler | |
# Logs will be stored in ~/.ankigen/logs/ | |
# A new log file is created each day (e.g., ankigen_20231027.log) | |
log_dir = os.path.join(os.path.expanduser("~"), ".ankigen", "logs") | |
os.makedirs(log_dir, exist_ok=True) | |
timestamp = datetime.now().strftime("%Y%m%d") | |
log_file = os.path.join(log_dir, f"{name}_{timestamp}.log") | |
file_handler = logging.FileHandler(log_file) | |
file_handler.setFormatter(formatter) | |
logger.addHandler(file_handler) | |
return logger | |
# Create a default logger instance for easy import and use. | |
# Projects can also create their own named loggers using setup_logger(name="my_module_logger") | |
logger = setup_logger() | |