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