日志级别作为Docker GELF日志logging驱动程序的字段

我想从docker容器获取stdout日志,并将它们发送到ELK堆栈。 到目前为止,我知道Docker中有一个GELF日志logging驱动程序。

然而,我不知道如何parsing消息中的ERRORWARNINGDEBUG消息,并将它们放入日志消息中的log_level类的新字段中,然后Docker将它们发送给ELK。

日志消息应该是这样的:

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

哪个docker在发送到ELK之前添加了"_logLevel" : "ERROR"

谢谢。

我想你会混淆docker为你做的和logstash(或潜在的logspout)在这里。 Docker Gelf驱动添加了以下字段:主机名 – 容器ID – 容器名称 – 图像ID – 图像名称 – 创build(容器创build时间)级别(标准输出为6,标准错误为3,不与应用程序日志级别混淆)。 Docker知道这些事情。 Docker不知道你的用户或客户。 这些字段不是由gelf驱动程序或docker创build的。


为了实现你想要的,你必须在logstash中使用grokfilter:

我的消息具有日志格式:

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

我从docker运行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"] } }' 

在这里我如何运行一个容器,以指定的格式提供日志(除date以外的所有内容相同):

 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之后启动容器创build日志。

也许阅读grok文档获取更多信息。