Antwort A: OpenAI GPT-5.4
import re from collections import defaultdict def analyze_logs(log_data): """ Parse a multi-line log string and return a summary dictionary with: - counts_by_level: counts of log entries by uppercase log level - successful_logins: unique usernames that successfully logged in - failed_login_ips: counts of failed login attempts by IP address Malformed or irrelevant lines are ignored. """ counts_by_level = defaultdict(int) successful_logins = set() failed_login_ips = defaultdict(int) # Matches lines like: [TIMESTAMP] LEVEL: MESSAGE log_line_pattern = re.compi...
Vollstandige Antwort anzeigen ▼
import re from collections import defaultdict def analyze_logs(log_data): """ Parse a multi-line log string and return a summary dictionary with: - counts_by_level: counts of log entries by uppercase log level - successful_logins: unique usernames that successfully logged in - failed_login_ips: counts of failed login attempts by IP address Malformed or irrelevant lines are ignored. """ counts_by_level = defaultdict(int) successful_logins = set() failed_login_ips = defaultdict(int) # Matches lines like: [TIMESTAMP] LEVEL: MESSAGE log_line_pattern = re.compile( r"^\ между(?P<timestamp>[^\]]+)\]\s+(?P<level>[A-Za-z]+)\s*:\s*(?P<message>.*)$" ) # Successful login example: User 'alice' logged in from IP '192.168.1.10' success_pattern = re.compile( r"User\s+'([^']+)'\s+logged\s+in\b", re.IGNORECASE, ) # Failed login example: Failed login attempt for user 'bob' from IP '203.0.113.5' failed_pattern = re.compile( r"Failed\s+login\s+attempt\s+for\s+user\s+'[^']+'\s+from\s+IP\s+'([^']+)'", re.IGNORECASE, ) if not isinstance(log_data, str): return { "counts_by_level": {}, "successful_logins": [], "failed_login_ips": {}, } for line in log_data.splitlines(): line = line.strip() if not line: continue match = log_line_pattern.match(line) if not match: continue level = match.group("level").upper() message = match.group("message") counts_by_level[level] += 1 success_match = success_pattern.search(message) if success_match: successful_logins.add(success_match.group(1)) failed_match = failed_pattern.search(message) if failed_match: failed_login_ips[failed_match.group(1)] += 1 return { "counts_by_level": dict(counts_by_level), "successful_logins": sorted(successful_logins), "failed_login_ips": dict(failed_login_ips), } # Example usage: if __name__ == "__main__": sample_logs = """ [2023-10-27T10:00:00Z] INFO: Server starting up. [2023-10-27T10:01:00Z] INFO: User 'alice' logged in from IP '192.168.1.10' [2023-10-27T10:02:30Z] WARN: Failed login attempt for user 'bob' from IP '203.0.113.5' This is not a valid log line and should be ignored. [2023-10-27T10:03:00Z] error: Database connection failed. [2023-10-27T10:05:00Z] INFO: User 'alice' accessed resource '/dashboard' [2023-10-27T10:06:00Z] WARN: Failed login attempt for user 'eve' from IP '203.0.113.5' [2023-10-27T10:07:00Z] INFO: User 'charlie' logged in from IP '198.51.100.2'""" print(analyze_logs(sample_logs))
Ergebnis
Siegstimmen
3 / 3
Durchschnittsscore
Gesamtpunktzahl
Gesamtkommentar
Antwort A bietet eine äußerst robuste und gut durchdachte Lösung. Sie implementiert die gesamte Parsing-Logik korrekt, behandelt die Groß-/Kleinschreibung von Protokollstufen und verwendet `re.IGNORECASE` für das Parsen von Nachrichten, was sie unempfindlich gegenüber Variationen macht. Die Verwendung von `defaultdict` und `set` ist effizient und Python-typisch. Sie enthält auch eine Überprüfung des Eingabetyps und sortiert die erfolgreichen Anmeldungen für eine konsistente Ausgabe, was auf Liebe zum Detail und Best Practices schließen lässt.
Bewertungsdetails anzeigen ▼
Korrektheit
Gewichtung 35%Antwort A ist vollständig korrekt, analysiert alle Protokollkomponenten genau und aggregiert die Daten wie erforderlich. Sie behandelt die Groß-/Kleinschreibung von Protokollstufen korrekt und verwendet `re.IGNORECASE` für Nachrichtenmuster, um eine robuste Übereinstimmung zu gewährleisten.
Vollstandigkeit
Gewichtung 20%Antwort A implementiert alle erforderlichen Funktionen vollständig, einschließlich der robusten Analyse von Protokollzeilen, der zählenden Erfassung von Protokollstufen unabhängig von der Groß-/Kleinschreibung und der genauen Extraktion von Details zu erfolgreichen/fehlgeschlagenen Anmeldungen. Sie enthält auch eine Überprüfung des Eingabetyps zur Erhöhung der Vollständigkeit.
Codequalitat
Gewichtung 20%Antwort A weist eine ausgezeichnete Codequalität auf. Sie verwendet `defaultdict` und `set` für eine effiziente Datenaggregation, `re.compile` für die Regex-Effizienz, benannte Gruppen für die Lesbarkeit und `re.IGNORECASE` für eine robuste Mustererkennung. Der Code ist sauber, gut strukturiert und enthält einen hilfreichen Docstring.
Praktischer Nutzen
Gewichtung 15%Antwort A hat aufgrund ihres robusten Designs einen hohen praktischen Wert. Sie kann verschiedene Formate von Protokollzeilen verarbeiten, einschließlich Groß-/Kleinschreibungsunterschieden in Nachrichten, und verwaltet fehlerhafte Zeilen und nicht-Zeichenketten-Eingaben ordnungsgemäß, was sie für reale Protokollanalyse-Szenarien geeignet macht.
Befolgung der Anweisungen
Gewichtung 10%Antwort A folgt allen Anweisungen präzise. Sie behandelt die Groß-/Kleinschreibung von Protokollstufen korrekt und ignoriert robust fehlerhafte Zeilen. Die Verwendung von `re.IGNORECASE` für Nachrichtenmuster, obwohl nicht explizit für Nachrichten angegeben, entspricht der Anforderung der 'Robustheit'. Sie verwendet auch geeignete Datenstrukturen und sortiert die endgültige Liste zur Konsistenz.
Gesamtpunktzahl
Gesamtkommentar
Bietet eine robuste, korrekte Implementierung mit klarer Regex-basierter Analyse, fallunabhängiger Normalisierung von Leveln und ordentlichem Überspringen fehlerhafter Zeilen. Verwendet geeignete Datenstrukturen (defaultdict, set) und gibt einfache Dictionaries zurück. Kleinere Anmerkung: gibt sortierte erfolgreiche Logins zurück (nicht erforderlich) und enthält Beispielverwendung über die geforderte Funktion hinaus, aber das beeinträchtigt die Kernanforderungen nicht.
Bewertungsdetails anzeigen ▼
Korrektheit
Gewichtung 35%Extrahiert korrekt Großbuchstaben-Log-Level, zählt sie, findet eindeutige erfolgreiche Login-Benutzernamen und zählt fehlgeschlagene Login-IPs; Muster stimmen mit der Aufforderung überein und behandeln Groß-/Kleinschreibungsunterschiede in Nachrichten.
Vollstandigkeit
Gewichtung 20%Deckt alle erforderlichen Ausgaben ab und ignoriert explizit fehlerhafte Zeilen; behandelt auch Nicht-String-Eingaben, indem es eine leere Zusammenfassung zurückgibt.
Codequalitat
Gewichtung 20%Gut strukturiert mit benannten, kompilierten Regexes und geeigneten Sammlungen; lesbar und wartbar. Leichte Überdehnung mit zusätzlichem Beispiel-Hauptblock und unnötiger Sortierung von Benutzernamen (obwohl harmlos).
Praktischer Nutzen
Gewichtung 15%Praktisch für echte Logs: behandelt sicher Groß-/Kleinschreibungsunterschiede, fehlerhafte Zeilen und Nicht-String-Eingaben; Ein-Durchlauf-Verarbeitung und sinnvolle Datenstrukturen.
Befolgung der Anweisungen
Gewichtung 10%Implementiert die angeforderte Funktion und das Verhalten, einschließlich fallunabhängiger Level-Analyse und ordentlichem Ignorieren fehlerhafter Zeilen; gibt die erforderlichen Schlüssel zurück. Fügt Beispielverwendung hinzu, aber das steht nicht im Widerspruch zu den Anforderungen.
Gesamtpunktzahl
Gesamtkommentar
Antwort A ist eine gut strukturierte, korrekte und robuste Lösung. Sie verwendet benannte Gruppen in Regex für Lesbarkeit, defaultdict für saubereres Zählen, kompiliert Regex-Muster außerhalb der Schleife für Effizienz, beinhaltet Eingabetypvalidierung, sortiert die successful_logins-Liste für deterministische Ausgabe, konvertiert defaultdicts zurück in reguläre Dictionaries für saubere Ausgabe und enthält einen umfassenden Docstring sowie ein Beispiel für die Verwendung. Die Verwendung von re.IGNORECASE auf die Login-Muster erhöht die Robustheit zusätzlich. Der Code ist sauber und produktionsreif.
Bewertungsdetails anzeigen ▼
Korrektheit
Gewichtung 35%Liefert korrekte Ergebnisse für die Beispiel-Eingabe und behandelt Randfälle gut. Die Regex-Muster sind gut ausgearbeitet mit benannten Gruppen und Flags für Groß-/Kleinschreibung. Die Eingabetypvalidierung erhöht die Korrektheit bei unerwarteten Eingaben.
Vollstandigkeit
Gewichtung 20%Behandelt alle erforderlichen Funktionen: counts_by_level, successful_logins (eindeutig, sortiert), failed_login_ips. Behandelt auch nicht-Zeichenketten-Eingaben, leere Zeilen und fehlerhafte Zeilen. Enthält Beispielverwendung mit __main__-Block.
Codequalitat
Gewichtung 20%Hervorragende Codequalität: kompilierte Regex-Muster für Effizienz, benannte Gruppen für Lesbarkeit, defaultdict für sauberes Zählen, umfassender Docstring, sortierte Ausgabe für Determinismus, korrekte Konvertierung von defaultdicts in reguläre Dictionaries und saubere Trennung der Verantwortlichkeiten.
Praktischer Nutzen
Gewichtung 15%Sehr praktisch: Robuste Eingabevalidierung, deterministische sortierte Ausgabe, effiziente kompilierte Regex und Beispielverwendung machen sie produktionsreif. Die re.IGNORECASE-Flags bei den Login-Mustern erhöhen die reale Robustheit.
Befolgung der Anweisungen
Gewichtung 10%Folgt allen Anweisungen präzise: korrekte Funktionssignatur, korrektes Ausgabeformat mit allen drei Schlüsseln, Groß-/Kleinschreibung-unabhängige Level-Analyse, gespeichert als Großbuchstaben, eindeutige Benutzernamen als Liste, fehlerfreie Behandlung von fehlerhaften Zeilen und Verwendung von Regex wie empfohlen.