Docker Logs mit Logstash einsammeln

Docker kennt mehrere Logging-Treiber.

json-file Treiber

Logstash jsonf-file.conf

Input

input {
  file {
    path => ["/var/lib/docker/containers/*/*json.log"]
    codec => "json"
  }
}

Filter

filter {
  # Glassfish's server.log
  mutate {
    #type => "gflogs"
    replace => ["message","%{log}"]
     remove_field => ["log", "path"]
    gsub => [
      "message", "\r", "",
      "message", "\n", ""
    ] 
  }
  multiline {
    #type => "gflogs"
    pattern => "^\[\#\|\d{4}"
    negate => true
    what => "previous"
    stream_identity => "%{host}.%{container_id}"
  }
}

Output

output {
  lumberjack {
    hosts => [ "localhost" ]
    port => 5043
    ssl_certificate => "/opt/logstash/logstash-2.3.4/config/ssl/logstash-forwarder.crt"
    codec => "json"
  }
}

syslog-Treiber

Den syslog-Treiber als Default benutzen

grep -vE "^$|^#" /etc/default/docker
DOCKER_OPTS="-H unix:///var/run/docker.sock -H tcp://127.0.0.1:2375 --log-driver=syslog --log-opt=syslog-address=udp://127.0.0.1:25826 --log-opt tag={{.Name}}"
sudo systemctl daemon-reload
sudo systemctl start docker

Wenn jetzt Container gestartet werden, werden sie per default ihr Logmessages per UDP nach Localhost, Port 25826, schicken. Dort sollte ein Service lauschen, der das Syslog-Protokoll versteht.

Logstash als Syslog-Ersatz

Logstash versteht das Syslog-Protokoll und kann daher als Syslog-Ersatz benutzt werden.

Logstash syslog.conf

Input
input {
  syslog {
    type => syslog
    port => 25826
  }
}
Filter
filter {
  grok {
    # ...
  }
  # ...
}
Output
output {
  lumberjack {
    hosts => [ "localhost" ]
    port => 5043
    ssl_certificate => "/opt/logstash/config/ssl/logstash-forwarder.crt"
    codec => "json"
  }
}

GELF-Treiber

Docker mit GELF-Treiber starten

docker run -d --log-driver gelf --log-opt gelf-address=udp://127.0.0.1:12201 --log-opt tag="{{.Name}}"

Logstash als Graylog-Ersatz

Logstash versteht das GELF-Protokoll und kann daher als Graylog-Ersatz benutzt werden.

Logstash gelf.conf

Input
input {
  gelf {
    host => "localhost"
    port => 12201
    type => "gf_server_log_tegb-edict-cur"
  }
}
Filter
# Glassfish's server.log, exception messages take several lines
filter {
  multiline {
    pattern => "^\[\#"
    negate => true
    what => "previous"
    stream_identity => "%{host}.%{container_id}"
  }
}
Output
output {
  lumberjack {
    hosts => [ "localhost" ]
    port => 5043
    ssl_certificate => "/opt/logstash/logstash-2.3.4/config/ssl/logstash-forwarder.crt"
    codec => "json"
  }
}