Blue background with pattern

Magento-logbestanden vastleggen met de ELK-stack

Peter Jaap BlaakmeerOrange dot22 Oct 2017

7 min lezen

Dit is een snelle handleiding over hoe je de logbestanden van Magento kunt vastleggen met behulp van de ELK-stack. ELK staat voor Elasticsearch, Logstash en Kibana. Ik zal niet te diep op de details ingaan, maar in grote lijnen wordt Elasticsearch gebruikt voor opslag en snelle opvraging van logvermeldingen, Logstash is verantwoordelijk voor het binnenhalen van de gegevens in Elasticsearch en Kibana wordt gebruikt om overzichten en visualisaties van de grote hoeveelheid logvermeldingen te maken.

Naast ELK zullen we de opdrachtregeltool log-courier gebruiken om de logs direct van onze productieserver naar de ELK-stack te verzenden via een versleutelde verbinding.

Let op; we gebruiken log-courier 1.8.3 omdat dat de huidige versie is die is geïnstalleerd op Byte's Hypernode hostingoplossing (die we voor al onze klanten gebruiken). De laatste versie is nu 2.0.5 en biedt iets meer mogelijkheden, vooral in de lc-admin tool.

Veel van mijn onderzoek over hoe dit op te zetten is afkomstig van deze Gist van Github-gebruiker purinda, DigitalOcean's blog over ELK en de documentatie van log-courier.

De ELK-stack opzetten

DigitalOcean bood vroeger een one-click app voor de ELK-stack aan. Helaas is deze niet langer beschikbaar. Ik laat het aan jou over om je eigen ELK-stack op te zetten. Zie de blog van DO hierboven gelinkt of kies een Docker-image zoals deze. Je kunt ook proberen om DigitalOcean te mailen om te zien of ze een image voor je hebben. Sla gewoon het Filebeat-gedeelte van de DO-blog over; we zullen log-courier gebruiken om onze logs in ELK te krijgen.

Kibana en Elasticsearch zijn vrij eenvoudig, volg gewoon de blog. Onthoud waar je je certificaatbestand en je geheime sleutelfile voor Logstash hebt geplaatst.

Logstash configureren

Een Logstash-configuratie bestaat minimaal uit drie delen; invoer, uitvoer en filter.

Invoer

Het invoerconfiguratiebestand definieert hoe de logs Logstash binnenkomen. In ons geval zullen we log-courier gebruiken, dus we hebben de logstash-input-courier plugin voor Logstash nodig;

  • SSH naar je ELK-stack
  • Ga naar /opt/logstash/
  • Voer sudo bin/plugin install logstash-input-courier uit

Nu gaan we de invoer instellen;

  • Ga naar /etc/logstash/conf.d/
  • Maak een nieuw bestand genaamd 01-courier-input.conf
  • Gebruik deze inhoud;
input {
    courier {
        port            => 5043
        ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt"
        ssl_key         => "/etc/pki/tls/private/logstash-forwarder.key"
    }
}
  • Vervang mogelijk het sslcertificaat en de sslsleutel door je paden.
  • Open poort 5043 in je firewall (ufw insert 1 allow from $PRODUCTION-SERVER-IP to any port 5043)

Je kunt meer lezen over het instellen van Logstash in log-courier hier.

Uitvoer

Logstash moet weten waar het de ontvangen gegevens naartoe moet sturen. Aangezien we ELK gebruiken, is Elasticsearch de uitvoer. In deze configuratie gaan we ervan uit dat het op dezelfde machine (localhost) draait en op poort 9200.

  • Ga naar /etc/logstash/conf.d/
  • Maak een nieuw bestand genaamd 10-elasticsearch-output.conf
  • Gebruik deze inhoud;
output {
  elasticsearch {
    hosts => ["localhost:9200"]
    manage_template => false
    document_type => "%{[@metadata][type]}"
  }
}

Filter

Het derde element is een filter; de binnenkomende data moet door Logstash worden begrepen, dus moeten we aangeven in welk formaat het data kan verwachten. Dit gebeurt met behulp van een regex-achtige syntaxis genaamd grok. Ik heb twee groks geschreven (voor Magento 1 en Magento 2). Er is een geweldig hulpmiddel om je groks te testen; Grok Constructor Matcher.

  • Ga naar /etc/logstash/conf.d/
  • Maak een nieuw bestand genaamd 20-magento-filter.conf
  • Gebruik deze inhoud;
filter {
  if [type] == "magento2" {
    grok {
      match => { "message" => "\[%{TIMESTAMP_ISO8601:timestamp}\] %{DATA:log_level}: %{GREEDYDATA:message}"}
      add_field => [ "received_at", "%{@timestamp}" ]
    }
  }
  if [type] == "magento1" {
    grok {
      match => { "message" => "%{TIMESTAMP_ISO8601:date} %{DATA:log_level} \([0-9]+\): %{GREEDYDATA:message}"}
      add_field => [ "received_at", "%{@timestamp}" ]
    }
  }
}

