spb/trouve-ka Public
Trouve-KA — moteur de recherche web indépendant, Québec-first. Crawler distribué, index OpenSearch, ranking bilingue, galerie d'images. En prod : www.trouve-ka.com
Python 76.8%
TypeScript 15.7%
SQL 3.9%
Shell 1.4%
CSS 1.3%
Dockerfile 0.7%
1# Trouve-KA — logging structuré JSON2# Author: Simon-Pierre Boucher3# Contact: contact@spboucher.ai45"""Logs structurés (JSON une ligne) avec contexte crawl_id/url_id/domain_id/worker_id."""67import json8import logging9import sys10import time11from typing import Any121314class JsonFormatter(logging.Formatter):15 def format(self, record: logging.LogRecord) -> str:16 payload: dict[str, Any] = {17 "ts": round(time.time(), 3),18 "level": record.levelname.lower(),19 "logger": record.name,20 "msg": record.getMessage(),21 }22 extra = getattr(record, "ctx", None)23 if isinstance(extra, dict):24 payload.update(extra)25 if record.exc_info and record.exc_info[0] is not None:26 payload["exc"] = self.formatException(record.exc_info)27 return json.dumps(payload, ensure_ascii=False, default=str)282930def get_logger(name: str) -> logging.Logger:31 """Retourne un logger JSON prêt à l'emploi. Utiliser `log.info("msg", extra={"ctx": {...}})`."""32 logger = logging.getLogger(name)33 if not logger.handlers:34 handler = logging.StreamHandler(sys.stdout)35 handler.setFormatter(JsonFormatter())36 logger.addHandler(handler)37 logger.setLevel(logging.INFO)38 logger.propagate = False39 return logger40