我想从docker容器中获取stdout日志并将它们发送到ELK堆栈.
到目前为止,我知道Docker中有一个GELF日志记录驱动程序.
到目前为止,我知道Docker中有一个GELF日志记录驱动程序.
但是,我无法弄清楚如何解析消息中的ERROR,WARNING或DEBUG消息,并在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"
}
在发送给ELK之前,哪个docker添加了“_logLevel”:“ERROR”.
谢谢.
最佳答案
我认为你混淆了docker为你做了什么以及logstash(或者可能是logspout)的用途. Docker Gelf驱动程序添加了以下字段:
主机名 – 容器ID – 容器名称 – 图像ID – 图像名称 – 已创建(容器创建时间) – 级别(stdout为6,stderr为3,不应与应用程序loglevel混淆). Docker知道这些东西. Docker不知道您的用户或客户端.这些字段不是由gelf驱动程序或docker创建的.
主机名 – 容器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} | ${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了解更多信息.
相关文章
- 通过配置日志记录驱动程序将Docker容器日志发送到ELK Stack - Easy Method
- amazon-web-services - 配置的日志记录驱动程序不支持读取:Docker
- python - 日志记录:如何为处理程序设置最大日志级别
- 如何将elasticsearch库的日志记录级别设置为与我自己的日志记录不同?
- c# - 在ASP.NET Core中分离应用程序级日志记录和框架级日志记录
- python - Docker,Supervisord和日志记录 - 如何整合Docker日志中的日志?
- 如何在docker中正在运行的容器上更改日志记录驱动程序
- c# - 企业库日志记录 - 如何在运行时获取配置的日志记录级别?
转载注明原文:日志级别作为Docker GELF日志记录驱动程序的字段 - 代码日志