Envoyer des logs avec Logstash GELF à Graylog ne marche pas

J'essaye d'envoyer les logs de mon application spring boot à ovh LDP graylog sur un stream avec un token d'écriture, j'utilise :

implementation('net.logstash.logback:logstash-logback-encoder:8.0')

Mon logback-spring.xml:

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="10 seconds" debug="true">
<springProfile name="local">
        <appender name="JSON_FILE" class="ch.qos.logback.core.FileAppender">
            <file>logs/test-log.json</file>
            <append>true</append>
            <encoder class="net.logstash.logback.encoder.LogstashEncoder">
                <fieldNames>
                    <message>short_message</message>
                    <level>Niveau</level>
                    <timestamp>-</timestamp>
                    <mdc>mdc</mdc>
                </fieldNames>
                <provider class="ovh.sas.server.logs.LevelToIntegerJsonConverter"/>
                <provider class="ovh.sas.server.logs.UnixTimestampProvider"/>
                <customFields>{"host":"myLocalhost", "_X-OVH-TOKEN":"myToken"}</customFields>
            </encoder>
        </appender>
        <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
                <pattern>${LOG_CONSOLE} - %msg%n%rEx{full,${LOG_STACK}}</pattern>
            </encoder>
        </appender>
    &lt;appender name&#61;&#34;GELF&#34; class&#61;&#34;net.logstash.logback.appender.LogstashTcpSocketAppender&#34;&gt;
        &lt;destination&gt;gra159.logs.ovh.com:12202&lt;/destination&gt;
        &lt;ssl&gt;false&lt;/ssl&gt;
        &lt;encoder class&#61;&#34;net.logstash.logback.encoder.LogstashEncoder&#34;&gt;
            &lt;fieldNames&gt;
                &lt;message&gt;short_message&lt;/message&gt;
                &lt;level&gt;Niveau&lt;/level&gt;
                &lt;timestamp&gt;-&lt;/timestamp&gt;
                &lt;mdc&gt;mdc&lt;/mdc&gt;
            &lt;/fieldNames&gt;
            &lt;provider class&#61;&#34;ovh.sas.server.logs.LevelToIntegerJsonConverter&#34;/&gt;
            &lt;provider class&#61;&#34;ovh.sas.server.logs.UnixTimestampProvider&#34;/&gt;
            &lt;customFields&gt;{&#34;host&#34;:&#34;myLocalhost&#34;, &#34;_X-OVH-TOKEN&#34;:&#34;myToken&#34;, &#34;_X-OVH-INPUT&#34;:&#34;gelf&#34;}&lt;/customFields&gt;
        &lt;/encoder&gt;
        &lt;reconnectionDelay&gt;10000&lt;/reconnectionDelay&gt; 
    &lt;/appender&gt;
    &lt;root level&#61;&#34;INFO&#34;&gt;
        &lt;appender-ref ref&#61;&#34;CONSOLE&#34;/&gt;
        &lt;appender-ref ref&#61;&#34;GELF&#34;/&gt;
        &lt;appender-ref ref&#61;&#34;JSON_FILE&#34;/&gt;
    &lt;/root&gt;
    &lt;logger name&#61;&#34;net.logstash.logback&#34; level&#61;&#34;debug&#34;&gt;
        &lt;appender-ref ref&#61;&#34;GELF&#34;/&gt;
    &lt;/logger&gt;
&lt;/springProfile&gt;
&lt;springProfile name&#61;&#34;dev&#34;&gt;...&lt;/springProfile&gt;

&lt;springProfile name&#61;&#34;cloud&#34;&gt;...&lt;/springProfile&gt;

&lt;springProfile name&#61;&#34;prod&#34;&gt;...&lt;/springProfile&gt;

</configuration>

J'ai rajouté le JSON_FILE juste pour vérifier le message générer :

{"-":"2025-03-10T14:28:21.519770619+01:00","@version":"1","short_message":"Retrieving access in batch","logger_name":"sas.server.quartz.device.DeviceAccessMoxaStatusJob","thread_name":"sas-access_Worker-1","Niveau":"INFO","level_value":20000,"mdc":{"USER":"Batch","REQUEST_ID":"2ad999c1-a589-4082-bgd9-64cb1bf87e95"},"level":1,"timestamp":1.74161330152E9,"host":"myLocalhost","_X-OVH-TOKEN":"myToken"} 

Quand l'appli démarre j'ai bien la connexion dans les logs :

|-INFO in net.logstash.logback.appender.LogstashTcpSocketAppender[GELF] - Log destination gra159.logs.ovh.com/<unresolved>:12202: connection established.

Mais rien sur Graylog, et quand j'essaye d'envoyer le message générer par l'encoder en java :

public static void main(String[] args) {
    new SpringApplicationBuilder().bannerMode(Mode.LOG).sources(Server.class).run();
String message &#61; &#34;{\&#34;-\&#34;:\&#34;2025-03-10T14:28:21.519770619&#43;01:00\&#34;,\&#34;&#64;version\&#34;:\&#34;1\&#34;,\&#34;short_message\&#34;:\&#34;Test message from java\&#34;,\&#34;logger_name\&#34;:\&#34;sas.server.quartz.device.DeviceAccessMoxaStatusJob\&#34;,\&#34;thread_name\&#34;:\&#34;sas-access_Worker-1\&#34;,\&#34;Niveau\&#34;:\&#34;INFO\&#34;,\&#34;level_value\&#34;:20000,\&#34;mdc\&#34;:{\&#34;USER\&#34;:\&#34;Batch\&#34;,\&#34;REQUEST_ID\&#34;:\&#34;2ad999c1-a589-4082-bgd9-64cb1bfa9e95\&#34;},\&#34;level\&#34;:1,\&#34;timestamp\&#34;:1.74161330152E9,\&#34;host\&#34;:\&#34;myLocalhost\&#34;,\&#34;_X-OVH-TOKEN\&#34;:\&#34;myToken\&#34;}\n&#34;;

SSLSocketFactory factory &#61; (SSLSocketFactory) SSLSocketFactory.getDefault();
try (Socket socket &#61; factory.createSocket(&#34;gra159.logs.ovh.com&#34;, 12202);
     OutputStream outputStream &#61; socket.getOutputStream()) {
    outputStream.write(message.getBytes());
    outputStream.flush();
    System.out.println(&#34;✅ Log envoyé manuellement !&#34;);
} catch (UnknownHostException e) {
    throw new RuntimeException(e);
} catch (IOException e) {
    throw new RuntimeException(e);
}

}

Je reçois bien le message sur mon stream Graylog.
Avec le terminal aussi ça fonctionne bien :

echo -e '{"-":"2025-03-10T14:28:21.519770619+01:00","@version":"1","short_message":"Retrieving access moxa statuses in batch","logger_name":"sas.server.quartz.device.DeviceAccessMoxaStatusJob","thread_name":"sas-access_Worker-1","Niveau":"INFO","level_value":20000,"mdc":{"USER":"Batch","REQUEST_ID":"2ad999c1-a589-4082-aad9-64cb1bfa9e95"},"level":1,"timestamp":1.74161330152E9,"host":"myLocalhost","_X-OVH-TOKEN":"myToken"}' | openssl s_client -quiet -no_ign_eof -connect gra159.logs.ovh.com:12202

Des idées pour savoir ou est le problème ?

Merci.

Bonjour Mahdi,

Si le dysfonctionnement persiste, je vous invite à ajouter des précisions ainsi que les tests effectués depuis la création de votre post.

Dans le cas contraire, n’hésitez pas à partager la solution trouvée afin d’en faire profiter le plus grand nombre.

FabL