Skip to content

feat(logs): passer les logs au format logfmt conseillé par le CSIRT#90

Merged
damienlethiec merged 3 commits into
mainfrom
feat/logs-logfmt-csirt
Jul 15, 2026
Merged

feat(logs): passer les logs au format logfmt conseillé par le CSIRT#90
damienlethiec merged 3 commits into
mainfrom
feat/logs-logfmt-csirt

Conversation

@damienlethiec

Copy link
Copy Markdown
Collaborator

Contexte

Le CSIRT recommande un format de log structuré, parsable par le SIEM. Les logs
Rails par défaut (multi-lignes, texte brut) ne le sont pas. Cette MR met l'app
V2 (API + Portail) en conformité, en s'inspirant de la MR admin-portal !178.

Changements

  • Ajout de rails_semantic_logger : remplace la stack de log Rails.
  • Production : logfmt vers STDOUT, request_id exposé en tag nommé
    (request_id=…) — une ligne structurée par requête au niveau info.
  • Test : logfmt vers log/test.log (exerce la vraie sérialisation sans
    polluer la sortie RSpec).
  • Développement : format couleur lisible, avec RAILS_LOG_LEVEL et
    LOG_FORMAT surchargeables pour prévisualiser le rendu prod en local.
  • silence_healthcheck_path = "/up" préservé (middleware séparé en Rails 8.1,
    indépendant du logger swappé).

Points de décision

  • logfmt plutôt que JSON (conforme au conseil CSIRT). Bascule JSON triviale
    si besoin sur les cas complexes type backtraces : formatter: :json, sans
    refonte.
  • rails_semantic_logger plutôt que lograge : couvre tous les logs (pas
    seulement les requêtes) et fournit l'event logging nativement ; les deux
    outils sont par ailleurs incompatibles (même subscriber).

Tests

  • Spec de config (spec/config/logging_spec.rb) : tous les appenders
    sérialisent en logfmt.
  • bin/ci vert : 175 exemples / 0 échec, couverture 98,0 %, brakeman +
    bundler-audit + importmap clean, Cucumber E2E + seeds OK.
  • Vérif manuelle : rendu logfmt réel (requête + exception) exercé en local.

Points d'attention

  • Warning de dépréciation au boot : ActiveSupport::Configurable is deprecated
    — émis par la railtie de rails_semantic_logger, pas par notre code. Sans
    impact fonctionnel en Rails 8.1 ; à surveiller avant un passage à Rails 8.2
    (Renovate remontera le bump gem correctif).

Refs

  • #324
  • Inspiré de admin-portal !178

@damienlethiec
damienlethiec requested a review from julienanne July 11, 2026 21:15
@damienlethiec damienlethiec self-assigned this Jul 11, 2026

@julienanne julienanne left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Rien qui nécessite que je repasse dessus ;)

# est exposé comme tag nommé pour apparaître en `request_id=…` sur chaque ligne.
# rails_semantic_logger remplace la stack de log ; l'appender `add` est créé dans
# tous les process (web, jobs, rake), pas seulement en mode serveur.
config.log_tags = {request_id: :request_id}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On le met pas dans les env de dev et de test ?

Comment thread spec/config/logging_spec.rb Outdated
RSpec.describe "Structured logging configuration" do
it "formats every log through the logfmt formatter recommended by the CSIRT" do
formatters = SemanticLogger.appenders.map(&:formatter)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Aucune idée si c'est possible mais j'aurais bien testé une ligne de log et aussi le request_id mais je ne suis pas sur que ce soit facilement testable capture de sortie and co jamais simple avec les spes parallélisées ?

@julienanne julienanne left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

cool

Le SIEM du CSIRT attend des logs structurés parsables ; les logs Rails
par défaut (multi-lignes, texte brut) ne le sont pas. rails_semantic_logger
remplace la stack de log : logfmt en prod (request_id exposé en tag nommé)
et en test, format couleur lisible en dev (surchargeable via LOG_FORMAT).

Refs: #324
Aligne spec/requests/ sur les namespaces du monolithe modulaire :
api/, portail/, et hubee/ pour ce qui est commun aux deux modules.
L'ancienne spec lisait SemanticLogger.appenders dans l'env de test :
elle restait verte même en cassant le formatter de production. La
nouvelle lit log/test.log — l'appender que l'app configure — sur une
requête réelle, et vérifie le request_id porté par la réponse.

config.log_tags passe en test pour que le tag existe à l'exécution.
@damienlethiec
damienlethiec force-pushed the feat/logs-logfmt-csirt branch from c127d95 to 92470ee Compare July 15, 2026 16:35
@damienlethiec
damienlethiec merged commit 7743597 into main Jul 15, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants