Attention aux parenthèses dans Logback
J’ai perdu une soirée à cause de ça. Et j’ai perdu un peu de crédibilité aussi, en ouvrant un ticket sans fondement. Et tout ça parce que j’avais mal lu la documentation.
L’histoire a commencé quand j’ai voulu ajouter l’adresse IP des clients de mon application Web dans les logs. J’avais déjà configuré mon MDCInsertingServletFilter, il ne me restait qu’à utiliser ses informations. J’ai donc configuré le pattern dans le appender, avec un %X{…} et un peu de mise en forme. C’est ici que la parenthèse arrive, et les problèmes avec.
%d{HH:mm:ss.SSS} (%X{req.remoteHost}) [%thread] %-5level %logger - %msg%n
Les traces de mon application ont commencé à ressembler à ça :
06:20:40.626 (81.56.227.22406:20:40.628 (81.56.227.22406:20:41.371 (81.56.227.22406:20:44.301 (81.56.227.22406:20:44.369 (81.56.227.22406:20:44.566 (81.56.227.22406:20:44.623 (81.56.227.22406:20:44.859 (81.56.227.22406:20:45.000 (81.56.227.22406:20:45.087 (81.56.227.22406:20:45.280 (81.56.227.22406:20:45.349 (81.56.227.22406:20:45.405 (81.56.227.22406:20:45.798 (81.56.227.22406:20:45.868 (81.56.227.22406:20:47.595 (81.56.227.22406:20:48.225 (81.56.227.22406:20:48.399 (81.56.227.22406:20:48.747 (81.56.227.22406:20:48.761 (81.56.227.22406:20:48.790 (81.56.227.22406:20:48.816 (81.56.227.22406:20:48.829 (81.56.227.22406:20:48.953 (81.56.227.22406:20:48.958 (81.56.227.22406:20:49.132 (81.56.227.22406:20:49.176 (81.56.227.22406:20:49.178 (81.56.227.22406:20:49.283 (81.56.227.22406:20:49.290 (81.56.227.22406:20:49.304 (81.56.227.22406:20:49.306 (81.56.227.22406:20:49.310 (81.56.227.22406:20:49.592 (81.56.227.22406:20:49.793 (81.56.227.22406:20:49.804 (81.56.227.224
C’est une répétition d’heures de d’adresses IP ; j’ai perdu tout ce qui était après l’adresse IP, même le retour à la ligne. Et ça, c’est dû à l’utilisation de la parenthèse fermante dans le pattern.
Après de longues recherches, je suis tombé sur le paragraphe des parenthèses dans la documentation de logback, qui explique très bien que les parenthèses ont un rôle spécial, pour grouper des éléments du pattern, et qu’il faut échapper les parenthèses qu’on veut simplement afficher. J’aurais donc dû mettre le pattern suivant :
%d{HH:mm:ss.SSS} \\(%X{req.remoteHost}\\) [%thread] %-5level %logger - %msg%n
Avec ce pattern, mes traces sont correctes, avec les bonnes informations issues du MDC et la mise en forme que je voulais.