2017-05-04 3 views
3

Ich möchte stdout Logs von einem Docker Container bekommen und sie an ELK Stack senden. Bisher weiß ich, dass es in Docker einen GELF-Protokolltreiber gibt.Loglevel als Feld für Docker GELF Logging Treiber

aber ich kann nicht herausfinden, wie ich ERROR analysieren kann, WARNING oder DEBUG Nachrichten aus den Nachrichten und sie in einem neuen Feld wie log_level in einer Log-Nachricht, bevor Docker sie ELK sendet.

{ 
    "client": "127.0.0.1", 
    "user": "frank", 
    "timestamp": "2000-10-10 13:55:36 -0700", 
    "method": "GET", 
    "uri": "/apache_pb.gif", 
    "protocol": "HTTP/1.0", 
    "status": 200, 
    "size": 2326, 
    "message": "[ERROR] Error connecting to MongoDB", 
    "_logLevel" : "ERROR" 
} 

Welche hinzugefügt Docker "_logLevel" : "ERROR" vor dem ELK Senden:

Log-Meldung sollte etwas ähnliches sein.

Danke.

Antwort

4

Ich denke, Sie verwechseln, was Docker für Sie tut und was Logstash (oder möglicherweise Logspout) ist hier für. Docker Gelf Treiber fügt die folgenden Felder hinzu: Hostname - Container ID - Container Name - Image ID - Image Name - erstellt (Container Erstellungszeit) - Ebene (6 für stdout, 3 für stderr, nicht zu verwechseln mit Anwendung loglevel). Diese Dinge sind Docker bekannt. Docker hat keine Ahnung von Ihrem Benutzer oder Client. Diese Felder werden nicht vom Gelf-Treiber oder Andockfenster erstellt.


Um das zu erreichen, was Sie wollen, dass Sie grok Filter in logstash verwenden müssten:

meine Nachrichten haben das Protokollformat:

$ {date: format = yyyy-MM- dd HH: mm: ss.fff} | $ {correlationId} | $ {level} | $ {callSite} | $ {Nachricht}

Und ich laufen logstash von Docker wie folgt zusammensetzen:

logstash: 
    image: docker.elastic.co/logstash/logstash:5.3.1 
    logging: 
     driver: "json-file" 
    networks: 
     - logging 
    ports: 
     - "12201:12201" 
     - "12201:12201/udp" 
    entrypoint: logstash -e 'input { gelf { } } 
         filter{ 
           grok { 
            match=> ["message", "%{SPACE}%{DATESTAMP:timestamp}%{SPACE}\|%{SPACE}%{DATA:correlation_Id}%{SPACE}\|%{SPACE}%{DATA:log_level}%{SPACE}\|%{SPACE}%{DATA:call_site}%{SPACE}\|%{SPACE}%{DATA:message}%{SPACE}$$"] 
            overwrite => [ "message" ] 
           } 
           date { 
            locale => "en" 
            match => ["timestamp", "dd-MM-YYYY HH:mm:ss:SSS"] 
            target => "@timestamp" 
            remove_field => [ "timestamp" ] 
           } 
         } 
         output { stdout{ } elasticsearch { hosts => ["http://elasticsearch:9200"] } }' 

und hier, wie ich einen Container ausführen, die Protokolle im angegebenen Format (alle identisch, mit Ausnahme date) liefert:

docker run --log-driver=gelf --log-opt gelf-address=udp://0.0.0.0:12201 ubuntu /bin/sh -c 'while true; do date "+%d-%m-%Y %H:%M:%S:%3N" | xargs printf "%s %s | 51c489da-2ba7-466e-abe1-14c236de54c5 | INFO | HostingLoggerExtensions.RequestFinished | Request finished in 35.1624ms 200 application/json; charset=utf-8 message end\n"; sleep 1 ; done' 

Ich hoffe, das hilft Ihnen den Einstieg. Stellen Sie sicher, dass Sie die Container starten, die Protokolle nach dem Logstash erstellen.

Vielleicht lesen Sie die grok documentation für weitere Informationen.

+0

Danke, ich werde diese Lösung versuchen. – skynyrd