Phase 1 : socle Python, schéma SQLite + FTS5, modèles pydantic
- pyproject/uv sur Python 3.12, dépendances épinglées - migrations versionnées (PRAGMA user_version) ; 001_initial pose textes, sources, evenements, decisions_cc, insights, veille_log, veille_changements - index FTS5 à contenu externe, tokenizer unicode61 remove_diacritics 2 : « chlordecone » retrouve « chlordécone », highlight() disponible - vue v_textes : devant_cc combine le statut et les affaires CC en instance, ce qui réconcilie le §7 (Riposte reste adoptee_non_promulguee) et le §8.7 (la facette saisie_cc doit remonter ≥ 7 textes) - modèles pydantic refusant les incohérences de statut : promulguée sans numéro, navette avec numéro officiel, slug malformé - Makefile, .env.example, journalisation structlog Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
3ce7d17db9
commit
31d3935bce
@@ -0,0 +1,39 @@
|
||||
"""Journalisation structurée du pipeline.
|
||||
|
||||
Sortie lisible en console pour les exécutions manuelles, JSON lorsque la sortie
|
||||
n'est pas un terminal (systemd, redirections) afin que `journalctl` reste
|
||||
exploitable.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import logging
|
||||
import sys
|
||||
|
||||
import structlog
|
||||
|
||||
|
||||
def configurer(niveau: str = "INFO") -> None:
|
||||
"""Configure structlog une fois pour toute l'exécution."""
|
||||
logging.basicConfig(format="%(message)s", stream=sys.stdout, level=niveau)
|
||||
|
||||
processeurs: list = [
|
||||
structlog.contextvars.merge_contextvars,
|
||||
structlog.processors.add_log_level,
|
||||
structlog.processors.TimeStamper(fmt="%Y-%m-%d %H:%M:%S", utc=False),
|
||||
]
|
||||
if sys.stdout.isatty():
|
||||
processeurs.append(structlog.dev.ConsoleRenderer(colors=True))
|
||||
else:
|
||||
processeurs.append(structlog.processors.JSONRenderer(ensure_ascii=False))
|
||||
|
||||
structlog.configure(
|
||||
processors=processeurs,
|
||||
wrapper_class=structlog.make_filtering_bound_logger(getattr(logging, niveau)),
|
||||
logger_factory=structlog.PrintLoggerFactory(),
|
||||
cache_logger_on_first_use=True,
|
||||
)
|
||||
|
||||
|
||||
def logger(nom: str) -> structlog.stdlib.BoundLogger:
|
||||
return structlog.get_logger(nom)
|
||||
Reference in New Issue
Block a user