Modernes Logging

15.02.2015

Achtung: Es gibt einen 2. Teil des Artikels, welchen sich vorher ansehen solle, bevor man hier alles copy&pastet

In Java-Welt ist folgende Stack für Logging recht verbreitet, weil man mit ihm ein leistungsstarkes modernes und zentrales Logging umsetzten kann. Dieser Stack besteht aus Elasticsearch, einen Volltextindex zum speichern der Nahrichten. Diese werden von Logstash verarbeitet und zum Index geschickt. Kibana wird zum visualisieren der Volltextinhalte genommen. Ich finde Logstash zum reinen verschicken von Lognahrichten zu schwergewichtig und es bötigt zu viel Ressourcen. Linux verwendet syslog zum versenden von Lognachrichten. In vieles Distributionen wird rsyslog zum verarbeiten der Nahrichten verwendet. Das gute ist, dass man mit rsyslog auch direkt in Elasticsearch loggen kann. So kann man mit rsyslog, Elasticsearch und Kibana ein leichtgewichtigeres und modernes Logsystem bauen.

Die folgende Anleitung beschreibt, wie man das ganze unter Ubuntu 14.04 einrichtet. Ich beschreibe kein komplettes Setup, es ist als Einstieg in die Thematik gedacht.

rsyslog unter Ubuntu 14.04 installieren

Eine Konsole öffnen und das Repository hinzufügen. Es handelt sich hierbei um das offizelle Repository von rsyslog. Rsyslog ist in den offizellen Repositories von Ubuntu nicht auf dem neusten Stand, außerdem gibt kein Paket mit dem Elasticsearchsupport.

sudo add-apt-repository ppa:adiscon/v8-stable

Den Cache von apt aktualisieren und rsyslog mit der Elasticsearch Unterstützung installieren

sudo apt-get update
sudo apt-get install rsyslog rsyslog-elasticsearch

Elasticsearch installieren

deb-Paket herunterladen und installieren. Die Installation über das deb-Paket hat den Vorteil, dass man Elasticsearch einfach updaten kann und es gibt auch schon init-Skripte.

wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.4.3.deb
sudo dpkg -i elasticsearch-1.4.3.deb
sudo update-rc.d elasticsearch defaults

Elasticsearch konfigurieren. Dazu muss man die Datei /etc/elasticsearch/elasticsearch.yml im Editor seine Wahl öffnen und die folgenden Zeilen einkommentieren und ändern

# Set the number of shards (splits) of an index (5 by default):
#
index.number_of_shards: 1

# Set the number of replicas (additional copies) of an index (1 by default):
#
index.number_of_replicas: 0

Elasticsearch starten:

sudo service elasticsearch start

rsyslog konfigurieren

Man muss nun dafür sorgen, dass die Lognahrichten von rsyslog nach Elasticsearch geschrieben werden. Als erstes legt man ein Mapping in Elasticsearch an. Damit sagt man Elasticsearch, dass es das Feld program nicht analysieren soll. Außerdem sollen die Dokumente nach 90 Tagen gelöscht werden.

curl -XPUT 'http://localhost:9200/logstash' -d '{
  "mappings": {
    "events" : {
      "_ttl" : {
        "enabled" : true,
        "default" : "90d"
        },
      "properties" : {
        "program" : {
          "type" : "string",
          "index" : "not_analyzed",
          "norms" : {
            "enabled" : false
          }
        }
      }
    }
  }
}'

Nach man die Datei /etc/rsyslog.d/30-elasticsearch.conf erstellt hat, muss man nur noch rsyslog neu starten. Wenn es Probleme gibt kann man mit rsyslogd -N1 die Konfiguraion überprüfen.

sudo su -
cat << EOF > /etc/rsyslog.d/30-elasticsearch.conf
#module(load="imuxsock")       # for listening to /dev/log, normal not needed
module(load="omelasticsearch") # for outputting to Elasticsearch

# this is for index names to be like: logstash-YYYY.MM.DD
template(name="logstash-index"
  type="list") {
    constant(value="logstash-")
    property(name="timereported" dateFormat="rfc3339" position.from="1" position.to="4")
    constant(value=".")
    property(name="timereported" dateFormat="rfc3339" position.from="6" position.to="7")
    constant(value=".")
    property(name="timereported" dateFormat="rfc3339" position.from="9" position.to="10")
}

# use only one index, useful only for local usage
template(name="logstash" type="string" string="logstash")

# this is for formatting our syslog in JSON with @timestamp
template(name="plain-syslog"
  type="list") {
    constant(value="{")
      constant(value="\"@timestamp\":\"")     property(name="timereported" dateFormat="rfc3339")
      constant(value="\",\"host\":\"")        property(name="hostname")
      constant(value="\",\"severity\":\"")    property(name="syslogseverity-text")
      constant(value="\",\"facility\":\"")    property(name="syslogfacility-text")
      constant(value="\",\"tag\":\"")         property(name="syslogtag" format="json")
      constant(value="\",\"program\":\"")     property(name="programname")
      constant(value="\",\"message\":\"")     property(name="msg" format="json")
    constant(value="\"}")
}

# this is where we actually send the logs to Elasticsearch (localhost:9200 by default)
action(type="omelasticsearch"
    template="plain-syslog"
    searchIndex="logstash"
    dynSearchIndex="on")

EOF
/etc/init.d/rsyslog restart
exit

Kibana installieren

Für Kibana gibt es leider keinen bequemen Installationsweg. Deswegen beschreibe ich den Weg, der schnell und einfach zum Ziel führt, aber auf keinen Fall sinnvoll für den produktiven Betrieb ist. Man läd Kibana herunter und startet es.

wget https://download.elasticsearch.org/kibana/kibana/kibana-4.0.0-rc1-linux-x64.tar.gz
tar xfvz kibana-4.0.0-rc1-linux-x64.tar.gz
kibana-4.0.0-rc1-linux-x64/bin/kibana

Nun kann man auf Kibana über http://127.0.0.1:5601/ im Browser zugreifen. Man muss nur noch Kibana sagen, welchen Index es benutzen soll. Das geht realtiv intuitiv.

Anmerkung

Das es rsyslog auch für Windows gibt, kann man diesen Stack auch für Windows nutzen. Ich habe hier alle Technologien nur angeschitten, für ein richtiges Setup muss man noch viel mehr beachten und konfigurieren.

Kategorien: Linux Tools
Tags: #logging #elasticsearch #kibana #syslog #rsyslog #logstash