🧭 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,grepundsedkomplexe 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