2017-05-04 6 views
3

ドッカーコンテナからstdoutログを取得し、それらをELKスタックに送信したいとします。 これまでは、DockerにGELFロギングドライバがあることを知っています。Docker GELFロギングドライバのフィールドとしてのログレベル

しかし、私は私がメッセージからERRORWARNINGまたはDEBUGメッセージを解析し、ドッカーがELKにそれらを送信する前に、ログメッセージにlog_levelのような新しい分野でそれらを置くことができる方法を見つけ出すことはできません。 ELKに送信する前に"_logLevel" : "ERROR"を追加ドッカー

{ 
    "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" 
} 

ログメッセージのようなものでなければなりません。

ありがとうございました。

答えて

4

ドッカーがあなたに何をしているのか、そしてlogstash(または潜在的にlogspout)がここにあるのは混乱していると思います。 Docker Gelfドライバは、次のフィールドを追加します。 ホスト名 - コンテナID - コンテナ名 - イメージID - イメージ名 - 作成(コンテナ作成時間) - レベル(stdoutは6、アプリケーションのログレベルと混同しないでください。これらはDockerに知られています。 Dockerはあなたのユーザーやクライアントについて全く知らない。これらのフィールドは、gelfドライバまたはドッカーによって作成されません。

私のメッセージは、ログフォーマットがあります:

$ {日付:形式= YYYY-MM-をあなたがlogstashでGROKフィルタを使用する必要があります欲しいものを達成するために


dd HH:mm:ss.fff} | $ {correlationId} | $ {レベル} | $ {callSite} | $ {メッセージ}

そして、私はこのように構成するドッキングウィンドウからlogstashを実行します。

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"] } }' 

と、ここで私が指定した形式でログ(日付を除くすべて同じ)を提供するコンテナを実行する方法:

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' 

私はこれが始めるのを助けてくれることを願っています。 logstashの後にコンテナのログを作成することを確認してください。

詳細はgrok documentationをご覧ください。

+0

ありがとう、私はこの解決策を試してみるつもりです。 – skynyrd

関連する問題