我想从docker容器中获取stdout日志并将其发送到麋鹿堆栈。到目前为止,我知道Docker中有一个Gelf伐木司机。
但是,我无法弄清楚如何从消息中解析 ERROR
, WARNING
或 DEBUG
消息,然后将它们放在日志消息中的 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添加了"_logLevel" : "ERROR"
。
谢谢。
我认为您会为您所做的事情以及在这里做什么logstash(或潜在的logSpout(。Docker Gelf驱动程序添加了Follwing字段:主机名 - 容器ID - 容器名称 - 图像ID-图像名称 - 创建(Container Creation Time( - 级别(STDOUT 6,STDERR 3,不要与应用程序Loglevel混淆(。这些东西是码头所知道的。Docker不了解您的用户或客户端。这些字段不是由Gelf驱动程序或Docker创建的。
要实现您想要的目标,您将必须在Logstash中使用Grok滤波器:
我的消息具有日志格式:
$ {date:format = yyyy-mm-dd HH:mm:ss.fff} |$ {CORTORELATIONID} |$ {level} |$ {呼叫} |$ {消息}
我从docker构成的logstash构成这样的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 endn"; sleep 1 ; done'
我希望这可以帮助您开始。确保启动在logstash之后创建日志的容器。
也许阅读Grok文档以获取更多信息。