【问题标题】:Log level as a field for Docker GELF logging driver日志级别作为 Docker GELF 日志记录驱动程序的字段
【发布时间】:2017-05-04 11:25:39
【问题描述】:

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

但是,我不知道如何从消息中解析 ERRORWARNINGDEBUG 消息,然后在 Docker 将它们发送到之前将它们放在日志消息中的新字段中,例如 log_level麋鹿。

日志消息应该是这样的:

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

谢谢。

【问题讨论】:

    标签: logging docker logstash elastic-stack gelf


    【解决方案1】:

    我认为您混淆了 docker 为您做了什么以及 logstash(或可能是 logspout)在这里的用途。 Docker Gelf 驱动程序添加了以下字段: 主机名 - 容器 ID - 容器名称 - 映像 ID - 映像名称 - created(容器创建时间) - 级别(6 表示标准输出,3 表示标准错误,不要与应用程序日志级别混淆)。 Docker 知道这些事情。 Docker 不知道您的用户或客户端。这些字段不是由 gelf 驱动程序或 docker 创建的。


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

    我的消息具有日志格式:

    ${date:format=yyyy-MM-dd HH:mm:ss.fff} | ${correlationId} | ${级别} | ${呼叫站点} | ${消息}

    我从 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 了解更多信息。

    【讨论】:

    • 谢谢,我要试试这个解决方案。
    猜你喜欢
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多