Erstellen eines einfachen Berichts
Für unsere letzte Aufgabe erstellen wir einen einfachen HTML-Bericht, der einige wichtige Informationen aus unserer Protokolldatei zusammenfasst. Wir verwenden dafür ein AWK-Skript, das in einer separaten Datei gespeichert ist.
Dieser Schritt kombiniert mehrere AWK-Konzepte aus den vorherigen Abschnitten:
- Zähler wie
total++
- Arrays wie
ip_count[$3]++
- einen
END-Block, der die endgültige Zusammenfassung ausgibt
Wenn das Skript auf den ersten Blick lang erscheint, konzentrieren Sie sich auf einen Block nach dem anderen. Sie müssen nicht die gesamte Datei auswendig lernen, bevor Sie sie ausführen.
Erstellen Sie zunächst eine Datei namens log_report.awk mit folgendem Inhalt:
Tipps: Kopieren Sie den untenstehenden Inhalt und fügen Sie ihn in Ihr Terminal ein, um die Datei zu erstellen.
cat << 'EOF' > log_report.awk
BEGIN {
print "<html><body>"
print "<h1>Server Log Summary</h1>"
total = 0
errors = 0
}
{
total++
if ($6 >= 400) errors++
ip_count[$3]++
resource_count[$5]++
}
END {
print "<p>Total requests: " total "</p>"
print "<p>Error rate: " (errors/total) * 100 "%</p>"
print "<h2>Top 5 IP Addresses</h2>"
print "<ul>"
for (ip in ip_count) {
top_ips[ip] = ip_count[ip]
}
n = asort(top_ips, sorted_ips, "@val_num_desc")
for (i = 1; i <= 5 && i <= n; i++) {
for (ip in ip_count) {
if (ip_count[ip] == sorted_ips[i]) {
print "<li>" ip ": " ip_count[ip] " requests</li>"
break
}
}
}
print "</ul>"
print "<h2>Top 5 Requested Resources</h2>"
print "<ul>"
for (resource in resource_count) {
top_resources[resource] = resource_count[resource]
}
n = asort(top_resources, sorted_resources, "@val_num_desc")
for (i = 1; i <= 5 && i <= n; i++) {
for (resource in resource_count) {
if (resource_count[resource] == sorted_resources[i]) {
print "<li>" resource ": " resource_count[resource] " requests</li>"
break
}
}
}
print "</ul>"
print "</body></html>"
}
EOF
Lassen Sie uns dieses AWK-Skript Abschnitt für Abschnitt verstehen:
-
BEGIN-Block: Wird vor der Verarbeitung von Eingabezeilen ausgeführt
BEGIN {
print "<html><body>" ## HTML-Struktur starten
print "<h1>Server Log Summary</h1>"
total = 0 ## Zähler für Gesamtanfragen initialisieren
errors = 0 ## Zähler für fehlerhafte Anfragen initialisieren
}
-
Hauptverarbeitungsblock: Wird für jede Zeile der Eingabedatei ausgeführt
{
total++ ## Gesamtanfragen-Zähler erhöhen
if ($6 >= 400) errors++ ## Fehlerhafte Antworten zählen (Statuscodes >= 400)
ip_count[$3]++ ## Anfragen nach IP-Adresse zählen (Feld 3)
resource_count[$5]++ ## Anfragen nach Ressource zählen (Feld 5)
}
-
END-Block: Wird nach der Verarbeitung aller Eingabezeilen ausgeführt
END {
## Zusammenfassende Statistiken ausgeben
print "<p>Total requests: " total "</p>"
print "<p>Error rate: " (errors/total) * 100 "%</p>"
## Top 5 IP-Adressen verarbeiten und ausgeben
## ...
## Top 5 angeforderte Ressourcen verarbeiten und ausgeben
## ...
print "</body></html>" ## HTML-Struktur beenden
}
Bevor wir fortfahren, beachten Sie den allgemeinen Ablauf:
BEGIN gibt die öffnenden HTML-Tags aus und initialisiert die Zähler.
- Der mittlere Block verarbeitet jede Protokollzeile und aktualisiert die Summen.
END gibt den endgültigen Bericht aus, nachdem jede Zeile analysiert wurde.
Lassen Sie uns die Sortierlogik für die Top-IPs untersuchen (der Ressourcen-Abschnitt funktioniert genauso):
## Die Zähler zur Sortierung in ein neues Array kopieren
for (ip in ip_count) {
top_ips[ip] = ip_count[ip]
}
## Das Array nach Wert in absteigender Reihenfolge sortieren
n = asort(top_ips, sorted_ips, "@val_num_desc")
## Die Top 5 Einträge ausgeben
for (i = 1; i <= 5 && i <= n; i++) {
## Die ursprüngliche IP finden, die zu dieser Anzahl passt
for (ip in ip_count) {
if (ip_count[ip] == sorted_ips[i]) {
print "<li>" ip ": " ip_count[ip] " requests</li>"
break
}
}
}
In diesem Skript:
- sortiert die Funktion
asort() das Array
- ist
"@val_num_desc" ein spezielles Argument, das anweist, numerisch nach Wert in absteigender Reihenfolge zu sortieren
- finden die verschachtelten Schleifen die Top 5 Einträge und geben sie aus
Sie können sich die verschachtelten Schleifen so vorstellen:
- die erste Schleife entscheidet, welche Zähler zu den Top 5 gehören
- die zweite Schleife findet heraus, welche IP-Adresse oder Ressource die jeweilige Anzahl erzeugt hat
Dieses Suchmuster ist fortgeschrittener als die vorherigen Schritte; es ist also völlig normal, wenn sich dies als der erste Teil des Labs anfühlt, der echtes Scripting statt eines Einzeilers ist.
Lassen Sie uns nun unser AWK-Skript ausführen, um den Bericht zu generieren:
awk -f log_report.awk server_logs.txt > log_report.html
Die Option -f weist AWK an, das Skript aus der angegebenen Datei zu lesen:
-f log_report.awk - Liest das AWK-Skript aus der Datei log_report.awk
server_logs.txt - Verarbeitet diese Datei mit dem Skript
> log_report.html - Leitet die Ausgabe in die Datei log_report.html um
Sie können den Inhalt des Berichts mit dem cat-Befehl anzeigen:
cat log_report.html
Wenn die HTML-Ausgabe im Terminal schwer zu lesen ist, sehen Sie sich zuerst nur den ersten Teil an:
head -n 15 log_report.html
Dieser Bericht bietet eine Zusammenfassung der Gesamtanfragen, der Fehlerrate, der Top 5 IP-Adressen und der Top 5 angeforderten Ressourcen. In einem realen Szenario könnten Sie diese HTML-Datei in einem Webbrowser öffnen, um eine formatierte Ansicht zu erhalten.
Der Ansatz, den wir in diesem Skript verwendet haben, zeigt, wie AWK für komplexere Datenanalyseaufgaben eingesetzt werden kann. Sie können dieses Skript erweitern, um zusätzliche Statistiken oder andere Visualisierungen basierend auf Ihren spezifischen Anforderungen einzufügen.