Logstash

ELG Stack = Elasticsearch, Logstash und Grafana

Important
Dieses Kapitel wird editiert und ist noch nicht abgeschlossen.

Erste Schritte

Um die Verwendung von Logstash zu verstehen, soll als erstes Beispiel die Log-Datei /var/log/ntp/ntp.log überwacht und als neue Datei im JSON-Format abgespeichert werden.

Konfiguration

ntpd

mkdir /var/log/ntp
chown ntp:ntp /var/log/ntp
Gentoo, ntp-4.2.8p9
# /etc/conf.d/ntpd

NTPD_OPTS="-u ntp:ntp -l /var/log/ntp/ntp.log"
CentOS 7, ntp-4.2.6p5
# /etc/sysconfig/ntpd
#
# see also /usr/lib/systemd/system/ntpd.service

OPTIONS="-g -l /var/log/ntp/ntp.log"

logstash

Die Logstash-Konfiguration teilt sich in die Abschnitte input, filter und output.

Als input-Typ wird von uns syslog-ntp festgelegt.

Der Zeitstempel-Anteil des output-Dateinamens wird im Joda-Time-Format angegeben.

logstash-5.1.2
# /etc/logstash/conf.d/ntpstats-ng.conf.ntplog

input {
    file {
        path => [ "/var/log/ntp/ntp.log" ]
        type => "syslog-ntp"
    }
}

filter {}

output {
    if [type] == "syslog-ntp" {
        file {
            path => "/tmp/ntpstats-ng-%{+YYYY-MM-dd}.json"
        }
    }
}
Note
Die komplette Datei findet sich hier: ntpstats-ng.conf.ntplog

Es funktioniert!

Die Dienste ntpd und logstash werden mit der oben beschriebene Konfiguration gestartet.

Gentoo, openrc
/etc/init.d/logstash start
/etc/init.d/ntpd start
CentOS 7, syslogd
systemctl start logstash.service
systemctl start ntpd.service
Note
Kurz nach Start der Dienste werden zwei Dateien angelegt:
/var/log/ntp/ntp.log
/tmp/ntpstats-ng-2017-01-29.json

Vergleichen wir die jeweils erste Zeile der beiden Dateien.

head -n 1 /var/log/ntp/ntp.log
29 Jan 22:15:59 ntpd[19633]: ntpd [email protected] Thu Nov 24 08:57:19 UTC 2016 (1): Starting
head -n 1 /tmp/ntpstats-ng-2017-01-29.json
{"path":"/var/log/ntp/ntp.log","@timestamp":"2017-01-29T22:16:14.805Z","@version":"1","host":"localhost","message":"29 Jan 22:15:59 ntpd[19633]: ntpd [email protected] Thu Nov 24 08:57:19 UTC 2016 (1): Starting","type":"syslog-ntp"}
Tip
Hier hilft uns der JSON-Kommandozeilenprozessor jq.
head -n 1 /tmp/ntpstats-ng-2017-01-29.json | jq
{
  "path": "/var/log/ntp/ntp.log",
  "@timestamp": "2017-01-29T22:16:14.805Z",
  "@version": "1",
  "host": "localhost",
  "message": "29 Jan 22:15:59 ntpd[19633]: ntpd [email protected] Thu Nov 24 08:57:19 UTC 2016 (1): Starting",
  "type": "syslog-ntp"
}

Vergleiche

Die Felder path und type aus unserer Konfiguration finden wir sofort wieder. In message ist der komplette Inhalt der Log-Zeile gelandet.

Hinzugekommen sind die Felder @timestamp, @version und host. In host steht der Hostname des Logstash Host - dazu später mehr.[1] Das Feld @version brauchen wir eigentlich nicht.[2]

Note
Datum und Uhrzeit sind in message und @timestamp verschieden!

Die Log-Zeile wurde am "29. Januar, 22:15:59" geschrieben - Jahr und Zeitzone fehlen.

Die Verarbeitung durch Logstash erfolgte am "29. Januar 2017, 22:16:14.805, UTC" - etwa 15 Sekunden später.

Das Format von @timestamp entspricht dem für die Weiterleitung an Elasticsearch benötigtem. Wir wollen aber die Ereignisse in der exakten Log-Reihenfolge erhalten und später analysieren können. Wenden wir dazu Logstash-Filter auf unseren Typ syslog-ntp an.

Filter

logstash-5.1.2
# /etc/logstash/conf.d/ntpstats-ng.conf

input {
    # ...
}

filter {
    if [type] == "syslog-ntp" {
        grok {
            match     => { "message"  => "%{MONTHDAY:msg_day} %{MONTH:msg_month} %{TIME:msg_time} %{SYSLOGPROG}: %{GREEDYDATA:message}" }
            add_field => { "logstamp" => "%{msg_day} %{msg_month} %{msg_time}" }
        }
    }
}

output {
    # ...
}
Gentoo, openrc
/etc/init.d/logstash stop
CentOS 7, syslogd
systemctl stop logstash.service
rm /tmp/ntpstats-ng-2017-01-29.json
Gentoo, openrc
/etc/init.d/logstash start
CentOS 7, syslogd
systemctl start logstash.service

grok

TODO


ntpstats-ng © MMXV-MMXVII WOLfgang Schricker

results matching ""

    No results matching ""