...tout parti en sucette, heureusement que l'environnement de production n'était pas connecté dessus!

Bref un jour un des serveur s'est mis à envoyer des logs comme un fou remplissant le disque dur du serveur de logs en quelques heures (la nuit évidemment). Une fois les disques pleins LogStash à tout simplement arrêté d'écrire et de lire les données sur sa socket, résultat toutes (oui TOUTES) les applications connectées sont restées bloquées sur le write du socket dont le buffer était plein. Et oui c'est bloquant comme appel.

Il aurait été malin que LogStash ferme sa socket à ce moment là, ça aurait déconnecté toutes les applications et elles auraient continuer à fonctionner. En effet si le serveur ne répond pas le SocketAppender jette les messages de logs.

Bref la solution est d'utiliser un AsyncAppender, cet appender de Log4j permet de logguer en asynchrone (incroyable!) et donc de ne pas bloquer le thread qui log si jamais l'écriture du message ne marche pas. Ce AsyncAppender peut fonctionner en mode bloquant ou non-bloquant. En mode bloquant il bloque le thread qui log si son buffer est plein, sinon, non.

Il s'utilise comme appender intermediaire. Ainsi pour l'utiliser :

    <appender name="async" class="org.apache.log4j.AsyncAppender">
        <param name="Blocking" value="false"/>
        <param name="BufferSize" value="500"/>
        <appender-ref ref="logstash"/>
    </appender>

   <appender name="logstash" class="org.apache.log4j.net.SocketAppender">
       <param name="Port" value="4560"/>
       <param name="RemoteHost" value="serveurlogstash"/>
       <param name="ReconnectionDelay" value="600"/>
    </appender>

Ici l'appender async écrira dans l'appender logstash. A vous ensuite de régler vos logs pour qu'ils écrivent dans l'appender async :

<root><appender-ref ref="async"/></root>

Alors oui vu comme ça, ça parait con et trivial. Mais bon, je me suis fait avoir alors je partage. Surtout que je connais pas mal d'admins systèmes dont c'est la responsabilité de gérer les logs. Donc j'imagine bien un admin système qui veut plugger son portail websphere sur logstash et qui se retrouve avec un portail freezé parcequ'il ne connait pas l'AsyncAppender, surtout que la doc log4j dit un truc du genre : "si le serveur est planté pas de problèmes, les logs seront jetés"... Sauf s'il répond à la connection...

Voilà qui vous évitera peut-être d'avoir votre infrastructure complètement plantée le jour où votre serveur de log sera planté ;)