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

时间:2017-05-04 11:25:39

标签: logging docker logstash elastic-stack gelf

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

但是,我无法弄清楚如何从邮件中解析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"
}

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

感谢。

1 个答案:

答案 0 :(得分:7)

我认为你混淆了docker为你做了什么以及logstash(或者可能是logspout)的用途。 Docker Gelf驱动程序添加了以下字段: 主机名 - 容器ID - 容器名称 - 图像ID - 图像名称 - 已创建(容器创建时间) - 级别(stdout为6,stderr为3,不应与应用程序loglevel混淆)。 Docker知道这些东西。 Docker不知道您的用户或客户端。这些字段不是由gelf驱动程序或docker创建的。

要实现您想要的功能,您必须在logstash中使用grok过滤器:

我的邮件有日志格式:

  

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

我从docker compose运行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以获取更多信息。

相关问题