lørdag den 28. januar 2017

Log management med ELK - part 1

Log management - der er ingen undskyldning

Har du et overblik over hvem, der besøger dine services, hvilken klient de bruger til det og hvad de er interesseret i?

Det overblik har jeg:


Jeg er medejer at et lille startup (http://compark.dk), hvor vi har flere services (webservices, web løsninger, hjemmesider mm.) og vi interesserer os meget for at holde styr på vores butik; til dette bruger vi Elasticsearch, Logstash og Kibana - populært kaldet ELK.

Jeg har tidligere beskrevet hvordan man bruger nginx og jeg vil nu vise, hvordan man kan trække logs ind i Elasticsearch for en sådan service. I eksemplet benyttes docker.

nginx logs -> ELK i docker

Først skriver vi en konfiguration til Logstash, som kan læse access loggen fra nginx. Opret logstash.conf og giv den følgende indhold:

input {
  file {
    path => "/var/log/nginx.access.log"
    type => "nginx"
  }
}

output {
  elasticsearch { hosts => ['elasticsearch'] }
}

filter {
  if [type] == "nginx" {
   grok {
    match => { "message" => "%{COMBINEDAPACHELOG}" }
   }
  }
}

I input definerer vi, at vi tager fra filen med den pågældende sti. Her er det også muligt at sætte start_from => "beginning", hvis man ønsker at indlæse alt fra filen helt forfra. Default er at starte fra "end".

I output kan vi skrive til flere forskellige kilder. Jeg nøjes med at skrive til elasticsearch hostnamet på default porten 9200.

Filter bruges til at definere, hvordan linjerne skal tolkes af logstash. COMBINEDAPACHELOG er formatet nginx spytter ud.

Inden vi kan starte de nyere versioner af Elasticsearch, er vi nødt til at fortælle vores host system, at vm'ere skal have lov at bruge lidt mere memory. Følgende linje skal derfor ind i /etc/sysctl.conf

  vm.max_map_count=262144

Da dette først træder i kraft ved næste genstart, kan denne kommando bruges til at sætte værdien her og nu:
  >  sysctl -w vm.max_map_count=262144

Nu er vi klar til at starte vores ELK stak op.

Først starter vi Elasticsearch 5.1.1 med docker:
  > docker run -d --name elasticsearch elasticsearch:5.1.1

Så starter vi logstash, så der kan komme noget data ind i elasticsearch:
  > docker run -d --name logstash -v /var/log/nginx.access.log:/var/log/nginx.access.log -v /path/to/logstash.conf:/logstash.conf --link elasticsearch:elasticsearch logstash:5.1.1 logstash -f /logstash.conf

Containeren har fået to datavolumes med fra hosten: logstash.conf og nginx.access.log. Containeren er også linket til elasticsearch, så den kan sende data dertil via hostnamet "elasticsearch".

Nu skal vi blot starte kibana:
 > docker run -d --name kibana -p 5601:5601 --link elasticsearch:elasticsearch kibana:5.1.1

Start en browser og bevæg dig til localhost:5601, hvor kibana nu udstiller de data, der kommer ind i elasticsearch fra logstash.

Ingen kommentarer:

Send en kommentar