只是为了帮助其他需要这样做的人,您可以简单地使用 Filebeat 来发送日志。我会使用@brice-argenson 的容器,但我需要 SSL 支持,所以我使用了本地安装的 Filebeat 实例。
filebeat 的探矿者是(重复更多容器):
- input_type: log
paths:
- /var/lib/docker/containers/<guid>/*.log
document_type: docker_log
fields:
dockercontainer: container_name
您需要知道 GUID 有点糟糕,因为它们可能会在更新时发生变化。
在 logstash 服务器上,为 logstash 设置通常的 filebeat 输入源,并使用如下过滤器:
filter {
if [type] == "docker_log" {
json {
source => "message"
add_field => [ "received_at", "%{@timestamp}" ]
add_field => [ "received_from", "%{host}" ]
}
mutate {
rename => { "log" => "message" }
}
date {
match => [ "time", "ISO8601" ]
}
}
}
这将从 Docker 日志中解析 JSON,并将时间戳设置为 Docker 报告的时间戳。
如果你从 nginx Docker 镜像中读取日志,你也可以添加这个过滤器:
filter {
if [fields][dockercontainer] == "nginx" {
grok {
match => { "message" => "(?m)%{IPORHOST:targethost} %{COMBINEDAPACHELOG}" }
}
mutate {
convert => { "[bytes]" => "integer" }
convert => { "[response]" => "integer" }
}
mutate {
rename => { "bytes" => "http_streamlen" }
rename => { "response" => "http_statuscode" }
}
}
}
转换/重命名是可选的,但修复了COMBINEDAPACHELOG
表达式中的一个疏忽,即它不会将这些值转换为整数,从而使它们无法在 Kibana 中进行聚合。