ELK Stack põhine logiserver

Allikas: Kuutõrvaja

Sissejuhatus

ELK stack nimi tuleb selle komponentide esitähtedest: Elasticsearch-Logstash-Kibana. Selle näol on tegemist logiserveri lahendusega, mis pakub indekseerimist ja põhjalikke otsinguid võimaldavat veebiliidest.

ELK stack koosneb kolmest komponendist

  1. Logstash: mis kuulab 5000 pordil ja võtab logid serveritest vastu
  2. Elasticsearch: tegeleb logi salvestamise ja indekseerimisega
  3. Kibana: weebiliides mis võimaldab otsingu ja visualiseerimisega
   _____   ELK logiserver 192.168.1.10
  |     |  :5000/tcp
  |_____|  :5000/udp
     |
     |
    -|---------|----------|----....---|--
               |          |           |
             __|__      __|__       __|__
            |     |    |     |     |     | (logi ELKi edastavad serverid)
            |_____|    |_____|     |_____|
        
              smtp       www         dns

Logstashi logi on üldjoones kolmest ahelatüübist koosnev, milledeks on sisenev info input, filtreerimine ehk filter ja väljundamine edasi ehk output

input {
    [...]
}
filter {
}
output {
    [...]
}

Paigaldamine gentoos

Paigaldame vajalikud paketid

# emerge app-admin/logstash-bin app-misc/elasticsearch www-apps/kibana-bin virtual/jdk

Ning seejärel java versioon paika

# java-config --set-system-vm icedtea-bin-7"

Seejärel tuleb tekitada vajalikud konfifailid

/etc/elasticsearch/logging.yml
/etc/elasticsearch/elasticsearch.in.sh
/etc/elasticsearch/elasticsearch.yml
/etc/logstash/conf.d/agent.conf

Esimesed kolm võivad olla vaikimisi süsteemi näidetekausta paigaldatud ja muutmist ei nõua. Logstashi agent.conf konfifail võiks välja näha järgnev

input {
  tcp {
    port => 5000
    type => syslog
  }
  udp {
    port => 5000
    type => syslog
  }
}


