Я настроил свой демон Docker так, чтобы журналы всех моих контейнеров перенаправлялись в приложение Logstash, прослушивающее порт 5000, используя следующую конфигурацию для daemon.json
:
{
"log-driver": "syslog",
"log-opts": {
"syslog-address": "udp://localhost:5000",
"syslog-format": "rfc3164",
"tag": "{{.Name}}"
},
"hosts": [
"tcp://0.0.0.0:2375",
"unix:///var/run/docker.sock"
]
}
Поскольку множество разных контейнеров создают журналы одновременно, я хотел бы иметь возможность фильтровать имена контейнеров, когда я визуализирую их журналы в своем стеке ELK. Однако я не уверен, как я могу получить в Logstash «тег», который я установил как часть «log-opts» в конфигурации демона Docker выше.
Я попытался просто получить его как переменную и перенаправить в поле в конфигурации Logstash, но он просто сохраняет текст «% {tag}» в виде строки. Можно ли получить тег исходного контейнера в конфигурации Logstash?
logstash.conf:
input {
udp {
port => 5000
type => syslog
}
}
output {
elasticsearch {
hosts => ["elasticsearch"]
}
}
filter {
if [type] == "syslog" {
if [message] =~ "^<\d+>\s*\w+\s+\d+\s\d+:\d+:\d+\s\S+\s\w+(\/\S+|)\[\d+\]:.*$" {
grok {
match => {
"message" => "%{SYSLOGTIMESTAMP:timestamp} %{SYSLOGHOST:hostname} %{DATA:container_hash}(?:\[%{POSINT}\])?: %{GREEDYDATA:real_message}"
}
remove_field => ["message"]
}
mutate {
add_field => {
"tag" => "%{tag}"
}
}
}
}
}
Редактировать: если я не удалю поле message
, как в конфигурации logstash, то поле message
будет выглядеть примерно так, когда я просматриваю журналы в Kibana:
<30>May 15 15:13:23 devlocal e9713f013ebb[1284]: 192.168.56.110 - - [15/May/2019:15:13:23 +0200] "GET /server/status HTTP/1.0" 200 54 0.003 "-" "GuzzleHttp/6.3.3 curl/7.64.0 PHP/7.2.17" "172.30.0.2"
Итак, tag
, который я ищу, не является частью message
; поэтому я не знаю, откуда я могу его получить.
add_field => {"tag" => "%{tag}"}
вы добавляете новое поле, называемое тегом, со значением уже существующего поля, здесь тег; поэтому, если тег поля ранее не существовал, он просто поместит в него%{tag}
. Вам придется отредактировать шаблон grok, чтобы он извлекал значение тега. - person baudsp   schedule 16.05.2019tag
, который я ищу, не является его частью. - person Bruno Pérel   schedule 16.05.2019if "tagName" in [tags]
- person Adam   schedule 16.05.2019tags
? Это не так: у меня есть полеtags
, но это либо пустая строка, либо строка_grokparsefailure
- person Bruno Pérel   schedule 16.05.2019gelf
вместоsyslog
? docs.docker.com/config/containers/logging/gelf/#examples< /а> - person Adam   schedule 16.05.2019