Zadanie 1001: Analizator Logów Serwera
Zadanie 1001: Analizator Logów Serwera (Przetwarzanie tekstu i kolekcje)
Wstęp
W codziennej pracy programisty backendowego często spotkasz się z koniecznością analizy gigantycznych plików tekstowych – logów serwera. Musisz umieć szybko wyciągnąć z nich kluczowe informacje: "Ile razy wystąpił błąd?", "Kto atakuje nasz serwer?". W tym zadaniu wcielisz się w rolę administratora systemu, który musi napisać narzędzie do raportowania incydentów.
Plik z danymi: logs.txt
[!IMPORTANT] Pamiętaj: To zadanie symuluje realny problem. Kod, który napiszesz, jest bardzo zbliżony do tego, co faktycznie robi się w firmach (tzw. parsing logów).
Teoria i Narzędzia
Oto Twój niezbędnik C# do wykonania tego zadania:
1. Czytanie pliku (File.ReadAllLines)
Najprostszy sposób na wczytanie pliku tekstowego linia po linii do tablicy stringów.
string[] lines = File.ReadAllLines("logs.txt");
foreach (string line in lines)
{
Console.WriteLine(line);
}
2. Dzielenie tekstu (Split)
Aby "pokroić" linię tekstu na kawałki, używamy metody Split.
string linia = "[2023] 192.168.1.1 Error";
string[] czesci = linia.Split(' '); // Dzielimy po spacji
// czesci[0] -> "[2023]"
// czesci[1] -> "192.168.1.1"
3. Słowniki (Dictionary<TKey, TValue>)
Idealne do zliczania wystąpień. Kluczem będzie np. kod błędu, a wartością - liczba wystąpień.
Dictionary<string, int> stats = new Dictionary<string, int>();
if (stats.ContainsKey("404"))
{
stats["404"]++; // Zwiększamy licznik
}
else
{
stats.Add("404", 1); // Pierwsze wystąpienie
}
4. Obsługa wyjątków (try-catch)
Pliki bywają uszkodzone. Dobry programista jest na to gotowy.
try
{
// Kod, który może wywołać błąd (np. brak pliku)
string[] lines = File.ReadAllLines("nieistnieje.txt");
}
catch (FileNotFoundException ex)
{
Console.WriteLine("Błąd: Nie znaleziono pliku!");
}
catch (Exception ex)
{
Console.WriteLine("Wystąpił nieoczekiwany błąd: " + ex.Message);
}
Zadanie do wykonania
Skorzystaj z przygotowanego pliku logs.txt, który znajduje się w katalogu zadania.
Krok 1: Wczytanie danych
- Utwórz nowy projekt konsolowy.
- Wczytaj zawartość pliku
logs.txtdo tablicy napisów. - Wyświetl w konsoli liczbę wczytanych linii, aby upewnić się, że plik został poprawnie odczytany.
Pamiętaj o
using System.IO;
Krok 2: Analiza kodów błędów
- Przejdź pętlą przez wszystkie linie.
- Z każdej linii wyciągnij kod statusu HTTP (np. 200, 404, 500). W naszym formacie jest to zazwyczaj trzeci element po rozdzieleniu spacją (ale sprawdź to dokładnie!).
- Użyj
Dictionary<string, int>, aby zliczyć ile razy wystąpił każdy kod. - Wyświetl raport:
Raport kodów błędów: 200: 3 razy 404: 2 razy 500: 1 raz
Krok 3: Namierzanie podejrzanego (IP)
- Zmodyfikuj pętlę, aby zliczać również wystąpienia adresów IP.
- Znajdź adres IP, który pojawia się najczęściej.
- Wyświetl ten adres jako "Najbardziej aktywny użytkownik".
Krok 4: Wytrzymałość (Error Handling)
- Dodaj do pliku
logs.txt(ręcznie) jedną uszkodzoną linię, np. "To jest błędna linia bez formatu". - Uruchom program - powinien się wysypać ("Unhandled Exception").
- Otocz kluczowy kod blokiem
try-catch, aby program pomijał błędne linie i wypisywał w konsoli ostrzeżenie: "Pominięto uszkodzoną linię nr X". - Program musi dokończyć analizę reszty pliku mimo błędu jednej linii.
Bonus: Zapis raportu
Zapisz wygenerowane statystyki do nowego pliku report.txt zamiast (lub oprócz) wyświetlania ich w konsoli.
Warunki zaliczenia
- Kod kompiluje się i uruchamia bez błędów.
- Program poprawnie zlicza kody błędów i IP.
- Program nie kończy działania awarią w przypadku uszkodzonej linii w logu.
- Kod jest czytelny i sformatowany.
- Historia zmian jest zapisana w Git.
Git - Instrukcja
Pamiętaj o regularnych commitach!
# Po wczytaniu pliku
git add .
git commit -m "Zadanie 1001: Wczytanie pliku logow"
# Po zaimplementowaniu zliczania kodów
git add .
git commit -m "Zadanie 1001: Logika zliczania kodow HTTP"
# Po dodaniu obsługi błędów
git add .
git commit -m "Zadanie 1001: Obsluga uszkodzonych linii try-catch"
# Finalnie
git add .
git commit -m "Zadanie 1001: Gotowe"