Audit : lire la piste
La piste d’audit dit qui a fait quoi, sur quel fichier, et si ca a marche ;
refus et erreurs compris. Le vocabulaire des lignes (actions, champs,
reason) est dans la reference.
{"timestamp":"2026-10-07T14:41:25.402Z","level":"INFO","target":"audit","fields":{"message":"audit: operation succeeded","source":"sftp","action":"upload","session_id":"550e8400-e29b-41d4-a716-446655440000","remote_addr":"192.168.1.42","username":"alice","path":"/in/rapport.csv","backend":"disque","new_path":"","count":524288,"replaced":"no","removed":"","result":"success"}}
Ou elle va
| Reglage | Ou va la piste |
|---|---|
| defaut | stdout, melee au journal applicatif, une ligne JSON par evenement, target = audit |
[log] dir | en plus, craft-file-gate-audit.log (la piste seule) a cote de craft-file-gate.log |
[log] stdout = false | les fichiers seulement |
[telemetry] | chaque ligne d’operation est aussi un evenement du span de l’operation |
Rotation, retention et niveau : Journaux.
Ce qu’elle garde
log.audit (all, changes, failures) ne retire que des succes ; les
refus anonymes repetes sont resumes en connection_rejected_summary. Voir
Le volume de la piste
et Refus repetes.
Severite
| Niveau | Lignes |
|---|---|
WARN | ce que seul un porteur de credential produit : une operation denied, error ou unknown ; un refus apres une credential acceptee ; un refus d’action admin ; ip_banned |
INFO | ce que n’importe quel pair produit : les autres connection_rejected ; connection_accepted, session_end, les resumes, les succes |
Une alerte sur les WARN de la piste ne se declenche donc pas pour un
scanner anonyme.
Filtrer
Dans la console, onglet Logs, source audit (permission audit) : filtres
par niveau, periode, texte et champ:valeur ; chaque lecture ecrit une ligne
audit_read. Voir Console et API d’administration.
# l'API de la console
curl -H "Authorization: Bearer $TOKEN" \
'http://serveur:8081/admin/logs/audit?field=username:alice&level=WARN&since=2026-10-07T00:00:00Z'
# les fichiers ; sans [log] dir : docker logs ... | jq -c 'select(.target == "audit")'
jq -c 'select(.fields.username == "alice")' /var/log/craft-file-gate/craft-file-gate-audit.log
| Question | Filtre |
|---|---|
| tout ce qu’a fait une session SFTP | .fields.session_id == "<id>" |
| les fichiers ecrases | .fields.action == "upload" and .fields.replaced == "yes" |
| les refus d’ACL | .fields.reason == "acl" |
| les pannes du stockage | .fields.result == "error" and .fields.backend == "<nom>" |
| les refus et erreurs | .fields.result != "success" |
Le texte d’une erreur du stockage n’est pas dans la piste : cherchez-le dans
le journal applicatif, a la meme heure, avec le meme path.
Une piste incomplete
Une ligne que le serveur ne peut pas ecrire (pipe ferme, disque plein) est
perdue : craftfilegate_log_write_errors_total le compte, stderr le dit au
plus une fois par minute, et le serveur continue de servir. Alertez sur
increase(craftfilegate_log_write_errors_total[5m]) > 0.