为了帮助需要这样做的其他人,您可以简单地使用Filebeat来传输日志。我会使用@brice-argenson的容器,但我需要SSL支持,所以我选择了本地安装的Filebeat实例。
来自Filebeat的探测器是(对于更多容器,请重复):
- input_type: log
paths:
- /var/lib/docker/containers/<guid>/*.log
document_type: docker_log
fields:
dockercontainer: container_name
有点糟糕的是,你需要知道GUIDs,因为它们可能会在更新时更改。
在logstash服务器上,设置通常的filebeat输入源用于logstash,并使用以下过滤器:
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中进行聚合。