我认为您混淆了 docker 为您做了什么以及 logstash(或可能是 logspout)在这里的用途。Docker Gelf 驱动程序添加了以下字段:主机名 - 容器 ID - 容器名称 - 映像 ID - 映像名称 - 已创建(容器创建时间) - 级别(标准输出为 6,标准错误为 3,不要与应用程序日志级别混淆)。Docker 知道这些事情。Docker 不知道您的用户或客户端。这些字段不是由 gelf 驱动程序或 docker 创建的。
要实现您想要的,您必须在 logstash 中使用 grok 过滤器:
我的消息具有日志格式:
${日期:格式=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 文档以获取更多信息。