# logbus/publisher.py import logging import os logger = logging.getLogger("logbus") logger.setLevel(logging.WARNING) # ============================================================ # FILE LOGGER — log.txt in BOOKSCRAPER_OUTPUT_DIR # ============================================================ try: root = os.getenv("BOOKSCRAPER_OUTPUT_DIR", "output") os.makedirs(root, exist_ok=True) file_path = os.path.join(root, "log.txt") file_handler = logging.FileHandler(file_path, mode="a", encoding="utf-8") file_formatter = logging.Formatter("%(message)s") # exact zoals input file_handler.setFormatter(file_formatter) logger.addHandler(file_handler) except Exception: # Logging naar file mag nooit de app laten crashen pass def log(message: str): """ Dumb logger: - skip lege messages - stuur message 1:1 door - geen prefixes - geen mutaties """ if not message or not message.strip(): return # console logger.warning(message) # UI-echo try: from scraper.ui_log import push_ui push_ui(message) except Exception: pass # ============================================================ # Delta-based log retrieval using Redis indexes # ============================================================ def get_ui_logs_delta(last_index: int): """ Returns (new_lines, total_count) Only returns log lines AFTER last_index. Example: last_index = 10 → returns logs with Redis indexes 11..end """ # Determine total lines in buffer total = r.llen(UI_LOG_KEY) if total == 0: return [], 0 # First load OR index invalid → send entire buffer if last_index < 0 or last_index >= total: logs = r.lrange(UI_LOG_KEY, 0, -1) return logs, total # Only new lines: new_lines = r.lrange(UI_LOG_KEY, last_index + 1, -1) return new_lines, total