🧭 Pfad 27: Shaolin Logfile Analyse

Subtitle: Die Kunst des Einzeilers
Pfad: 27 von 27
Schwierigkeit: ⭐⭐⭐⭐ (4-5)
Zeit: ~2 Stunden
Voraussetzungen: Pfad 13: Pipes & Filters

"Wenn der Schnee im Wald angekommen ist, sieht man die Spuren am deutlichsten." ❄️


📋 Was du in diesem Pfad lernst

✓ Logfiles wie ein Shaolin-Meister lesen
✓ Angriffe isolieren und analysieren
✓ Performance-Engpässe finden
✓ Eigene Zeitreihen-Analyse-Tools bauen

🎯 Lernziele

Nach diesem Pfad kannst du:

  • [ ] Mit awk, grep und sed komplexe Analysen fahren
  • [ ] Antwortzeiten von Requests statistisch auswerten (Perzentile)
  • [ ] DDOS- oder Brute-Force-Attacken in Echtzeit erkennen
  • [ ] Verstehen, warum "weniger mehr ist" (The Power of One-Liners)

🌱 Die Philosophie: Shaolin im Rechenzentrum

Nach den ersten Wochen im Rechenzentrum, wenn die GUI-Tools langsam und die Dashboards überladen wirken, wird Pfad 27 geboren. Du hast gelernt, Systeme zu bauen (Samurai), jetzt lernst du, sie zu verstehen, indem du durch sie hindurchsiehst.

Da man in der Regel nicht mehr braucht und alle bestehen Kapitel durchgearbeitet hat, bleiben am Ende nur noch die berühmten Einzeiler übrig. Präzise. Tödlich effizient.


🔧 Werkzeuge des Meisters

1. Der schnelle Blick (awk)

Ein einfaches Wort zu awk. Es ist dein Skalpell.

# Zeige nur den 3. Wert und den letzten Wert einer Zeile
echo "a quick word about awk" | awk '{print $3 " " $NF}'
# Output: word awk

🛡️ Szenario: Der alltägliche Angriff

Wer schickt da die ganze Zeit Requests? Warum ist der Server Load so hoch?
Hier sind die Befehle, um einen Angriff zu isolieren.

Analyse der Antwortzeiten (Time Range Distribution)

Wir wollen wissen: Wie viele Requests sind langsam?

Erstelle dir ein Script time_range_access_logs.sh:

#!/bin/bash
# Usage: sh time_range_access_logs.sh access.log

RESULT_FILE=$1
echo "Date range analysis for: $RESULT_FILE"

# Zähle alle Requests (ignoriere Header/Elapsed Zeilen falls vorhanden)
TOTAL_REQ=`cat $RESULT_FILE | grep -v elapsed | wc -l`

echo "Total Requests : $TOTAL_REQ"

# AWK Magie zur Kategorisierung der Antwortzeiten (in Sekunden)
# Annahme: Das vorletzte Feld $(NF-1) ist die Antwortzeit in Sekunden
# Anpassung nötig je nach LogFormat!
awk -v treq="$TOTAL_REQ" '{
    # if ($(NF-1) < 0.5) ...
    val = $(NF-1)

    if (val < 0.5)
            a[1]++;
    else if(val >= 0.5 && val < 1)
            a[2]++;
    else if(val >= 1 && val < 2)
            a[3]++;
    else if(val >= 2 && val < 5)
            a[4]++;
    else if(val >= 5 && val < 10)
            a[5]++;
    else if(val >= 10 && val < 60)
            a[6]++;
    else if(val >= 60 && val < 300)
            a[7]++;
    else if(val >= 300)
            a[8]++;
} END {
    labels[1]="0 - 500 ms";
    labels[2]="500 ms - 1 sec";
    labels[3]="1 sec - 2 secs";
    labels[4]="2 secs - 5 secs";
    labels[5]="5 secs - 10 secs";
    labels[6]="10 secs - 60 secs";
    labels[7]="1 min -  5 mins";
    labels[8]="> 5 mins";

    for (i=1;i<=8;i++) {
        if (a[i] == "") a[i]=0;
        printf "%-20s , %d (%d%%)\n", labels[i], a[i], int(a[i]*100/treq)
    }
}' $RESULT_FILE

Ausführung:

$ sh time_range_access_logs.sh access.log
Date range analysis for: access.log
Total Requests : 800
0 - 500 ms           , 402 (50%)
500 ms - 1 sec       , 298 (37%)
1 sec - 2 secs       , 100 (12%)
2 secs - 5 secs      , 0 (0%)
...

Die 90. Perzentile (P90)

Der Durchschnitt lügt. Die P90-Metrik sagt dir, wie es 90% deiner User geht.

# Extrahiere Antwortzeiten, sortiere sie und finde den Wert bei 90% der Zeilen
csv=$1
# Annahme: $(NF-1) ist die Response Time
cat $csv | grep -v '^#' | awk '{print $(NF-1)}' | grep "[0-9]" | sort -n > /tmp/csv.$$
n=`cat /tmp/csv.$$ | wc -l`
p90=`echo "$n * 0.9" | bc | awk -F'.' '{print $1}'`

if [ -z "$p90" -o "$p90" == "0" ]; then
    p90=1
fi

PERCENTILE_90=`awk 'NR=='$p90 /tmp/csv.$$`

echo "PERCENTILE_90=$PERCENTILE_90"

rm /tmp/csv.$$

🔍 Forensik One-Liners

Wer verursacht die Last? (Requests vs Time)

Finde die teuersten URLs (Requests die länger als 1 Sekunde dauern).

cat access.log | awk 'BEGIN{time=0;cnt=0} {if ($(NF-1) > 1) {time+=$(NF-1); cnt++}} END{ print "Request: "$(NF-3) " Number of requests: "cnt " Average time: "time/cnt }'

Beispiel Output:

Request: /weather/gettempmonthly Number of requests: 100 Average time: 1.2

Top aufgerufene URLs

cat access.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -n

Beispiel Output:

100 /weather/gettemplocal
198 /weather/gettempweekly
201 /weather/gettempdaily

HTTP Status Code Verteilung

Wie gesund ist mein Server?

cat access.log | awk '{print "HTTP Response Code="$(NF-2)}' | sort | uniq -c

Beispiel Output:

637 HTTP Response Code=200
41  HTTP Response Code=401
71  HTTP Response Code=404
51  HTTP Response Code=500

User-Agent Analyse

Wer greift zu? Bots? Handys?

cat access.log | awk '{print "User-Agent="$(NF)}' | sort | uniq -c

Beispiel Output:

16  User-Agent=Android-xx
254 User-Agent=Chrome/xx
502 User-Agent=Mozilla/5.0

Kritische Fehler finden

grep "CRITICAL" /var/log/application.log | awk '{print $1}' | sort | uniq -c | sort -nr

Live-View ohne Noise

Healthchecks rausfiltern, um das echte Leben zu sehen.

tail -f /var/log/nginx/access.log | grep -v "healthcheck"

Der nützliche Alias

alias finderrors='grep -i "error" /var/log/app/*.log'

🦉 Crystal Owl's Weisheit

"Die allgegenwärtige Katze regelt präzise?" 😺

Wenn du diese Befehle beherrschst, brauchst du keine teuren Monitoring-Suiten, um das Feuer zu löschen. Du brauchst nur ein Terminal. Das ist der Weg.


Version: 1.0
Navigation:
← Zurück: Datenbanken | Zur Übersicht