gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 15:46:05 26 4
gpt4 key购买 nike

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

但是,我不知道如何从消息中解析 ERRORWARNINGDEBUG 消息并将它们放入在 Docker 将日志消息发送到 ELK 之前,在日志消息中添加像 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"

谢谢。

最佳答案

我认为您混淆了 docker 为您做什么和logstash(或潜在的logspout)在这里的用途。 Docker Gelf 驱动程序添加了以下字段:主机名 – 容器 ID – 容器名称 – 镜像 ID – 镜像名称 – 创建(容器创建时间) – 级别(6 表示 stdout,3 表示 stderr,不要与应用程序日志级别混淆)。这些事情 Docker 都知道。 Docker 不知道你的用户或客户端。这些字段不是由 gelf 驱动程序或 docker 创建的。

<小时/>

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

我的消息的日志格式为:

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

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

关于logging - 日志级别作为 Docker GELF 日志记录驱动程序的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43781570/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com