Zadanie 1001: Analizator Logów Serwera

CHash
Priorytet: Normalny Szkic

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

  1. Utwórz nowy projekt konsolowy.
  2. Wczytaj zawartość pliku logs.txt do tablicy napisów.
  3. 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

  1. Przejdź pętlą przez wszystkie linie.
  2. 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!).
  3. Użyj Dictionary<string, int>, aby zliczyć ile razy wystąpił każdy kod.
  4. Wyświetl raport:
    Raport kodów błędów:
    200: 3 razy
    404: 2 razy
    500: 1 raz
    

Krok 3: Namierzanie podejrzanego (IP)

  1. Zmodyfikuj pętlę, aby zliczać również wystąpienia adresów IP.
  2. Znajdź adres IP, który pojawia się najczęściej.
  3. Wyświetl ten adres jako "Najbardziej aktywny użytkownik".

Krok 4: Wytrzymałość (Error Handling)

  1. Dodaj do pliku logs.txt (ręcznie) jedną uszkodzoną linię, np. "To jest błędna linia bez formatu".
  2. Uruchom program - powinien się wysypać ("Unhandled Exception").
  3. Otocz kluczowy kod blokiem try-catch, aby program pomijał błędne linie i wypisywał w konsoli ostrzeżenie: "Pominięto uszkodzoną linię nr X".
  4. 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

  1. Kod kompiluje się i uruchamia bez błędów.
  2. Program poprawnie zlicza kody błędów i IP.
  3. Program nie kończy działania awarią w przypadku uszkodzonej linii w logu.
  4. Kod jest czytelny i sformatowany.
  5. 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"