filter {
  if [type] == "syslog" {
    grok {
      match => { "message" => "<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
    }
  }
}

output {
  elasticsearch { host => localhost }
  stdout { codec => rubydebug }
}

Võimalik on inputi ahelasse defineerida ka serveri enda lokaalsed logid nt sektsiooniga

        file {
                type => "logserver"
                path => [ "/var/log/syslog", "/var/log/*.log" ]
        }

Teenused automaatselt startima

# ln -s /etc/init.d/kibana /etc/runlevels/default/
# ln -s /etc/init.d/logstash /etc/runlevels/default/
# ln -s /etc/init.d/elasticsearch /etc/runlevels/default/

Paigaldamine Arch linuxis

Paigaldame pakihaldusest elasticsearchi ja nginxi mis hakkab olema proxyks

# pacman -S elasticsearch nginx

Auri abiutiliiti yaourti kasutades instalime logstash ja kibana. Esimene paneb ka java peale

# yaourt logstash kibana

Lubame teenuste boodil stardi

systemctl enable elasticsearch
systemctl enable logstash
systemctl enable kibana
systemctl enable nginx

/etc/logstash/conf.d/logstash-simple.conf

input {
  file {
    path => "/var/log/faillog"
    start_position => beginning
  }

  tcp {
    port => 5000
    type => syslog
  }
  udp {
    port => 5000
    type => syslog
  }
}

output {
  elasticsearch { hosts => localhost }
}

/etc/nginx/nginx.conf

# Nginx proxy for Elasticsearch + Kibana
#
server {
    listen                80;
    server_name           localhost;
    access_log            /var/log/nginx-logstash.log; 

    #auth_basic "Restricted Access";
    #auth_basic_user_file /etc/webapps/kibana/htpasswd.users;

    location / {
        proxy_pass http://localhost:5601;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

Kliendid

Syslog

Syslog-ng puhul võib seadistada

destination loghost { udp("192.168.1.10"); };
log { source(src); filter(f_mail); destination(mail); destination(loghost); flags(final); };

Systemd journal

Systemd puhul on kõik logid nähtavad journalctl käsuga ja syslogi masinas pole. Ka pole mõtekas eraldi syslogi paigaldada kuna systemd-journal-remote ja systemd-journal-upload on systemd natiivsed töövahendid logide transpordiks

Esimene võimalus: saata journald teated journal-uploadiga otse logstashi pordile

Logstashi tuleks seadistada vastuvõtuvõimalus

input {
  tcp {
    port => 19532
    type => journald
  }
}

Saatmise testimiseks võib anda käsu

/usr/lib/systemd/systemd-journal-upload -u http://127.0.2.1 &

Systemd pakiga kaasas on upload service ja tema konff

  • /usr/lib/systemd/system/systemd-journal-upload.service
  • /etc/systemd/journal-upload.conf

Viimast saab sodida ja esimese enableda, siis pole vaja ise unitit kirjutada. Näiteks

[Upload]
URL=http://127.0.2.1

NB! Selle artikli kirjutamise ajal otse logstashi pordile saatmine tööle ei hakanud. Miskipärast kukkus ühendus maha ja journal-upload teenus ei suutnud seda ilma restartideta üles tõsta

Teine võimalus: Võtta journal-upload abil saadetud journal vastu journal-remote serveriga ja lasta seejärel lugeda logstashil logi kohalikest failidest

Selleks, et faile esmalt journalina vastu võtta ja siis logstashiga lugeda on systemd-journal-remote teenus mis võtab uploadilt neid vastu

/etc/systemd/system/systemd-journal-remote.service faili tuleb teha mõned muudatused. Nimelt tuleb seadistada split-node=none et iga võrguserver ei tekitaks eraldi logifiali, journald lugeja nimelt lukustab end ühe faili külge ega oska jälgida tervet posu journaleid

[Service]
ExecStart=/usr/lib/systemd/systemd-journal-remote \
          --listen-http=-3 \
          --split-mode=none \
          --output=/srv/logs/remote.journal 

Seejärel lugeda journali teateid ka kohalikest failidest

input {
  journald {
       lowercase => true
       seekto => "head"
       thisboot => false
	type => "journald"
        sincedb_path => "/srv/logstash/.sincedb"
	path => "/srv/logs"
       tags => [ "vabrik" ]
     }
}

Võib juhtuda, et mõned väljad lähevad seejuures konflikti logstashi enda väljadega

{"type"=>"mapper_parsing_exception", "reason"=>"failed to parse", "caused_by"=>{"type"=>"illegal_state_exception", "reason"=>"Mixing up field types: 
class  org.elasticsearch.index.mapper.core.StringFieldMapper$StringFieldType != class org.elasticsearch.index.mapper.internal.UidFieldMapper$UidFieldType on field _uid"}}}}, :level=>:warn}

aitab konfliksete väljade nagu uid ümbernimetamine

filter {
 mutate {
  rename => { "_uid" => "kasutaja_uid" }
 }
}

Kibana

Kibana veebiliides töötab pordil 5601

Discover-unfiltered.png

Lingid

https://secure.trifork.com/dl/goto-berlin-2014/GOTO_Night/logstash-kibana-intro.pdf

https://www.digitalocean.com/community/tutorials/how-to-use-kibana-dashboards-and-visualizations

https://hibern8.wordpress.com/2014/02/26/logstash-redis-elasticsearch-and-kibana-real-time-data-analysis-on-debian-wheezy/

https://home.regit.org/2014/02/02/

https://deviantony.wordpress.com/2014/05/19/centralized-logging-with-an-elk-stack-elasticsearch-logback-kibana/

https://www.digitalocean.com/community/tutorials/how-to-use-logstash-and-kibana-to-centralize-and-visualize-logs-on-ubuntu-14-04

https://gist.github.com/brianredbeard/d5b02a1e998c63827b03 logstash ja systemd

https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html filtrite kirjutamine apache logi näitel