Let op; dit is alleen voor system.log en houdt geen rekening met meerregelige logboekinvoeren. Je kunt een meerregelige logboekinvoer grok voor Magento hier vinden.

Test je Logstash-configuratie met service logstash configtest. Als je Configuration OK ziet, voer dan service logstash restart uit. Controleer of het luistert op poort 5034 met sudo lsof -i:5043. Het zou iets moeten zeggen als;

COMMAND  PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
java    2737 logstash   16u  IPv6  54468      0t0  TCP *:5043 (LISTEN)

Het instellen van je productie server

Nu moeten we je productie server instellen om data naar Logstash te verzenden.

  • Maak een map waar je log-courier gerelateerde instellingen opslaat, zoals ~/log-courier/
  • Maak een config.json bestand in die map met deze inhoud;
{
	"general": {
		"admin enabled": true
	},
	"network": {
		"servers": [ "ELK-IP-ADDRESS:5043" ],
		"ssl ca": "/absolute/path/to/your/log-courier/logstash.cer"
	},
	"files": [
		{
			"paths": [ "/path/to/magento2/var/log/*.log" ],
			"fields": { "type": "magento2" }
		}
	]
}
  • Verander het pad naar je Magento var/log map
  • Verander het type naar magento1 als je Magento 1 gebruikt (dit komt overeen met de typen die zijn ingesteld in het filterbestand dat je eerder hebt gemaakt)
  • Wijzig ELK-IP-ADDRESS naar de hostnaam of het IP-adres van je ELK-stack
  • Schakel desgewenst beheer uit door true te veranderen in false
  • Kopieer het Logstash-certificaat van je ELK-stack naar ~/log-courier/logstash.cer (in mijn voorbeeld was het pad van het certificaat op de ELK-stack /etc/pki/tls/certs/logstash-forwarder.crt)
  • Start log-courier handmatig vanaf de CLI door log-courier -config ~/log-courier/config.json & uit te voeren

Opmerking: het beheertool helpt je te begrijpen wat er aan de hand is wanneer iets niet werkt. Zie deze Github-pagina om te zien wat het kan doen en hoe het werkt.

Configureren van Kibana

Ik zal kort ingaan op het configureren van Kibana, omdat er veel informatie beschikbaar is over hoe je het kunt configureren en het grotendeels afhangt van je gebruiksscenario.

  • Open Kibana door naar je ELK-hostnaam te gaan met de browser
  • Ga naar Instellingen en typ onder 'Indexnaam of patroon' 'logstash-'.
  • Klik op Aanmaken
  • Ga naar het tabblad Ontdekken en je zou potentiële logs moeten zien binnenkomen

Probleemoplossing

Als je geen logs ziet binnenkomen, zorg er dan voor dat er logs zijn door het geconfigureerde map op je productie server te controleren. Als dat het geval is, SSH dan naar je ELK-stack en voer sudo lsof -i:5043 uit. Als er een verbinding is opgezet van je productie server naar je ELK-stack, zou je zoiets moeten zien;

COMMAND  PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
java    2737 logstash   16u  IPv6  54468      0t0  TCP *:5043 (LISTEN)
java    2737 logstash   41u  IPv6  55003      0t0  TCP ELK-IP-ADDRESS:5043->ELK-IP-ADDRESS:40176 (ESTABLISHED)
java    2737 logstash   45u  IPv6  54474      0t0  TCP ELK-IP-ADDRESS:5043->ELK-IP-ADDRESS:56348 (ESTABLISHED)

Je kunt hetzelfde commando voor poorten 9200 en 5601 uitvoeren om respectievelijk Elasticsearch en Kibana te controleren.

Als er geen verbinding is, controleer dan of Logstash echt draait met ps aux | grep -i logstash. Als het niet draait, controleer de fout- en logbestanden van Logstash in /var/log/logstash/logstash.err en /var/log/logstash/logstash.log.

Als er logs zijn en er is een verbinding en er komen geen logs in Kibana, kun je deze dingen controleren;

  • Controleer je grok-patronen. Als er niets overeenkomt, verschijnt er niets
  • Voer status uit in lc-admin op je productie server om te zien of het lijnen verwerkt
  • Controleer je indexpatroon in Kibana

Installeer cron op Hypernode

Omdat Hypernode een beheerde hostingoplossing is, kunnen we de standaardconfiguratie niet aanpassen. We moeten log-courier handmatig starten. Dit betekent ook dat het niet automatisch wordt gestart bij een eventuele herstart van het systeem. Daarom moeten we een cron instellen om ervoor te zorgen dat log-courier wordt uitgevoerd.

  • Voeg dit toe aan je crontab; */30 * * * * flock -n ~/.log-courier.lock -c 'log-courier -config /absolute/path/to/your/log-courier/config.json &'
  • Zorg ervoor dat je directory voor log-courier niet ~/.log-courier is (let op de punt) aangezien dit een bestand is dat log-courier aanmaakt bij het uitvoeren
  • Zorg ervoor dat het certificaatbestand in config.json absoluut wordt gerefereerd

Veel succes!