SessionLog
Journal de session pour les CLI Crystal : le programme se RELANCE lui-même et le parent enregistre dans un fichier tout ce qui s'affiche dans le terminal (questions, réponses, sortie des sous-processus).
- Terminal interactif : l'enfant tourne sous
script(1), qui lui garde un vrai terminal (questions, couleurs,tty?, saisie sans écho,ssh -tintacts) et enregistre la session dans le fichier. - Sortie redirigée (tube, cron) : l'enfant écrit dans deux tubes que le parent recopie à la fois à l'écran et dans le fichier.
L'enfant reçoit la variable <APP>_SESSION_LOG (chemin du journal) : il ne
se relance pas une seconde fois, ses propres enfants non plus. Fichiers
0600 dans un dossier 0700 ; journaux de plus de keep_days jours effacés à
chaque nouvelle session journalisée.
Le choix des commandes à journaliser (et de leur libellé) revient à l'application : JAMAIS celles qui affichent ou font saisir des secrets en clair — un journal ne doit pas devenir une copie du coffre.
require "session-log"
log = SessionLog::Config.new("monoutil", MonOutil::VERSION, "#{ENV["HOME"]}/.local/state/monoutil/logs")
argv, refused = SessionLog.strip_flag(ARGV)
if !refused && !log.active? && journaliser?(argv)
exit SessionLog.run(log, argv, log.path(argv.first, argv[1]?))
end
exit MonOutil.run(argv)
Constants
Option qui refuse le journal, où qu'elle soit sur la ligne de commande.
Lue au compile-time depuis shard.yml via le macro read_file.
Évite la désynchronisation entre la constante Crystal et le
version: du shard.yml (cas vécu en mai 2026 avec
crystal-combine-pdf : 7 versions inscrivaient la mauvaise valeur
dans le /Producer des PDFs générés).
Cf. note mémoire ALOLI feedback_shard_version_macro.md.
Instance methods
En-tête du journal : programme, version, date, ligne de commande. Pur.
<dossier>/2026-10-25--14-03-07--diag--aloli.fr.log : date, heure,
libellé de la commande, puis la portée (un domaine, un hôte…) réduite aux
caractères sûrs dans un nom de fichier. Pur.
Efface les journaux de plus de keep_days jours. Jamais bloquant.
Relance le programme (argv complet, options globales comprises) sous
journal et renvoie son code de sortie. Le chemin du journal est rappelé
sur stderr à la fin. exe : le programme lui-même par défaut.
Arguments de script(1) : enregistre (en ajout, l'en-tête est déjà
écrit) la commande cmd dans log. BSD et macOS : script -q -a -F log cmd… (-F : écrit au fil de l'eau, tail -f possible ; code de sortie =
celui de la commande). Linux (util-linux) : commande en une chaîne -c,
-e pour rendre son code de sortie. Pur.