Logstash via Filebeat naar Kibana

Na de installatie van de ELK server gaan we met logstash informatie tonen en opzoeken in de Kibana web-portal.  Logstash is het component dat informatie uit o.a. log-bestanden kan filteren en daarna kan uitvoeren naar ElasticSearch waarna het getoond kan worden in Kibana.

Als eerste een test-pipeline waarbij we het toetsenbord (stdin) als input gebruiken en ons scherm (stdout) als output. Het commando hiervoor is:

/usr/share/logstash/bin/logstash -e 'input { stdin { } } output { stdout {} }'

Type nu ‘goedemorgen wereld!’ en de uitvoer komt op het scherm: (naast een aantal [INFO] en [WARN] berichten)

{
       "message" => "Goedemorgen wereld!",
    "@timestamp" => 2018-10-20T11:36:32.712Z,
      "@version" => "1",
          "host" => "0.0.0.0"
}

Logstash zal o.a. de ‘timestamp‘ en de ‘host’ toevoegen aan de ‘message’

Sluit logstash af met CTRL + D

In de praktijk wordt logstash gebruikt om log-bestanden als input te gebruiken, de informatie hierin te filteren en om de data te voorzien van veldnamen om deze vervolgens als output naar ElasticSearch te sturen zodat meerdere personen deze kunnen bekijken m.b.v. Kibana.

FileBeat

Een hulpmiddel om log-regels naar Logstash te sturen is FileBeat. Deze is als ‘Beats input‘ plugin meegeleverd bij Logstash. Deze tool stuurt de log-regels naar Logstash om bewerkt te worden. FileBeat is dus de tool om op alle servers te installeren waarvan je de logging wilt raadplegen.

Op de systemen waarvan je ook de log-files wilt inventariseren, geef de volgende commando’s:

curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.5.0-amd64.deb
sudo dpkg -i filebeat-6.5.0-amd64.deb

Als voorbeeld heb ik een log-bestand van Volumio MusicPlayer in de /tmp/ directory geplaatst. De regels hierin zien er alsvolgt uit:

2018-10-19T09:23:18.608Z - error: message=Cannot read property '0' of undefined, stack=TypeError: Cannot read property '0' of undefined

Deze regels gaan we ophalen met Filebeat. Pas het bestand /etc/filebeat/filebeat.yml aan zodat het er alsvolgt uit ziet:

---
filebeat.prospectors:
- type: log
  paths:
    - /var/log/*.log
  
- type: log
  paths:
    - /var/log/messages
    - /var/log/secure

- type: log
  paths:
    - /tmp/volumio.log
  exclude_lines: ['at*']
  fields:
    volumio: true

output.elasticsearch:
  hosts: ["localhost:9200"]

We geven nu het volgende filebeat-commando om de regels naar Logstash te sturen die als service op deze machine ‘luistert’ op poort 5044:

sudo filebeat -e -c filebeat.yml -d "publish"

De output van Filebeat is dan alsvolgt:

2018/10/19 09:30:06.810701 publish.go:109: DBG  Publish: {
  "@timestamp": "2018-10-19T09:30:06.507Z",
  "beat": {
    "hostname": "ELK.digitalinfo.local",
    "name": "ELK.digitalinfo.local"
  },
  "count": 1,
  "fields": volumio,
  "input_type": "log",
  "message": "2018-10-19T07:57:28.594Z - error:  message=Cannot read property '0' of undefined, stack=TypeError: Cannot read property '0' of undefined",
  "offset": 148216,
  "source": "/tmp/volumio.log",
  "type": "volumio"
}

Telkens als er nieuwe log-informatie wordt toegevoegd aan één van de log-bestanden, willen we dat filebeat dit doorgeeft aan logstash, zodat het geindexeerd kan worden in ElasticSearch. Daarom starten we filebeat als een service die dit op de achtergrond voor ons gaat doen:

systemctl enable filebeat
systemctl start filebeat

Hierna gaan we een index aanmaken op het Kibana web-portal. We browsen daarvoor naar onze elk server http://elk.digitalinfo.local. We zien het volgende scherm:

De optie ‘Check for new data” geeft een filebeat-* index

In het veld “Index pattern” geven we de volgende tekst in: “filebeat-*” hetgeen zou moeten matchen:

Vervolgens wordt de optie “Next step” zichtbaar en daarin wordt gevraagd naar het tijd filter en hiervoor kiezen we “@timestamp” uit de pull-down.

De laatste stap is “Create index pattern” en dat zal resulteren in een index met veld-namen uit de log-bestanden:

Nadat de index pattern is aangemaakt kunnen via de “Discover” optie in het hoofdscherm van Kibana de log uitvragen via queries. Standaard wordt alles getoond:

Bijvoorbeeld zoeken op de tekst “source: “/tmp/volumio.log” AND “Cannot read property ‘0’ of undefined” geeft het volgende resultaat: